이전글


표현언어(EL)에서 ${}과 #{} 표기법의 차이
표현언어(Expression Language)에는 ${}#{} 두가지 표기법이 있습니다. #{}표기법의 경우 JSP 2.1 버전에 추가된것으로 JSF(Java Server Faces)에서 사용됩니다.

${}의 경우 해석되는 즉시 해당 표현식의 값이 반영되므로 즉시 적용(immediate expression)이라 하며, #{}의 경우 해당 값이 쓰일때 해당 값이 적용되므로 지연 적용(deferred expression)이라 합니다.

이 차이를 알아보기 위해 다음의 예제를 참고해 보도록 하겠습니다. GIT 링크
<%
    MemberBean m = new MemberBean();
    m.setName("dololak");
    pageContext.setAttribute("mem", m);
%>
 
<c:set var="name" value="#{mem.name}"/>
 
<% 
    m.setName("dololak2"); 
%>
 
출력 : ${name}
cs


위의 예제에서는 JSTL Core<c:set> 기능을 통해 page영역에 name이라는 속성명으로 MemberBean객체의 name값을 설정하였습니다. 이 경우 name에는 dololak이 들어간다고 예상할 수 있습니다.

이후에 스크립트릿에서 m.setName()을 통해 dololak2를 name으로 세팅하지만 이미 page영역에는 dololak이 들어가 있기 때문에 MemberBean 객체의 name값 자체는 dololak2로 변경되었다고 하더라도 page 영역의 name속성에는 dololak이 들어있을것으로 예상됩니다.

마지막으로 ${name}로 page영역에 설정되어있는 name 속성값을 출력합니다. 결과는 어떨까요? 결과는 dololak2가 출력됩니다.








결과 분석
결과가 이렇게 나온 이유는 무엇일까요? 스크립트릿에서 수행한 m.setName("dololak2") 코드가 어떻게 page 영역에 세팅된 name 속성에 영향을 미쳤을까요?

그 이유는 EL 표현 방법 중 #{} 표기법을 사용하면 구문을 해석할때 값을 판단하는 것이 아닌 실제로 해당 값이 사용되는 시점에 해석되기 때문입니다. 만약 위의 예제를 ${}표기로 바꾸면 어떻게 될까요?
<%
    MemberBean m = new MemberBean();
    m.setName("dololak");
    pageContext.setAttribute("mem", m);
%>
 
<c:set var="name" value="${mem.name}"/>
<% m.setName("dololak2"); %>
 
출력 : ${name}
cs


결과는 처음과 다르게 dololak이 출력됩니다.



그 이유는${}의 경우 #{}표기법과는 다르게 구문이 해석되는 해당 시점의 값을 기준으로 판단하기 때문입니다. 아래의 구문을 해석할때 page영역의 name속성에는 그 당시 값인 dololak이 설정되는것입니다.
<c:set var="name" value="${mem.name}"/>
cs


결론
표현언어(EL)의 표기법에 따라 값이 해석되는 시점의 차이가 있습니다. 그러나 #{}의 경우 JSF(Java Server Faces)에서 사용되는 구문으로 거의 대부분의 경우에는 ${}표기를 사용하니 어렵게 고민할 필요는 없을것 같습니다.


다음글


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!

  • springboot 2021.04.27 05:20  댓글주소  수정/삭제  댓글쓰기

    정말 좋은 포스팅입니다

    jsp 를 쓰던 타임리프를 쓰던

    #와 $의 차이에서

    이거 명쾌하게 설명하는 사람 못봤어요