강좌/Spring @MVC

003. JSTL & EL - java 프로그래머와 HTML 코더의 협업

여름나라겨울이야기 2013. 2. 26. 15:33
728x90

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"
pageEncoding="UTF-8"%>
<%@ page import="com.heaven.spring.Member" %>
<%
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);
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<b><%= juliet.getName() %></b> <%= juliet.toString() %><br/>
<b><%= romeo.getName() %></b> <%= romeo.toString() %><br/>
<b><%= seoyoung.getName() %></b> <%= seoyoung.toString() %><br/>
<b><%= samjae.getName() %></b> <%= samjae.toString() %><br/>
</body>
</html>
<%@ 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>

 초록이들이 사라졌어요.

 좌측에서 사라진 초록이들은 서블릿으로 이주했습니다.

 NeoMemberServlet.java 로 소스 보세요.  위에 있잖아요.

 

 JSTL 을 사용하기 위해 관련 TLD 규격 어쩌구 저쩌구... ㅡㅡ;

 

 JSTL 의 for each 구문입니다.

   EL 이라고 하는 녀석입니다.
 우리 아이가.. 아니 코드가 달라졌어요.

 JSTL 과 EL 로 깔금해졌습니다.  원하시면 길게 쓰셔도 됩니다.  JSTL 없이 EL 로만 구성하신다면 위의 소스 기준으로 11 ~ 13 라인을 아래와 같이 고치시면 됩니다.


<b>${members[0].name}</b> ${members[0]}<br/>
<b>${members[1].name}</b> ${members[1]}<br/>
<b>${members[2].name}</b> ${members[2]}<br/>
<b>${members[3].name}</b> ${members[3]}<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

잊으신 거 없어요?  아래 소스 다운로드.. 그거 아니구요.  아름다운 댓글!!!


소스: ExpertSpringMVC001.zip

반응형