[정리] EL :: Basic

[출처] http://ethdemor.springnote.com/pages/4015477

선에서 "JSP는 자바 언어를 몰라도 된다" 라고 했던 말은 EL과 Java Bean을 염두해 두고 한 말이지 스크립틀릿을 두고 한 말은 아닙니다.

Jaba Bean과 Enterprise Java Bean은 또 다른 거라고 하더군요. EJB는 뭘까요?

Expression Language (표현식 언어)

아직까지는 html 안에 java 코딩을 하는 JSP가 많이 남아있지만, 점차 없어지는 추세라고 하는군요. 왜 그럴까요? 그건 다음과 같은 이유랍니다.

1) 웹 페이지 디자이너가 자바를 알 필요가 있을까?

2) JSP 안에 있는 자바 코드는 유지/보수 하기가 어렵다.

EL은 JSP를 사용할 경우 발생하는 위의 두 가지 문제점에 대한 해답입니다.

EL은 JSP 2.0 스펙에 공식적으로 포함되었으며, 스크립틀릿이나 표현식으로 했던 작업을 간편하게 할 수 있습니다. EL의 핵심은 자바 코딩을 다른 곳에 해놓고, EL을 사용해 호출하자는 거죠. 요즘 추세인 비지니스 로직(자바 프로그래머)과 프레젠테이션(디자이너)을 분리해서 각자 할 일을 확실하게 나누자는 거겠죠. 코드가 같은 파일에 들어 있다면 많은 애로사항이 있을 것도 같습니다. EL은 비 자바 개발자를 위해 만들어진 문법이지만 위의 두 가지 문제 중 두 번째 문제를 해결할 수 있다는 점에서 자바 개발자에게도 어필할 수 있죠.


문법이 '직관적'이다 라는게 어디서 부터 시작한 건지는 모르겠지만 어쩌면 그 시작이 XML 일지도 모르겠습니다. XML의 Extensible한 메타 언어이기 때문에 가지는 장점 중 하나는 바로 자기기술적(self-descriptive)이라는 겁니다. 한국말로 적당히 번역해 보자면 특별한 문법을 알지 못해도 직관적으로 눈에 읽히는 코드 라고 할 수 있습니다. (XSD 쪽으로 들어가면 이 의미도 많이 퇴색하긴 하지만 그래도 좀 낫죠.)


샘플 코드 #1 XML

  1. <note>

  2. <to>Tove</to>

    <from>Jani</from>

    <heading>Reminder</heading>

    <body>Don`t forget me this weekend!</body>

    </note>


샘플 코드 #2 HTML

  1. <html>
    <head>

    <title>Reminder</title>

    </head>

  2. <body>

    <p>to - Tove</p>

  3. <p>from - Jani</p>

  4. <p>tit.........젠장!

샘플 코드 #1 을 보고 각 태그가 무슨 의미를 담고 있는지 모르는 사람이 있을까요?

자바 코딩을 하지 못한다라.. 그냥 '하지맙시다' 라고 눈빛을 보내는 것 보다 항상 더 우아한 방법이 있죠.


web.xml

  1. <web-app ...>
  2. <jsp-config>

  3. <jsp-property-group>

  4. <url-pattern>*.jsp</url-pattern>

  5. <scripting-invalid>true</scripting-invalid>

  6. <el-ignored>true</el-ignored>

  7. </jsp-property-group>

  8. </jsp-config>

  9. </web-app>

이것이 <scripting-invalid> 관련 설정의
유일한 방법입니다. JSP 2.0 초안엔 <@ page> 속성으로 뭐가 있었다는데 하여간 최종안에선 사라졌습니다.

아래는 EL을 사용하지 않는다는 설정입니다. 디폴트는 false죠. (기존에 EL 문법처럼 어딘가 코딩을 해놨다면 그게 문제를 일으킬 수도 있지 않겠어요?)


  1. <%@ page isElIgnored="true" %>

이렇게 페이지 별로 따로 설정도 가능합니다. 페이지 지시자는 DD의 설정을 오버라이드 합니다.


<url-pattern> 값 지정으로 전체가 아닌 개별적인 jsp 파일도 지정 가능하다.


Action 태그의 단점은 빈의 프로퍼티가 기본 자료형(+문자열)이 아닐 때 금새 드러나 버립니다. 만약 Foo 객체가 프로퍼티로 Bar 클래스 객체를 가지고 있을 경우, getProperty를 한다면 객체기 때문에 toString()이 호출되겠죠. Bar의 속성에 접근할 수 있는 방법이 없습니다. 그럼 다시 스크립팅의 세계로 가야하느냐.. 답은 EL 입니다.


간단한 한 줄 비교 코드 # 1

  1. Scriptlet: <%= foo.getBar().getName() %>
  2. ActionTag: <jsp:getProperty id="foo" property="bar" /> <!-- 이게 한계. bar.name 하면 에러! -->
  3. EL: ${foo.bar.name}


이렇게 보면 Scriptlet이나 EL이나 별 다른 점이 없어 보이지만, 만약 저 foo 객체가 바인딩되서 넘아온다면 코드가 어떻게 바뀔까요?


  1. Scriptlet: <%= ((foobar.Foo)request.getAttribute("Foo")).getBar().getName() %>
  2. EL: ${foo.bar.name}


Action 태그의 두 번째 단점은 JSP 내장 객체에 접근할 수 없다는 겁니다. 반면에 EL은 쉽게 접근 가능하죠.


간단한 한 줄 비교 코드 # 2

  1. Scriptlet: <%= application.getAttribute("name") %>

  2. ActionTag: <jsp:getProperty id="application" property="name" /> ERROR!

  3. EL: ${applicationScope.name}


사실 첫 번째 한 줄 비교 코드는 예가 좀 잘못되있는데, 그 이유는 EL 첫 자리에 오는 변수는 내장 객체 아니면 Scope에 바인딩 된 속성이기 때문입니다. 따라서 첫 번째 예제는 foo 객체가 어느 Scope이던 바인딩 되어 있다는 걸 전제로 해야합니다.

+ Recent posts