커스텀 태그와 EL

HH_Nebula·2023년 1월 27일
0

커스텀 태그란?

커스텀 태그란 사용자 정의 태그를 의미한다. 즉 스크립트릿 사용을 줄이고 태그와 같은 형태로 프로그램 코드를 대체하거나 재활용 가능한 구조를 통해 태그 라이브러리로 활용하고자 개발된 규격이다. 외형적인 형태는 XML(HTML) 태그 구조이지만 서블릿 형태로 변환될 때 자바 코드로 변경되어 퉁합되는 방식이다.

커스텀 태그를 사용하기 위해서는 taglib 지시어를 사용하여 커스텀 태그가 어디에 정의되어 있는지를 먼저 선언해야 하며 태그에 사용할 접두어를 지정해야 한다.

커스텀 태그는 잘 사용하면 매우 편리하지만 커스텀 태그 자체가 서버에서 해석되는 구조이며, 프로젝트가 특정 커스텀 태그에 종속될 수 있다는 문제 때문에 커스텀 태그를 직접 만드는 방식은 점차 줄어들고 있다.

대신 커스텀 태그 기술로 만들어진 JSTL이 자바 웹 개발에 꼭 필요한 요소가 되었다.

<!-- 태그파일의 위치와 해당 태그를 사용할 때 작성할 접두어를 지정 -->
<%@ taglib tagdir="/WEB-INF/tags" prefix="m" %>

<!-- 접두어 m 을 사용하여 태그를 작성 -->
<m:printData product="web" />
  • 태그파일로 정의된 커스텀 태그를 사용하여 /WEB-INF/tags/printData.tag 파일로부터 태그 정의를 가져온다.
  • m은 태그 앞에 붙일 접두어로 태그 파일명이 태그이름이 된다.

앞의 useBean 액션 역시 커스텀 태그 기술을 통해 만들어진 것으로 기본 JSP 규격에 포함되어 있기 때문에 표준 액션이라 불린다.

EL이란?

표현 언어는 주로 EL이라고 불리며 현재 페이지의 자바 객체 혹은 application, session, request, page와 같은 scope object에 저장된 자바 빈 객체를 손쉽게 접근하고 사용할 수 있게 해준다. 기본적으로 데이터를 표현하기 위한 용도로 설계되었지만 제한된 객체 참조가 가능하며 해당 객체의 메서드 호출도 가능하다.

EL은 단순한 출력 외에도 사칙연산, 비교연산, 논리연산, 3항 연산 등을 지원한다. 이러한 연산기능은 핵심 로직의 구현보다는 상황에 따라 출력값을 변경하는 정도의 용도로 사용하는것이 좋다.

EL의 장점은 다음과 같다.

  • 간단한 구문으로 쉽게 변수 또는 객체를 참조할 수 있다.
  • 데이터가 없거나 null 객체를 참조할 때 에러가 발생하지 않는다.

EL을 통해 scope object에 저장된 자바 빈 객체를 참조하는 방법은 다음과 같다.

${저장이름.변수명}

<h2>사용자 정보</h2>
이름 : ${userInfo.name}
  • 세션에 userInfo 라는 이름으로 저장된 객체가 있으므로 해당 객체를 사용하여 접근한다.

User 클래스에 name 변수가 private로 선언되어 있을 경우 직접 참조가 불가능하다. 이때 클래스에 getter() 메서드가 있다면 EL에서는 해당 변수명을 사용하여 내부적으로 getter()를 호출할 수 있다.

기타 연산과 배열, 맵 등 데이터 접근은 다음과 같다.

${10 + 20} // 사칙연산
${10 * 20} // 논리연산
${true && false} // 논리연산
${10 >= 20} // 논리연산
${userInfo.name == "여름" ? "냉면" : "호빵"} // 3항연산

${arrayList[0]} // 배열
${hashMap["name"]} // 맵

EL은 기본적으로 모든 scope에서 자바 빈 객체를 찾는다. 만일 특정 scope만을 대상으로 참조할 경우 내장객체명Scope.속성이름으로 사용할 수 있다.

${requestScope.userInfo.name}
${sessionScope.userInfo.name}

만일 scope object에 속성으로 저장된 것이 아니라 request의 파라메터로 전달된 값의 경우라면 위 형식처럼 참조할 수 없다. 이 경우에는 request.getParameter("pramName") 과 같이 사용하며 EL에서는 ${param.paramName} 으로 사용한다.

profile
공부하고 기록하고 복습하고

0개의 댓글