[정리] 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
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don`t forget me this weekend!</body>
</note>
샘플 코드 #2 HTML
<html>
<head><title>Reminder</title>
</head>
<body>
<p>to - Tove</p>
<p>from - Jani</p>
<p>tit.........젠장!
샘플 코드 #1 을 보고 각 태그가 무슨 의미를 담고 있는지 모르는 사람이 있을까요?
자바 코딩을 하지 못한다라.. 그냥 '하지맙시다' 라고 눈빛을 보내는 것 보다 항상 더 우아한 방법이 있죠.
web.xml
- <web-app ...>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
- </web-app>
이것이 <scripting-invalid> 관련 설정의
유일한 방법입니다. JSP 2.0 초안엔 <@ page> 속성으로 뭐가 있었다는데 하여간 최종안에선 사라졌습니다.
아래는 EL을 사용하지 않는다는 설정입니다. 디폴트는 false죠. (기존에 EL 문법처럼 어딘가 코딩을 해놨다면 그게 문제를 일으킬 수도 있지 않겠어요?)
- <%@ page isElIgnored="true" %>
이렇게 페이지 별로 따로 설정도 가능합니다. 페이지 지시자는 DD의 설정을 오버라이드 합니다.
Action 태그의 단점은 빈의 프로퍼티가 기본 자료형(+문자열)이 아닐 때 금새 드러나 버립니다. 만약 Foo 객체가 프로퍼티로 Bar 클래스 객체를 가지고 있을 경우, getProperty를 한다면 객체기 때문에 toString()이 호출되겠죠. Bar의 속성에 접근할 수 있는 방법이 없습니다. 그럼 다시 스크립팅의 세계로 가야하느냐.. 답은 EL 입니다.
간단한 한 줄 비교 코드 # 1
- Scriptlet: <%= foo.getBar().getName() %>
- ActionTag: <jsp:getProperty id="foo" property="bar" /> <!-- 이게 한계. bar.name 하면 에러! -->
- EL: ${foo.bar.name}
이렇게 보면 Scriptlet이나 EL이나 별 다른 점이 없어 보이지만, 만약 저 foo 객체가 바인딩되서 넘아온다면 코드가 어떻게 바뀔까요?
- Scriptlet: <%= ((foobar.Foo)request.getAttribute("Foo")).getBar().getName() %>
- EL: ${foo.bar.name}
Action 태그의 두 번째 단점은 JSP 내장 객체에 접근할 수 없다는 겁니다. 반면에 EL은 쉽게 접근 가능하죠.
간단한 한 줄 비교 코드 # 2
Scriptlet: <%= application.getAttribute("name") %>
ActionTag: <jsp:getProperty id="application" property="name" /> ERROR!
EL: ${applicationScope.name}
사실 첫 번째 한 줄 비교 코드는 예가 좀 잘못되있는데, 그 이유는 EL 첫 자리에 오는 변수는 내장 객체 아니면 Scope에 바인딩 된 속성이기 때문입니다. 따라서 첫 번째 예제는 foo 객체가 어느 Scope이던 바인딩 되어 있다는 걸 전제로 해야합니다.
'Computer Science' 카테고리의 다른 글
JSTL 기초, Part 1: Expression Language (한글) (0) | 2012.03.20 |
---|---|
[정리] EL :: Function (0) | 2012.03.20 |
ubuntu에서 GTK 개발환경 꾸미기 (0) | 2012.03.19 |
GNU 자유 문서 사용 허가서 1.2판 (0) | 2012.02.29 |
자주 쓰이는 정규식(regular expression) 유형 (0) | 2012.02.22 |