관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

표현 언어와 JSTL 3 - 표현 언어로 내장 객체 접근하기 1 : 내장 객체의 종류와 속성 값에 대하여 본문

웹 · 앱 개발/JSP & Servlet

표현 언어와 JSTL 3 - 표현 언어로 내장 객체 접근하기 1 : 내장 객체의 종류와 속성 값에 대하여

huenuri 2024. 11. 29. 09:28

이번에는 표현 언어로 내장 객체를 접근하는 방법에 대해서 공부해 보겠다. 분량이 많아서 두 군데로 나누어서 학습일지를 작성해 볼 것이다.


 

 

 

 

표현 언어로 내장 객체 접근하기

JSP는 웹 애플리케이션을 구현하는 데 필요한 정보를 JSP 내장 객체(request, session 등)에 속성 값으로 저장해서 사용했다. 속성에 저장된 값을 표현 언어에서는 다음 표와 같은 형태로 접근해서 사용할 수 있다.

 

 

 

참고로 자바 코드로 내장 객체에 저장된 속성 값에 접근하면 코드가 길어지고 지저분해진다. 그래서 나온 것이 표현 언어이다. 본격적인 웹 프로그래밍을 위해서는 표현 언어로 간결한 코드를 작성해야 한다.

표현 언어는 JSTL과 함께 사용된다. JSTL을 표현 언어와 함께 사용하면 자바 코드보다 코드가 훨씬 간단해진다.

 

표현 언어는 표현식처럼 연산자와 피연산자의 조합을 ${ }로 둘러싸서 표현할 수 있지만 ${ }에 기술한 표현은 표현식과는 다른 의미로 해석된다.

 

 

표현식에 add를 기술하면 이를 자바의 변수 이름으로 인식한다. 반면 표현 언어에서 사용된 add는 속성 이름으로 인식한다. 속성이란 JSP 내장 객체에서 정보를 주고받기 위한 메서드로 관리되는 정보를 말한다. 다음은 내장 객체의 정보를 주고받기 위한 메서드 목록이다.

 

 

 

위 표에 언급된 메서드의 매개변수로 사용된 name은  String 객체의 형태이고, value는 java.lang.Object 객체의 형태이다. 또한 getAttribute(name)으로 얻어낸 값 역시 같은 객체 형태이다.

 

다음 예제는 JSP에서는 표현에만 집중하고 비즈니스 로직은 서블릿에서 구현하는 방식으로 작성한 것이다. 서블릿에서 합을 구하고 그 결과를 JSP에서 출력하는 것을 보여준다. JSP로만 웹 프로그래밍을 하는 것을 모델 1 방식이라고 한다. 모델 2에서는 서블릿에서 비즈니스 로직을 구현하고 JSP에서는 그 결과를 사용자에게 어떻게 보여줄 것인지만 표현한다.


 

 

 

 

 

[직접 해보기] 서블릿 클래스에서 두 수에 대한 합을 구해 JSP에서 출력하기

 

1. 두 수의 합을 구하는 서블릿 파일을 만들기

 

 

 

드디어 서블릿 파일을 만들었다. 이 파일로 작성하기 참 힘들었다. 노란줄이 뜨는 문제가 있는데 그 문제도 해결했다.

 

 

 

2. 서블릿에서 넘겨 준 숫자 두 개를 더한 결과를 출력하는 JSP 페이지 작성하기

 

 

 

서블릿으로 넘겨준 값을 얻어오기 위해서 자바 코드에서는 request.getAttribute("num1");와 같이 명확하게 request 객체의 속성 값을 얻어오지만 표현 언어에서는 ${num1}과 같이 표현했다. 표현 언어에서 ${} 안에 기술한 이름을 속성 이름으로 해석하기 때문이다.

즉 ${num1}은 서블릿 코드에서 request 객체의 setAttribute() 메서드를 호출하면서 지정한 num1이라는 이름에 저장한 20을 얻어오겠다는 의미이다.

 

 

JSP에서는 웹 애플리케이션에 사용 가능한 네 개의 내장 객체에 속성 값을 저장할 수 있다. 위 예제에서는 자주 사용하는 request 객체에 대해서 속성을 설정해 본 것이다.

나머지 내장 객체는 다음과 같다.

 

 

 

JSP 내장 객체가 표현 언어에서 어떻게 사용되는지 예를 들어 설명하겠다. 저장된 속성은 표현 언어의 내장 객체를 지정해야 한다. JSP 내장 객체인 pageContext에 저장된 속성값은 pageContext.getAttribute("num1");와 같이 기술해서 얻을 수 있다. 반면 표현 언어에서는 내장 객체 pageScope를 사용해서 ${pageScope.num1}와 같이 얻어온다.

 

 

 

이번에는 session에 저장된 속성 값을 얻어와보겠다.

 

 

앞에서 사용한 ${num1}은 서블릿 클래스인 AdditionServlet에서 request 내장 객체 속성을 저장하였기 때문에 request 영역에 있는 속성 값을 가져온 것이다. num1은 request에 저장한 속성이기 때문에 ${requestScope.num1}이라고 표현해야 한다. 내장 객체를 명시해서 속성을 지정하는 것이 혼동을 막을 수 있지만 생략하고 ${num1}이라고 기술할 수 있다.

표현 언어에서 내장 객체를 명시하지 않고 이와 같이 간단하게 표현하면 속성을 다음과 같은 순서로 자동으로 검색해서 속성 값을 얻어와 출력한다.

 

 

 

가장 협소한 범위 내에서 사용 가능한 pageScope 객체부터 속성을 찾아보다가 없으면 좀 더 넓은 범위 내에서 사용 가능한 requestScope 객체에서 찾는다.

동일한 속성 이름의 속성 값을 찾아오는 방법을 살펴보기 위해 4개의 내장 객체에 동일한 속성 이름으로 속성 값을 저장해 보자.

 

 

이 경우 어떻게 출력될까? 이름이 중복되지만 표현 언어에서는 이 경우 사용 범위 좁은 내장 객체에서부터 사용 범위가 넓은 내장 객체 순서로 속성 값을 찾아오도록 정해져 있다.

 

 

 

page 내장 객체의 사용 범위가 가장 좁고 application 내장 객체의 사용 범위가 가장 넓다. 그러므로 ${name}이라고 기술하면 page 속성에 저장된 "page man"이 출력된다.

하지만 이름 충돌에 의해 출력되지 못하는 다른 내장 객체에 저장된 속성 값 역시 모두 출력하고 싶은 경우에는 속성 이름 앞에 표현 언어의 내장 객체를 명시적으로 기술하면 된다.

 

 

requestScope를 속성 이름 앞에 덧붙이면 request 내장 객체에 저장한 "request man"이 출력된다.

 


 

 

 

학습을 마치고

새벽부터 아침이 조금 넘어서까지 JSP 공부를 진행했다. 이체 아침 일정이 있어서 공부는 여기서 마쳐야 할 것 같다. 9시에는 마치고 싶었는데 해야 할 것들이 많았다.

신기하게도 세 달 전에는 이해하지 못했던 내용이 지금은 이해가 되고 고개를 끄적일 수 있게 되었다. 정말 놀라운 발전인 것 같다. 그때는 무슨 말인지도 모르고 그냥 학습일지를 쓰며 프로젝트를 만들며 실행해보기도 했었다.