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
잊으신 거 없어요? 아래 소스 다운로드.. 그거 아니구요. 아름다운 댓글!!!
'강좌 > Spring @MVC' 카테고리의 다른 글
006. FrontController 패턴 2/2 - 급마무리 (4) | 2013.03.04 |
---|---|
005. FrontController 패턴 1/2 - 의역: 출입구 패턴, 분배기 패턴 (10) | 2013.02.27 |
004. MVC? Model2 - 개발자를 칼퇴 시켜주는가? - 추고 중 (3) | 2013.02.26 |
002. JSP - HTML 코더 퇴사 시키기 / 개발자 더 힘들게 하기 (6) | 2013.02.25 |
001. Servlet - HTML 로 개발자 피로감 상승 시키기 (9) | 2013.02.25 |