003. JSTL & EL - java 프로그래머와 HTML 코더의 협업
Java 프로그래머와 HTML 코더의 협업
Servlet 로만 하는 개발의 문제점
1. 자바 프로그래머 위주이다.
2. java 코드 사이에 html 태그가 스파케티처럼 엮여져 있다.
3. 자바 프로그래머 위주인 줄 알았더니 자바 프로그래머 혹사다.
JSP 로만 하는 개발의 문제점
1. java 프로그래머의 일을 덜어준다.
2. HTML 코더에게 java 코드를 볼 줄 아는 능력을 요구한다.
3. 2 의 문제로 java 프로그래머는 HTML 코더를 교육하고 열 받고 또 가르키고 수정해주고.. 결국 일이 줄지 않고 더 늘어난다.
프로그래머의 생각 "HTML 코더는 바보인가? 왜 자꾸 null point expection 을 유발하는가?"
4. html 태그 사이에 java 코드가 스파케티처럼 엮여져 있다.
5. 자바 프로그래머 / HTML 코더 둘 다 혹사다.
문제가 있으면 해결하는 직업. 바로 개발자 입니다. 특히 Guru 들이 C&i 를 시전하여 이러한 문제의 해법을 찾습니다.
Guru 들께서 전제한 사항은 대충 이렇습니다.
- java 프로그래머와 html 코더의 협업은 필요 불가피한 것이다.
이런 전제를 두었으니 해법은 서로가 조금씩 희생해서 결국에는 시너지를 거두는 것 입니다.
1. java 개발자는 최대한 java servlet 코드 개발에만 집중한다.
2. html 코더는 최대한 html 코딩에만 집중한다.
3. java 개발자와 html 코더가 협업이 필요한 경우 최소의 노력으로 최대의 효과를 볼 수 있는 새로운 표기법을 사용한다.
그리하여 등장하는 것이 일상 언어에 가깝고 편리한 표기법을 두는 것 이었으니.. 두둥 JSTL(JSP Standard Tag Library) 과 EL(Expression Language) 이 등장합니다.
그럼 적용해 보도록 하겠습니다.
먼저 NeoMemberServlet.java 파일을 만듭니다.
package com.heaven.spring; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class NeoMemberServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Member juliet = new Member(); juliet.setName("줄리엣"); juliet.setGender(Member.FEMALE); juliet.setAge(18); Member romeo = new Member(); romeo.setName("놈임요"); romeo.setGender(Member.MALE); romeo.setAge(19); Member seoyoung = new Member(); seoyoung.setName("이서영"); seoyoung.setGender(Member.FEMALE); seoyoung.setAge(32); Member samjae = new Member(); samjae.setName("이삼재"); samjae.setGender(Member.MALE); samjae.setAge(62); // JSP 에 전달할 자료를 준비합니다. // 여기서는 Member 객체들을 List 에 담고 있습니다. List<member> members = new ArrayList<member>(); members.add(juliet); members.add(romeo); members.add(seoyoung); members.add(samjae); // JSP 에 준비한 자료를 HttpServletRequest 를 통해 저장해 둡니다. req.setAttribute("members", members); // 화면 처리를 위한 JSP 를 선정합니다. RequestDispatcher view = req.getRequestDispatcher("NeoMember.jsp"); // JSP 에게 화면 처리를 의뢰합니다. view.forward(req, resp); } }
37 라인부터 기존 소스 대비 달라진 부분입니다. 이 정도의 소스는 척보면 착하고 아시는 분들(?)이 보시는 강좌이니 별다른 설명은 생략하겠습니다. 만약 위 소스가 이해가 되지 않으신다면 JSP 관련 서적 한권 탐독하시고 다시 오시길.. ^^ Spring MVC 는 하늘에서 갑자기 뚝 떨어진 기술이 아니라 이전 기술의 어깨를 밟고 올라선 기술이기에 이전 기술에 대한 최소한의 지식은 가지셔야 합니다.
이제 보실 부분은 NeoMember.jsp 입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <c:forEach var="member" items="${members}"> <b>${member.name}</b> ${member}<br/> </c:forEach> </body> </html>
우왕 굳인가요? 기존 JSP 대비 <% %> 부분이 사라지고 ${} 가 나오고, <c:forEach ...>...</c:forEach> 부분이 나오고 있습니다. 기존과 비교 좀 해볼까요.
Member.jsp |
NeoMember.jsp |
<%@ page language="java" contentType="text/html; charset=UTF-8" |
<%@ page language="java" contentType="text/html; charset=UTF-8" |
초록이들이 사라졌어요. |
좌측에서 사라진 초록이들은 서블릿으로 이주했습니다. NeoMemberServlet.java 로 소스 보세요. 위에 있잖아요. |
JSTL 을 사용하기 위해 관련 TLD 규격 어쩌구 저쩌구... ㅡㅡ; |
|
JSTL 의 for each 구문입니다. |
|
EL 이라고 하는 녀석입니다. |
|
우리 아이가.. 아니 코드가 달라졌어요. |
JSTL 과 EL 로 깔금해졌습니다. 원하시면 길게 쓰셔도 됩니다. JSTL 없이 EL 로만 구성하신다면 위의 소스 기준으로 11 ~ 13 라인을 아래와 같이 고치시면 됩니다. <b>${members[0].name}</b> ${members[0]}<br/> |
자자 JSTL, EL 에 대한 학습이 필요하겠지만 JAVA 프로그래머가 java 코드 안에 html 을 구겨 넣는 노력, 또는 HTML 코더가 html 태그 안에 구겨 넣어진 java 코드를 이해하는 아니 최소한 잘 못 건드리지 않기 위한 노력에 비하면 정말 해피해진 겁니다. 서로 조금씩 양보하여 최대의 효과를 내는 것이죠. 그리고 단지 이것만 달라졌나하면 그건 아닙니다. 여러 좋은 점이 있습니다. 그게 뭐냐구요? 책에 문의하세요. ^^; 제가 한가지 예만 들어 드리지요.
JSP 파일 어딘가에 <%= myGirl %> 이라고 추가한 후 브라우저를 새로고침해 줍니다. 어떻게 되죠? 자바 프로그래머가 세상에서 젤루 싫어라 한다는 null pointer exeception... HTML 코더는 자기가 만든 HTML 태그가 브라우저 상에 하나도 안 보이니 멘붕 오죠... java 개발자는 HTML 코더는 바보라며 멘붕 오죠...
자 이제 <%= myGirl %> 대신 ${myGirl} 로 바꾸고 브라우저 새로고침.. 에러가 안 나네.. ^^ HTML 코더는 멘붕 안 와도 되겠죠. 다만 java 프로그래머에게 문의하겠죠. "나의 여친은 어디로 간거냐구요?"
이게 뭐가 좋아진 건지는 5분 명상을 통해서...여친이 없어졌는데.. 뭐가 좋아진 걸까요?
아 그리고 아직 작업이 끝이 난게 아닙니다. Servlet 이 만들어지면 반드시 필요한 작업은? servlet 매핑이죠. WebContent/WEB-INF/web.xml 을 여셔야 겠죠.
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>MemberServlet</servlet-name> <servlet-class>com.heaven.spring.MemberServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MemberServlet</servlet-name> <url-pattern>/Member</url-pattern> </servlet-mapping> <servlet> <servlet-name>NeoMemberServlet</servlet-name> <servlet-class>com.heaven.spring.NeoMemberServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NeoMemberServlet</servlet-name> <url-pattern>/NeoMember</url-pattern> </servlet-mapping> </web-app>
18 ~ 26 라인을 보시면 아시겠죠.
여기서 아직도 끝은 아닙니다. 한가지 일이 더 남았죠. 기억들 나시죠? 바로 바로 사용하는 JSTL 파일을 WEB-INF/lib 로 복사해 주셔야 한다는 거...
Tomcat 설치 디렉토리 밑에 jstl.jar 와 standard.jar 또는 jstl-1.1.2.jar 와 standard-1.1.2.jar 를 찾아서 STS Package Explorer 의 WebContent/WEB-INF/lib 밑으로 D&D 해줍니다. D&D? Drag & Drop - 끌어다 던지기
아 그리고 jstl.jar/standard.jar 쓸때는 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 이 맞다고 합니다(잘 봐야 합니다. 뭐가 다른지.. ^^). 오류 나시면 나벨이랑 구골 검색 ^^/
이제 모든 작업은 끝났습니다. 그럼 프로젝트명에서 우클릭 Run as > Run on Server.. 브라우저 띄우시고 주소창에 http://localhost:8080/ExpertSpringMVC001/NeoMember 와 비스꾸리무리한 주소를 잘 입력해 주시면 되겠죠.
STS 에서 다 띄워 봤습니다.
클릭하면 커지겠지만, 저는 친절(?)하니까 가운데 소스 부분 확대해서 보여드립니다.
그래도 클릭해서 확대해야 보이겠네요. ㅡㅡ;
우측 Package Explorer 요? 그건 그냥 위에 위에 그림 확대해서 보세요.
자 수고하셨습니다. 기억이 새록 새록 나시죠. 그리고 오해하시지 마셔야 하는게 이 작자(this guy? this writer!)의 머리 속에 이게 다 있다구 오해하지 마시길... 코드 작성하느라 HFSJ 계속 들추고 있습니다. HFSJ - Head First Servlet & JSP
그리고 이미 눈치 빠르신 분은 알고 계시겠지만 지금 제가 JSTL & EL 을 위한 강의를 한 걸까요? ㅋㅋ
아니라는 거 아실 분은 아실 거라 믿습니다.
Member.java / NeoMemberServlet.java / NeoMember.jsp 힌트 입니다. 정답은 다음 강좌에...
그럼 댓글 이후에 다시 뵙는 걸로...
열화와 같지 않은 성원 속에 2013년 3월 스터디가 제한적으로 마감되었습니다. ^^v
스터디 진행하면서 나오는 산출물(?)은 최대한 빠르게 공유... 설마 그럴 시간이.. 오프라인 스터디 준비 & 온라인 강좌 작성할 시간도 부족할텐데... 스터디 지원 안 하신 분들 후회하게 만들어드리겠어요. 내가 말이지.. 이 커뮤니터 저 커뮤니티 다니면서 얼마나 구걸을 했던지.. ㅡㅜ
그럼에도 불구하고 할렐루야...주의 이름으로 오시는 이여 호산나.
PS I
위에 JSTL, EL 이 일상적이고 편리한 표기법 뭐 이런 강아지 울부짖는 소리가 있었죠. 영어권 또는 영어 능통한 사람에게 해당하는 사항입니다. ㅡㅡ;
PS II
잊으신 거 없어요? 아래 소스 다운로드.. 그거 아니구요. 아름다운 댓글!!!