본문 바로가기
Back-end

EL(Expression Language)

by 신재권 2021. 9. 5.

EL의 개요

EL(Expression Language)은 JSP의 표현식보다 간단한 방법으로 특정 데이터의 값을 웹 페이지에 출력할 수 있게 해주며, 다음과 같이 $ 기호와 {} 괄호 안에 출력되길 원하는 식을 포함하는 형탱로 구현한다.

EL식에 사용되는 문자열을 출력용으로 사용하고자 할 때는 \을 사용할 수 있다.

EL의 역할은 특정식을 통한 데이터의 값 출력 및 다른 구성 요소에 값을 지정하는 데에 있으므로 EL이 없이도 JSP 프로그래밍이 불가능한 것은 아니다.

EL은 JSP2.0 버전부터 지원하므로 이전 버전의 JSP에서는 사용할 수 없다.

그러나 EL을 사용하면 JSP의 표현식에 비해 간결한 형태의 코드 사용이 가능하고, 기능 수행의 효율성 면에서도 이점이 있기 때문에 웹 애플리케이션 제작 시 자주 사용되는 방식이다.

JSP의 표현식을 사용한 출력 수행에 비해 EL을 통한 구현이 다소 간결해진다.


EL의 문법

EL은 특정식을 통한 데이터의 출력을 수행하기 위해 사용하는 언어이므로, 이러한 식의 사용에 필요한 문법이 존재한다.


EL식의 데이터이름

EL에서는 출력을 위한 데이터를 지정하기위해 데이터의 이름을 사용할 수 있다.

데이터의 이름은 set/get/removeAttribute 메서드를 사용하는 page, request, session, application 내장 객체에 지정된 데이터들을 의미하며 동일한 데이터의 이름이 여러 내장객체에 존재할 경우 데이터의 이름은 아래와 같이 사용범위가 작은 곳부터 우선 해석된다

page < request < session < application

application의 사용범위가 가장 넓다.

즉 page의 우선순위가 더 높다.


즉 내장객체의 우선순위가 더 높으면 상대적으로 사용범위가 좁고, EL 처리 우선순위가 우선이다.

이 우선순위를 따르지 않고 특정 개체의 애트리뷰트 데이터 값을 출력하고 싶을 경우 EL식에서 제공하는 내장객체를 지정하여 접근이 가능하다.


EL의 내장객체

EL은 JSP 내장객체처럼 웹 애플리케이션 제작에 필요한 데이터의 접근을 위해 사용할 수 있는 내장객체가 정의되어 있다.

그러나 EL에 정의된 내장객체는 다른 JSP 스크릡팅 요소에서는 사용할 수 없으므로 사용에 주의가 필요하다.


JSP 내장 객체

pageScope : JSP의 page 내장객체와 동일 : Map 타입

requestScope : JSP의 request 내장객체와 동일 : Map 타입

sessionScope : JSP의 session 내장객체와 동일 : Map 타입

applicationScope : JSP의 application 내장객체와 동일 : Map타입

pageContext : JSP의 pageContext 내장객체와 동일 : PageContext


파라미터

param : 요청 파라미터 데이터 접근시 사용 : request.getParameter(paramName)와 동일 : Map

paramValues : 요청 파라미터 데이터들을 배열로 접근 시 사용 : request.getParameterValues(paramName)와 동일 : Map

initParam : 컨텍스트 초기화 파라미터 접근 시 사용 : application.getInitParameter(paramName)와 동일 : Map


쿠키

cookie : 쿠키 객체 참조 시 사용 : Map


헤더

header : 요청 헤더 정보 데이터 접근 시 사용 : request.getHeader(headerName)와 동일 : Map

headerValues : 요청 헤더 정보 데이터들을 배열로 접근시 사용 : request.getHeaders(headerName)와 동일 : Map


EL을 이용한 JSP 내장객체 출력

EL의 내장객체는 JSP 내장객체를 지칭할 수 있는 방법을 제공하여 JSP 내장객체에 설정된 데이터의 출력에 사용된다.

EL 내장객체를 통해 아래의 형식에 맞춰 JSP 내장객체를 지칭하면 데이터명을 내장객체별 중복 여부에 관계없이 선택하여 출력할 수 있다.


$pageScope.ATTRIBUTE : page내장객체의 데이터 출력

$requestScope.ATTRIBUTE : request 내장객체의 데이터 출력

$sessionScope.ATTRIBUTE : session 내장객체의 데이터 출력

$applicationScope.ATTRIBUTE : application 내장객체의 데이터 출력


EL 내장객체를 이용하면 우선순위에 상관없이 JSP의 특정 내장객체에 바로 접근이 가능하다.


요청 파라미터 데이터 출력

EL식을 통해 요청 파라미터의 출력을 사용해보자.

요청 파라미터가 단일 값을 가지는 데이터인지, 여러 개의 값을 가질 수 있는 데이터인지에 따라 각각 다음과 같이 두 가지 방식을 선택하여 사용할 수 있다.


단일값을 가지는 파라미터

${param.ParamName}

${param["ParamName"]}


다중값을 가지는 파라미터

${paramValues.ParamName[index]}

${paramValues"ParamName[index]"}


request 내장객체를 사용하지 않고도 요청 파라미터값을 출력할 수 있다.

paramValues의 경우 선택되지 않은 인덱스는 에러가 발생하는 것이 아니라 단지 출력되지 않는 식으로 동작한다.

요청 파라미터 외에도 EL은 initParam식을 사용하여 웹 애플리케이션의 초기화 파라미터를 출력할 수 도 있다.

${initParam.PARAM_NAME}

${initParam["PARAM_NAME"]}


쿠키 정보 출력

EL식을 통한 쿠키 정보의 출력을 알아보자.

쿠키는 EL의 cookie 식으로 사용가능하며, EL식에서 사용되는 cookie는 JSP의 내장객체를 의미하므로 쿠키 내부의 속성값에 접근하기 위해 앞서 살펴본 다른 EL식들과는 조금 다른 형태의 식을 구현한다.

예를 들어 COOKIE_NAME 이름을 가진 쿠키의 속성 property 값을 출력하기 위해서는 다음과 같이 4가지 방식을 사용할 수 있다.

${cookie.COOKIE_NAME.property}

${cookie.COOKIE_NAME["property"]}

${cookie["COOKIE_NAME"].property}

${cookie["COOKIE_NAME"]["property"]}


앞서 이야기한 cookie EL 내장객체에서 호출한 쿠키명은 JSP쿠키를 내장객체 자체를 지칭하므로, 쿠키 내장객체 내부의 추가적인 속성값을 가져오기 위해서는 한단계 더 구체적으로 표현해주어야 한다.


쿠키의 속성을 지정하지 않고 EL을 통해 출력할 경우 출력되는 값은 쿠키 내장객체의 참조값이며 이 값은 출력으로는 의미가 없다.

따라서 생성된 쿠키 자체의 값을 출력하기 위해서는 쿠키의 이름과 출력에 원하는 속성값이 명시되어야 한다.


EL의 pageContext 내장객체

EL의 pageContext 내장객체를 사용하면 java.servlet.PageContext 클래스에 정의된 기능들을 통해 JSP 내장객체들에 설정되어 있는 JSP 페이지 내 여러 정보에 아래와 같이 EL식을 사용하여 접근할 수 있다.


${pageContext.request} : request 내장객체를 가져옴 , getRequest() 메서드와 동일

${pageCotnext.response} : response 내장객체를 가져옴, getResponse() 메서드와 동일

${pageContext.page} : page 내장객체를 가져옴, getPage() 메서드와 동일

${pageContext.exception) : exception 내장객체를 가져옴 , getException() 메서드와 동일

${pageContext.errorData} : 에러정보를 가져옴, getErrorDate() 메서드와 동일

${pageContext.servletConfig} : servletConfig 인스턴스를 가져옴, getServletConfig()메서드와 동일

${pageContext.serveltContext} : servletContext인스턴스를 가져옴, getServeltContext()메서드와 동일

${pageContext.session} : session 내장객체를 가져옴, getSession()메서드와 동일


앞서 살펴보았던 EL의 내장객체와 마찬가지로 위 표에 나온 pageContext내장객체의 식들은 각각 해당하는 객체의 참조값에 접근하므로 내부에 설정된 데이터에 접근하기 위해 한단계 더 표현해준다.

${pageContext.내장객체.내부구성요소}


EL 연산자

EL은 출력을 위한 데이터 간 연산을 지원한다.

EL에서 사용하는 연산자는 기본적으로 자바 연산자와 동일한 방식으로 사용되는 것이 대부분이지만, 연산자에 따라 수행되는 기능은 자바의 연산자와 조금 상이한 것도 있다.


산술 연산자

EL에는 다음과 같이 다섯가지 산술연산에 사용되는 연산자를 제공한다.


  • : 덧셈

-: 뺄셈

*: 곱셈

/,div : 나눗셈

%, mod :나머지연산


산술 연산자의 사용방법은 자바의 산술연산자와 동일하며 나눗셈과 나머지 연산의 경우 div나 mod 연산자를 사용할 수 있다.

EL의 산술연산자들의 사용방법은 자바와 동일했지만, 여기서 주목해야 할 점은 EL의 수치 연산자는 자바의 산술연산자와 달리 데이터 타입에 대해 조금 더 유연하게 동작한다는 점이다.

GET 방식으로 전송된 파라미터는 그 값이 숫자 형태를 띠더라도 그 데이터의 타입은 문자열로 전송되어 자바에서는 반드시 해당 파라미터의 데이터 타입을 숫자형태로 바꿔주어야 한다.

그러나 EL 산술 연산자는 데이터의 값이 숫자로 자동변환되어 연산을 수행한다.

만약 숫자로 변경할 수 없는 텍스트 문자열과 같은 데이터가 올 경우 에러가 발생한다.

피 연산자가 null일 경우 EL의 산술 연산자를 적용하면 해당 null을 0으로 처리하여 연산을 수행한다는 점과 정수형 데이터끼리의 나눗셈의 결과과 실수형 데이터로 출력되는 것도 특이한 점이다.


비교 연산자

==, eq : 자바와 동일

≠, me : 자바와 동일

, gt : 자바와 동일

≥, ge : 자바와 동일

<, lt : 자바와 동일

≤, le : 자바와동일


비교연산자에 사용되는 기호는 HTML 및 JSP 문법에도 사용되는 문자이므로 자바에서 사용하던 비교 연산자와 동일한 기능을 하는 eq,ne,gt,ge,lt,le로도 사용이 가능함을 숙지해야한다.


삼항연산자

삼항연산자는 자바에서 사용되는 삼항 연산자와 동일한 수행을 한다.

EL 연산자를 사용한 결과값이 true 혹은 false 일 때 사용할 값을 지정해 줄 수 있다.

${param.gender == "male" ? "남자" : "여자"}


empty 연산자

EL의 empty 연산자는 데이터의 값이 null과 같이 빈 값을 가지는지를 검사하는 연산자이다.

${empty DATA}

DATA가 null 혹은 공백 문자열 (" "), 비어있는 Collection일 경우 true가 반환되고, 그 반대의 경우는 모두 false가 반환된다.

empty연산자는 데이터의 존재 유무를 알기 위해 사용하는 연산자이지만, 데이터가 존재할 때 true가 반환되는 것이 아니라 데이터가 존재하지 않을 떄 true가 반환된다.


EL을 이용한 자바 메서드 사용

JSP 2.1 이하 버전에서는 EL을 통해 정적(static) 메서드만 사용 가능했지만, JSP 2.2 버전에 대응되는 EL 버전 2.2부터는 클래스의 인스턴스(instance)메서드도 사용이 가능하다.


EL을 이용한 자바 인스턴스 메서드 사용

JSP 2.2 버전에서 사용이 가능한 EL2.2 버전은 자바의 인스턴스 메서드 사용이 가능해졌다.

따로 자바 클래스로 메서드를 정의해놓는다.

입력 파라미터를 통해 블록 내 코드를 실행만 하는 void타입 메서드, 입력 파라미터 없이 결과값을 리턴해주는 메서드, 여러 개의 입력파라미터가 정의되어 결과값이 단일 변수의 값으로 리턴되는 메서드, 배열 데이터를 리턴하는 메서드로 이루어져 있다.

이러한 다양한 형태의 메서드를 리턴 타입과 파라미터의 유무 및 개수에 상관없이 EL을 통해 사용할 수 있다.


데이터의 출력을 위한 용도로 주로 사용하는 EL을 통해 void 메서드나 파라미터 입력이 필요한 메서드와 반환되는 여러 데이터 타입을 모두 사용할 수 있는 것은 다양한 활용이 가능하다.


void 메서드일 경우 아무런 메시지 출력 없이 메서드만 실행된다.

또한 배열 내 값을 출력하기 위해 배열의 인덱스 번호를 사용할 수 도 있고, 객체의 참조 주소를 알 수 도 있다.


JSP 페이지 상단에 자바코드를 import한후 메모리에 할당해준다.

request.setAttribute를 사용해 자바코드의 변수와 연결을 해준다.

${메서드()} 이런식으로 사용하고, 메서드가 반환형이 알맞다면 파라미터에도 입력이 가능하다.

배열에 접근하기 위해서는

${배열반환메서드()}[index] 이런식으로 사용해 각 원소마다 접근이 가능하다.

만약 원소가 존재하지 않으면 출력이 되지 않는다.


EL을 이용한 자바 정적 메서드 사용

JSP 2.1 버전에서는 EL을 이용하여 자바의 정적 메서드(static method)만을 사용할 수 있으며 자바의 정적 메서드를 EL 함수로 등록하는 작업이 병행되어야 한다.

우선 EL을 통해 사용할 정적 메서드가 정의된 클래스를 제작한다.

위에서 제작한 클래스의 정적 메서드를 EL을 통해 사용하기 위해서 TLD 파일 내에 EL 함수를 등록해주는 절차가 필요하다.

<function>

<name>메서드이름</name>

<function-class>클래스.메서드</function-class>

<function-signature>리턴타입</function-signature>

<function>


최상단의 <taglib> 태그에는 xmlns에 TLD 문법의 식별자와 version 속성에 TLD 문법의 버전을 작성한다.

<description> 태그에는 사용할 태그 라이브러리에 대한 간략한 설명을 넣는다.

<tlib-version>에 태그 라이브러리 버전이 지정된다.

<short-name> 태그에는 현재 태그 라이브러리 명을 지정해준다.

<function> 태그는 우리가 현재 태그 라이브러리에서 호출할 수 있는 함수를 제적하기 위한 태그이다.

<name> 태그는 태그에 사용될 함수의 이름

<function-class>태그는 사용할 정적 메서드가 정의되어 있는 자바 클래스의 풀네임

<function-signature>태그는 태그에 등록한 정적 메서드의 리턴 타입,메서드명,메서드의 입력 파라미터의 데이터 타입을 작성해준다.


TLD는 Tag Library Descriptor의 약자로, 태그 라이브러리 정보 설정을 위해 작성한다.


이렇게 작성한 TLD 파일에 등록해준 EL 함수를 사용하려면 TLD 파일을 웹 컨테이너에 인식시켜주어야 한다.

즉 web.xml에 TLD 파일을 등록해주어야 한다.

등록을 위해 <taglib> 태그를 작성하여 TLD 파일의 식별자를 지정하기 위한 <taglib-uri> 태그와 TLD 파일의 경로명을 지정해주기 위한 <taglib-location> 태그를 작성한다.


JSP에서 등록된 EL 함수를 사용하기 위해서 taglib 지시자를 사용해야 한다.

<%@ taglib prefix"태그라이브러리 구분용 접두어" uri="TLD 파일의 URI"%>

이렇게 taglib 지시자를 지정한 후 실제 EL식을 통해 사용한다.

${접두어:TLD파일의<function> 태그 내 <name>태그로 지정된 함수명(입력파라미터)}


EL의 비활성화

EL은 모든 JSP 버전에서 사용할 수 있는 기술이 아니므로, JSP 1.2 이하 버전에서 제작된 웹 애플리케이션에 $와 같은 문자가 포함되어 있고, 이를 JSP 2.0 이상 버전을 처리하는 웹 컨테이너를 통해 구동할 경우 문제가 발생할 수 있다.


page 지시자를 이용한 비활성화

가장 간단하게 비활성화 하는 방법은 page 지시자의 isELIgnored 속성에 true값을 지정해주는 방식이다.

<%@ page isELIgnored="true"%>

기본값은 false이다.

2.1버전 부터 사용가능한 #[] 형식의 EL구문 실행을 막기 위해서는 deferredSyntaxAllowrdAsLiteral 속성값을 true로 지정해준다.


web.xml의 <jsp-propery-group> 태그를 이용한 비활성화

<jsp-property-group> 태그는 <jsp-config> 태그 내에 위치하는 내부 태그로 지정한 JSP 페이지에 설정값을 적용해 줄 수 있다.

EL을 비활성화할 대상 페이지의 URL 패턴을 지정하는 <url-pattern> 태그와 <el-ignored> 태그의 값을 true 지정한다.

모든 JSP 페이지의 EL을 비활성화해야한다면 태그 내 *.jsp를 지정해준다.

두 가지 방법 중 page 지시자를 이용한 비활성화가 우선시된다.

'Back-end' 카테고리의 다른 글

Spring 기본 세팅  (0) 2021.10.06
10. JSTL  (0) 2021.09.11
데이터베이스 프로그래밍  (0) 2021.09.04
시큐리티 커스텀 로그인 폼  (0) 2021.09.03
스프링 시큐리티  (0) 2021.09.02