JSP에서 ${} 값은 어디서 오는가? (Spring MVC 구조 완전정리)

Spring 기반 웹 프로젝트를 하다 보면 JSP에서 ${}로 데이터를 출력하는 경우가 많다.
하지만 이 ${} 값이 어디서 오는지, 또 DB를 수정하지 않고 화면에서만 바꾸는 방법이 궁금할 때가 있다.
이 글에서는 그 과정을 단계별로 정리한다.


1. Spring MVC 구조 복습

Spring MVC는 기본적으로 다음과 같은 흐름으로 작동한다.

 
[브라우저 요청] -> [Controller] -> [Model + View(JSP/HTML)] ↓--> [브라우저 응답]
  • Controller : 요청을 받고 어떤 View를 보여줄지 결정한다.
  • Model : View로 전달할 데이터를 담는 객체 (model.addAttribute("key", value))
  • View (JSP) : Controller에서 전달받은 데이터를 출력한다.

즉, JSP에서 ${}로 접근 가능한 값은 대부분 Controller가 Model에 담아서 전달한 데이터이다.


2. JSP에서 ${}로 접근 가능한 데이터

JSP에서 ${}로 접근할 수 있는 데이터의 종류는 다음과 같다.

구분설명
Model 데이터 Controller에서 model.addAttribute("name", value)로 전달한 데이터
Session 데이터 session.setAttribute("name", value)로 저장된 세션 데이터

결국 ${}는 **서버에서 이미 준비된 데이터(읽기 전용)**를 JSP가 출력하는 구조이다.


3. include된 JSP의 ${}는 어디서 오는가

<jsp:include>로 포함된 JSP는 별도의 Controller를 타지 않는다.
자신을 include한 JSP가 렌더링될 때 전달된 Controller의 Model 데이터를 그대로 공유한다.

즉, include된 JSP는 새로운 Controller를 호출하지 않고,
현재 View에 전달된 Model 데이터를 그대로 사용한다.


4. Controller 추적 방법

include된 JSP가 어떤 Controller의 데이터를 사용하는지 확인하려면 다음 두 단계를 거치면 된다.

  1. Controller 반환값 확인
    • JSP는 직접 실행되지 않는다.
    • Controller가 return "samplePage";와 같이 JSP 이름을 리턴해야 렌더링이 시작된다.
    • 즉, JSP 파일명과 동일한 이름을 리턴하는 Controller를 찾는다.
  2. Model 데이터 추적
    • JSP에서 ${id}를 사용한다면,
      Controller 내에서 model.addAttribute("id", ...)가 선언된 부분을 찾으면 된다.

5. JSP에서 ${} 값 변경하기 (DB 반영 없이 화면만 수정)

실무에서는 DB 수정이 어렵거나 권한이 없는 경우, 단순히 화면에 보이는 값만 변경해야 할 때가 있다.
이 경우 JSP에서 출력되는 ${} 값을 JavaScript로 변경할 수 있다.

 

 
//예시
<c:forEach var="a" items="${list}" varStatus="st">
	<p id="b${st.index}">${a.b}</p>
</c:forEach>

//${a.b} 값 변경 코드
<script>
document.getElementById("b2").innerText = "변경된 값";
</script>

 

**주의할 점

<script>가 반드시 forEach 이후에 위치해야 한다는 것이다.
그 이유는 forEach가 아직 DOM에 렌더링되기 전에 JavaScript가 실행되면 요소를 찾을 수 없기 때문이다.


6. 정리

  • ${}는 JSP에서 EL(Expression Language)로, Model이나 Session 데이터를 출력하기 위한 문법이다.
  • include된 JSP는 별도의 Controller를 타지 않고, include한 JSP의 Model 데이터를 공유한다.
  • 화면에서만 값을 바꾸고 싶다면 JavaScript를 사용하면 되며, 이는 DB에는 영향을 주지 않는다.

 

+ Recent posts