자바 웹 개발 완벽 가이드 : jsp/서블릿부터 웹소켓, 스프링 mvc,...

65

Post on 22-Jul-2016

310 views

Category:

Documents


33 download

DESCRIPTION

니콜라스 S. 윌리엄스 지음 | 최민석 옮김 | 오픈소스 & 웹 시리즈 _ 067 | ISBN: 9788998139773 | 48,000원 | 2015년 02월 16일 발행 | 1104쪽

TRANSCRIPT

Page 1: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지
Page 2: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

자바 웹 개발 완벽 가이드:JSP/서블릿부터 웹소켓, 스프링 MVC,

JPA/하이버네이트, 스프링 시큐리티까지

Page 3: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

지은이 니콜라스 S. 윌리엄스

옮긴이 최민석

펴낸이 박찬규 엮은이 이대엽 디자인 북누리 표지디자인 아로와 & 아로와나

펴낸곳 위키북스 전화 031-955-3658, 3659 팩스 031-955-3660

주소 경기도 파주시 문발로 115 세종출판벤처타운 #311

가격 48,000 페이지 1104 책규격 188 x 240mm

초판 발행 2015년 02월 16일

ISBN 978-89-98139-77-3 (93000)

등록번호 제406-2006-000036호 등록일자 2006년 05월 19일

홈페이지 wikibook.co.kr 전자우편 [email protected]

Professional Java for Web Applications by Nicholas S. Williams

Copyright © 2014

All rights reserved.

This translation published under license with the original publisher John Wiley & Sons, Inc

Korean edition copyright © 2015 by WIKIBOOKS

이 책의 한국어판 저작권은 대니홍 에이전시를 통한 저작권사와의 독점 계약으로 위키북스가 소유합니다.

신 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.

이 책의 내용에 대한 추가 지원과 문의는 위키북스 출판사 홈페이지 wikibook.co.kr이나

이메일 [email protected]을 이용해 주세요.

이 도서의 국립중앙도서관 출판예정도서목록(CIP)은

서지정보유통지원시스템 홈페이지(http://seoji.nl.go.kr)와

국가자료공동목록시스템(http://www.nl.go.kr/kolisnet)에서 이용하실 수 있습니다.

(CIP제어번호 : CIP2015003582)

자바 웹 개발 완벽 가이드:JSP/서블릿부터 웹소켓, 스프링 MVC,

JPA/하이버네이트, 스프링 시큐리티까지

Page 4: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지
Page 5: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

들어가며

많은 사람들이 인식하지 못하고 있지만 사실 자바는 우리의 일상 모든 곳에서 사용되

고 있다. TV, 블루레이 플레이어, 컴퓨터는 물론 인기 있는 스마트폰 중 일부는 자바

기반 운영체제로 작동하며 우리가 매일 사용하는 웹사이트의 상당수도 자바로 작동

한다. 자바에 대해 생각할 때는 운영체제의 다른 애플리케이션과는 다른 사용자 인

터페이스를 가진 브라우저 애플릿이나 데스크톱 애플리케이션을 떠올리거나 시스템

트레이의 알림 영역에서 귀찮게 표시되는 자바 업데이트 알림이 연상될 수 있다.

그러나 자바는 이렇게 일상적으로 쉽게 확인할 수 있는 것보다 광범위하게 보급돼 있

다. 자바는 강력한 언어이며 플랫폼의 기능을 효율적으로 활용할 수 있다. 자바 SE

플랫폼은 콘솔, 데스크톱, 브라우저 애플리케이션을 개발하기 위한 필수적인 툴을

제공하지만 자바 EE 플랫폼은 이 플랫폼을 더 확장해서 강력한 다기능 웹 애플리케

이션을 개발할 수 있게 도와준다. 이 책에서는 이러한 툴을 살펴보고 유용한 최신 엔

터프라이즈 자바 웹 애플리케이션을 개발하는 방법을 알아본다.

대상 독자

이 책은 자바 언어와 자바 플랫폼 스탠더드 에디션(자바 SE)에 대한 경험과 지식이

풍부한 소프트웨어 개발자와 엔지니어를 대상으로 한다. 이 책은 기존의 자바 개발

자가 애플릿, 콘솔 또는 데스크톱 애플리케이션을 개발하면서 얻은 자바에 대한 지

식과 경험을 바탕으로 엔터프라이즈 자바 웹 애플리케이션을 개발하는 방법을 배우

기 위한 자습서다. 이 책은 처음부터 끝까지 순서대로 읽으면서 모든 내용을 배우거

나 흥미로운 주제를 선택해서 배우거나 아니면 레퍼런스처럼 활용할 수 있다. 일부

IV

Page 6: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

V

장에서는 가끔 이전 장의 예제를 참조하는 경우가 있지만 가급적이면 각 장을 독립적

으로 진행할 수 있게 구성했다. 모든 예제는 위키북스1나 wrox.com2에서 내려받을

수 있으므로 이전 장의 다른 예제가 필요한 경우 쉽게 이용할 수 있다.

또한 이 책은 자바 플랫폼 엔터프라이즈 에디션(자바 EE)에 대한 경험이 있는 개발자

가 기억을 되살리거나 최신 자바 EE 버전의 새로운 기능을 배우는 데도 유용하다. 이

책은 다양한 웹 소프트웨어 개발 개념과 패턴을 비롯해 구체적인 툴과 플랫폼 컴포

넌트를 다루고 있으므로 소프트웨어 설계자에게도 유용하다. 이 책은 설계자가 새로

운 아이디어를 팀의 프로젝트와 프로세스에 적용하게끔 도와줄 것이다.

이 책은 소프트웨어 개발 팀의 관리자에게도 유용하다. 관리자가 자신의 팀에 속한

개발자와 엔지니어들과 효과적으로 의사소통하려면 지식 기반을 넓힐 필요가 있으

며 개발자가 사용하는 툴을 이해하면 특정 문제를 해결하기 위한 제안도 할 수 있다.

이 책을 읽고 나면 팀원들이 프로젝트에 적용되는 기술과 개념을 익힐 수 있게 책을

몇 권 더 구매해서 나눠줄 수도 있을 것이다.

마지막으로 이 책은 교사와 학생을 위한 교육 환경에서 사용할 수 있다. 이 책을 대

학교 3~4학년용 강의 교재로 사용하면 졸업 이후 업무 현장에서 즉시 활용 가능한

수준 높은 기술을 쌓을 수 있다.

이 책이 적합하지 않은 독자

이 책은 자바에 대한 경험이 전혀 없거나 자바 기반 애플리케이션을 작성해 본 적이

없는 독자에게는 적합하지 않다. 이 책에서는 자바 언어 구문과 자바 SE 플랫폼에 대

1 http://wikibook.co.kr/projavaforwebapps

2 http://www.wrox.com/WileyCDA/WroxTitle/productCd-1118656466.html

Page 7: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

해서는 자세히 다루지 않으므로 자바에 대한 경험이 없으면 이 책의 본문과 예제를

이해하기 어려울 것이다. 이 책은 자바 코드를 작성, 컴파일, 디버깅하는 작업에 익

숙하고 자바 SE를 잘 알고 있는 독자에 맞게 구성돼 있다. 다만 자바 SE 8에 새로 추

가된 표준 자바 기능과 도구에 대해서는 따로 설명한다.

또한 다음과 같은 기술과 개념을 어느 정도 이해하고 있다고 가정한다. 일부 항목은

당연한 기본 지식처럼 느껴지겠지만 익숙하지 않은 개념이 있다면 이 책의 일부 내용

을 이해하는 데 어려움을 느낄 수 있다.

•인터넷과TCP및HTTP프로토콜

•HTML5를포함한HTML(HyperTextMarkupLanguage)

•XML(ExtensibleMarkupLanguage)

•jQuery및브라우저디버깅툴을포함한ECMAScript또는자바스크립트

•CSS(CascadingStyleSheets)

•SQL(StructuredQueryLanguage)및관계형데이터베이스,특히MySQL(다른관계형데이터베이

스에익숙하다면MySQL에쉽게적응할수있다).

•트랜잭션과ACID(원자성,일관성,격리성,지속성)등과같은트랜잭션개념

•IDE(통합개발환경)사용법

•간단한명령줄작업실행(명령줄전문가일필요는없다).

이 책에서 다루는 내용

이 책에서는 자바 EE 플랫폼 버전 7과 이에 포함된 다양한 기술을 배운다. 먼저 자바

EE 플랫폼이란 무엇이고 어떻게 발전해왔는지 설명하고 애플리케이션 서버와 서블

릿 컨테이너를 소개하고 어떻게 작동하는지 알아본다. 다음으로 스프링 프레임워크,

게시/구독, AMQP(고급 메시지 대기열 프로토콜), O/RM(객체-관계형 매퍼), 하이

버네이트 ORM, 스프링 데이터, 전체 텍스트 검색, 아파치 루씬(Lucene), 하이버네

이트 서치, 스프링 시큐리티, OAuth를 다룬다. 또한 이 책 전체에서 다음과 같은 자

바 EE 7의 컴포넌트에 대해서도 다룰 것이다.

VI

Page 8: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

•서블릿3.1–JSR340

•JSP(자바서버페이지)2.3–JSR245

•JUEL(자바통합식언어)또는EL3.0–JSR341

•웹소켓용자바API–JSR356

•BV(빈유효성검사)1.1–JSR349

•JMS(자바메시지서비스)2.0–JSR343

•JPA(자바지속성API)2.1–JSR338

•JTA(자바트랜잭션API)1.2-JSR907

이 밖에도 Java SE 8에 추가된 람다 식과 새로운 JSR 310 자바 8 날짜 및 시간 API도

많이 사용한다.

1부: 엔터프라이즈 애플리케이션 개발

1부에서는 서블릿, 필터, 리스너, JSP(자바 서버 페이지)에 대해 다룬다. 서블릿으로

HTTP 요청에 응답하는 방법과 필터로 이를 지원하는 방법, 그리고 JSP 기반의 강

력한 사용자 인터페이스를 손쉽게 작성하는 방법을 배운다. JSP 태그의 강력한 기능

과 새로운 식 언어 3.0을 결합하는 방법을 알아보고 자바에 대해 모르는 UI 개발자가

손쉽게 유지 관리할 수 있는 뷰를 생성하는 방법을 배운다. HTTP 세션에 대해 배우

고 이를 활용해 애플리케이션에서 여러 페이지로 구성된 다기능 환경을 개발하는 방

법을 배울 것이다. 또한 애플리케이션과 클라이언트(예: 브라우저) 간 양방향 전이중

통신(full-duplex bidirectional communication)을 제공해 다기능 대화형 사용자

인터페이스를 만들 수 있게 해주는 웹소켓(WebSockets)이라는 새로운 기술을 알아

본다. 마지막으로 코드의 양이 많은 복잡한 애플리케이션을 개발할 때 꼭 필요한 기

능인 애플리케이션 로깅을 위한 최상의 방법과 기법을 알아볼 것이다.

VII

Page 9: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

2부: 스프링 프레임워크 통합

2부에서는 스프링 프레임워크와 스프링 MVC에 대한 내용을 시작한다. 먼저 의존성

주입(DI; Dependency Injection), 제어 반전(IoC; Inversion of Control), 관점

지향 프로그래밍(AOP; Aspect-Oriented Programming)과 같은 주제를 다룬다.

XML과 어노테이션 기반 구성을 이용해 고급 스프링 프레임워크 프로젝트를 구성하

는 방법과 스프링 툴을 이용해 빈 유효성 검사와 국제화를 처리하는 법을 배운다. 스

프링 MVC 컨트롤러와 스프링 웹 서비스를 이용해 RESTful과 SOAP 웹 서비스를

개발하는 방법과 스프링 프레임워크에 내장된 유연한 메시징 시스템을 이용하는 법

을 배운다. 또한 AMQP(Advanced Message Queuing Protocol, 고급 메시지 대

기열 프로토콜)에 대해 알아보고 RabbitMQ를 설치하고 구성 및 사용하는 법을 배

운다.

3부: JPA와 하이버네이트 ORM을 이용한 데이터 저장

3부에서는 객체를 데이터베이스에 저장하는 다양한 방법과 데이터 지속성을 집중적

으로 다룬다. JDBC를 이용해 엔터티를 저장할 때 발생하는 기본적인 문제를 확인하

고 객체-관계형 매퍼(O/RM; Object-Relational Mapper)와 하이버네이트 ORM

및 API에 대해 알아본 다음 사용하는 O/RM 구현에 관계없이 공용 API로 프로그램

을 작성할 수 있게 추상화를 제공하는 자바 지속성 API를 알아볼 것이다. 스프링 데

이터를 소개하고 이를 사용해 지속성 코드 없이 지속성 애플리케이션을 작성하는 방

법을 알아본다. 또한 저장된 데이터를 하이버네이트 서치와 아파치 루씬을 전체 텍

스트 검색 툴로 사용해 검색하는 몇 가지 방법도 배운다.

VIII

Page 10: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

4부: 스프링 시큐리티를 이용한 애플리케이션 보호

마지막 4부에서는 인증과 권한 부여의 개념을 소개하고 이를 구현하는 몇 가지 기법

을 설명한다. 그런 다음 스프링 시큐리티를 스프링 프레임워크 애플리케이션으로 통

합하는 방법을 알아본다. 또한 OAuth 1.0a와 OAuth 2.0을 사용해 웹 서비스를 보

호하는 방법과 커스텀 액세스 토큰 형식을 작성해 OAuth 2.0 구현을 강화하는 방법

도 배운다.

이 책에서 다루지 않는 내용

이 책은 자바 SE 7과 8에 추가된 새로운 기능에 대해서는 간단하게 다루지만 기본 자

바 구문이나 자바 SE 플랫폼에 대해서는 설명하지 않는다. 또한 자바 기반 콘솔 또는

데스크톱 애플리케이션이나 애플릿을 작성하는 방법도 다루지 않는다. 이러한 주제

에 대해 배우려면 이를 전문적으로 다루는 서적을 추천한다.

또한 이 책에서는 자바 EE 애플리케이션 서버 환경을 관리하는 방법은 다루지 않는

다. 애플리케이션 서버와 웹 컨테이너는 매우 다양하며 제품마다 관리하는 방법도

다르다. 어떤 애플리케이션 서버를 사용할지는 애플리케이션의 특성과 비즈니스 요

구사항, 비즈니스 관행, 그리고 서버 환경에 따라 달라진다. 가장 많이 사용되는 일

부 제품만 소개한다고 해도 애플리케이션 서버를 관리하는 방법을 따로 설명한다는

것은 비현실적이다. 선택한 자바 EE 애플리케이션 서버나 웹 컨테이너를 배포하고

관리하는 방법을 배우는 가장 좋은 방법은 해당 제품의 설명서를 읽고 직접 경험해보

는 것이다(이 책의 예제를 실행하려면 웹 컨테이너 사용이 필수적이므로 2장에서는

아파치 톰캣에 애플리케이션을 설치, 시작, 중지, 배포하는 기본적인 작업 방법을 설

명한다).

IX

Page 11: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

“이 책이 적합하지 않은 독자” 절에서 소개한 것처럼 이 책은 이 절에서 나열한 기본

기술과 개념을 설명하기 위한 책은 아니다. 또한 다음의 자바 EE 7 컴포넌트는 대부

분의 단순한 웹 컨테이너에서 지원되지 않고 스프링 프레임워크와 관련 프로젝트를

사용할 때 필요 없기 때문에 이 책에서 다루지 않는다.

•RESTful웹서비스용자바API(JAX-RS)2.0–JSR339

•JSF(자바서버페이스)2.2–JSR344

•EJB(엔터프라이즈자바빈즈)3.2–JSR345

•CDI(컨텍스트및의존성주입)1.1–JSR346

•JCache–JSR107

•상태관리–JSR350

•자바플랫폼용배치애플리케이션–JSR352

•자바EE용동시성유틸리티–JSR236

•JSON처리용자바API–JSR353

필요한 툴

이 책의 예제를 완료하고 실행하려면 몇 가지 툴이 필요하다. 먼저 컴퓨터에 다음과

같은 항목을 설치한다.

•아파치메이븐버전3.1.1이상

•특정작업을위한명령줄과이러한명령줄을이용할수있는운영체제(다른말로하면스마트폰이

나태블릿에서는예제를컴파일하고실행할수없다).

•구성파일을편집하는등의작업에적합한고급텍스트편집기.윈도우메모장이나애플의텍스트

편집기는텍스트편집기로적합하지않다.쓸만한텍스트편집기를찾고있다면다음제품을확인

해보자.

■ 윈도우-노트패드(Notepad)++또는서브라임텍스트2

■ 맥OSX-텍스트랭글러(TextWrangler),서브라임텍스트2,Vim

■ 리눅스-서브라임텍스트2,Vim

X

Page 12: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

자바 SE 8용 JDK

시스템에 자바 SE 8용 JDK(Java Development Kit)를 설치해야 한다. 자바 SE 8은

2014년 3월 18일 출시됐다. 오라클의 표준 자바 SE 다운로드 사이트에서 JDK를 내

려받을 수 있다. JDK는 항상 최신 버전을 사용하고 자신의 시스템에 맞는 버전과 아

키텍처를 내려받아야 한다. 예를 들어, 64비트 프로세서와 64비트 운영체제를 사용

하고 있다면 64비트 자바 설치 관리자를 내려받아야 한다.

통합 개발 환경(IDE)

코드 예제를 컴파일 및 실행하고 실험하려면 통합 개발 환경(IDE; Integrated

Development Environment)이 필요하다. IDE는 대화식 개발 환경이라고도 하며

소프트웨어 개발자가 소프트웨어를 개발하기 위한 코딩, 빌드, 배포 및 디버깅 기능

을 제공하는 소프트웨어 애플리케이션이다. 현재 다양한 자바 IDE가 출시돼 있으며

상대적으로 많이 사용되는 제품들이 있다. IDE의 좋고 나쁨을 판단하는 기준의 상당

수는 개인의 관점과 작업 방법과 관련이 있다. 한 개발자에게 완벽한 IDE가 다른 개

발자에게는 사용하기 어려운 IDE일 수 있다. 일반적으로 이야기하면 지능형 코드 제

안, 코드 완성, 코드 생성, 구문 검사, 맞춤법 검사, 프레임워크 통합(스프링 프레임

워크, JPA, 하이버네이트 ORM 등)을 제공하는 IDE를 사용하면 그렇지 않은 IDE를

사용할 때보다 훨씬 생산성이 높은 작업 환경을 구축할 수 있다.

현재 사용 중인 IDE가 있거나 텍스트 편집기와 명령줄을 사용하는 경우도 있을 것이

다. 다만 현재 사용 중인 IDE가 이 책에서 소개하는 예제를 실행하기에 적합하지 않

을 수 있다. IDE를 선택하거나 현재 사용 중인 IDE가 적합한지 판단하려면 IDE가

코드 완성/제안, 구문 검사 기능을 제공하는지, 그리고 자바 EE, 스프링 프레임워크,

스프링 시큐리티, 스프링 데이터, JPA, 하이버네이트 ORM과의 통합을 지원하는지

확인해야 한다. 즉, 자바 EE, 스프링, JPA 및 하이버네이트 구성의 유효성을 확인하

XI

Page 13: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

고 이러한 유효성에 문제가 있는지 여부를 알려줄 수 있어야 한다. 이 책에서는 다양

한 언어를 지원하는 세 가지 IDE를 간단하게 소개한다.

넷빈즈 IDE 8.0

마이크로소프트 비주얼 스튜디오가 .NET 개발의 표준 IDE이듯이 넷빈즈는 오라클

에서 후원하는 표준 무료 IDE다. 다만 가장 인기 있는 자바 IDE는 아니다. 넷빈즈

IDE 8.0의 경우에만 자바 SE 8과 자바 EE 7을 지원하며 이전 버전에서는 지원하지

않는다. 넷빈즈는 강력한 기능을 갖추고 있으며 모든 자바 EE 기능을 기본적으로 지

원하며 C, C++ 및 PHP 개발도 지원한다. 플러그인을 이용해 기능을 확장할 수 있

으며 스프링 프레임워크와 하이버네이트 ORM을 위한 플러그인도 있다. 그러나 넷

빈즈는 다른 IDE만큼 기능이 다양하지는 않기 때문에 이 책에서 추천하지는 않는다.

이 책에서는 넷빈즈용 코드 예제를 제공하지는 않지만 넷빈즈를 선호하는 경우 메이

븐 프로젝트의 형태로 예제 코드를 가져올 수 있다.

자바 EE 개발자용 이클립스 IDE 4.4

이클립스(Eclipse)는 전 세계적으로 가장 인기 있는 무료 자바 IDE다. 이클립스의

강점 중 하나는 단순한 플러그인 지원 수준을 초월하는 탁월한 확장성이다. 이클립

스 플랫폼을 이용하면 특정 작업과 워크플로에 맞게 IDE를 완벽하게 커스터마이즈

할 수 있으며 스프링 프레임워크, 스프링 데이터, 스프링 시큐리티, 하이버네이트

ORM 등을 위한 플러그인과 확장기능을 이미 가지고 있다. 스프링 커뮤니티에서는

스프링 툴 스위트(STS; Spring Tool Suite)라는 스프링 기반 프로젝트에 매우 적합

하게끔 커스터마이즈된 버전의 이클립스를 제공하고 있다. 그러나 필자는 이클립스

가 효과적이고 효율적으로 사용하기가 매우 어려운 IDE라고 생각한다.

XII

Page 14: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

아주 간단한 작업을 하기 위해 복잡한 과정을 거쳐야 하는 경우가 많다. 지금까지 자

바 SE 및 EE와 호환되는 이클립스 버전은 상당히 나중에 출시되는 경우가 많았다.

이 책을 집필하는 동안 이클립스 커뮤니티에서는 아직 자바 SE 8 및 자바 EE 7과 호

환되는 이클립스 IDE를 출시하지 않았다. 따라서 이 책의 예제를 실행하는 IDE로

이클립스 IDE를 추천하지는 않는다. 이클립스를 사용하려면 2014년 6월에 출시된

자바 EE 개발자용 이클립스 IDE 4.4를 사용하는 것이 좋다. 경우에 따라 이전 버전

을 사용해야 할 수 있으며 이 경우 이 책에서 소개하는 기능이 일부 지원되지 않을 수

있다.

인텔리J IDEA 14 얼티밋 버전

제트브레인즈(JetBrains)의 인텔리J IDEA는 커뮤니티(무료) 및 얼티밋(유료) 버전

을 사용할 수 있는 다기능 자바 IDE다. 필자는 개인적으로 이 제품이 가장 사용하기

쉽고 강력한 자바 IDE라고 생각한다. 다른 어떤 IDE보다 높은 수준의 코드 제안/완

성 및 프레임워크 지원 기능을 제공하며 정식 출시 전 자바 SE 및 자바 EE 시험 버전

도 가장 적극적으로 지원한다. 예를 들어, 인텔리J IDEA 12는 2012년 12월부터 자바

SE 8을 지원하기 시작했는데 이것은 자바 SE 8이 정식 출시되기 15개월 전이고 이클

립스 IDE보다 18개월이나 먼저 지원하기 시작한 것이다. 자바 SE와 자바 EE가 출시

되기 전에 새 버전을 테스트하고 싶거나 출시 후 곧바로 사용하고자 한다면 인텔리J

IDEA가 유일한 선택사항이다.

다만 이러한 강력한 기능을 사용하려면 대가가 필요하다. 대부분의 자바 SE 프로젝

트에는 커뮤니티 버전으로도 충분하지만 자바 EE, 스프링 프로젝트 및 하이버네이트

ORM에 대한 지원 기능을 제대로 사용하려면 얼티밋 버전을 구매해야 한다. 얼티밋

버전은 기업, 개인 및 학생을 대상으로 합리적이고 저렴한 가격으로 판매되며, 교육

XIII

Page 15: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

기관과 오픈소스 기관에는 각각 강의용 및 프로젝트용 무료 라이선스가 제공된다.

인텔리J IDEA 14 얼티밋 버전의 30일 무료 평가판을 다운로드하고 사용하다가 언제

든지 라이선스를 구매(또는 자격 조건에 해당하는 경우 무료 라이선스를 취득)할 수

있다. 또한 이 책의 뒤표지에는 인텔리J IDEA 14 얼티밋 버전의 90일 개인용 라이선

스 쿠폰이 포함돼 있다! 이 책의 모든 코드 예제에는 인텔리J IDEA 얼티밋 버전을 사

용하는 것이 좋다.

자바 EE 7 웹 컨테이너

이 책을 진행하는 데 필요한 마지막 툴은 자바 EE 7의 서블릿, JSP, JUEL 및 웹소켓

사양을 구현하는 자바 EE 웹 컨테이너다. 이 주제에 대해서는 2장에서 많이 사용되

는 웹 컨테이너와 애플리케이션 서버를 소개하고 아파치 톰캣 8.0을 다운로드하고

설치 및 사용하는 방법을 설명하면서 자세하게 알아보겠다.

조판 관례

이 책에서는 특정 항목이나 코드 내 특정 내용에 주의를 모으기 위해 몇 가지 관례를

사용했다. 이 절에서는 이러한 관례에 대해 알아보자.

참고 참고는 현재 설명하고 있는 주제와 어느 정도 관련이 있는 참고, 팁, 힌트, 트릭 및 기타

흥미로운 정보를 제공한다. 참고 상자의 내용에는 관심을 두는 것이 좋다.

경고 경고는 현재 설명하는 내용과 직접적인 관련이 있고 반드시 기억해야 하는 내용을 포

함한다. 경고는 함정, 위험 및 잠재적인 데이터 손실이나 손상과 관련이 있다. 경고 상자의 내용에

는 주의를 기울여야 한다.

XIV

Page 16: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

본문에는 몇 가지 다른 스타일을 사용한다.

•새용어와중요한단어는처음소개될때강조표시한다.강조표시는본문에서처음나올때가아

니라처음으로설명할때적용된다.

•키보드조합은Ctrl+S,Ctrl+Alt+F8등의형식으로표시한다.

•본문내의파일명,URL이아닌URI,클래스및메서드이름,기본형및코드는Sample형식으로표

시한다.

•코드변수,메서드및생성자매개변수이름과요청매개변수는Sample형식으로표시한다.

•사용자가대화상자,프롬프트또는폼필드에입력해야하는값은Sample형식으로표시한다.

본문 내에서 예제 코드는 다음과 같이 표시한다.

This is a code listing sample.

예제 코드에서 특히 중요한 부분이나 이전과 달라진 부분은 강조를 위해 다음과 같이

볼드체로 표시한다.

This is an important code listing sample.

대부분의 코드 예제는 본문 사이에 간단하게 표시되지만 특히 긴 예제의 경우에는 예

제 I-1과 같은 형식으로 표시하고 예제의 번호로 참조한다.

예제 I-1: 예제 코드 예

This is what a code listing will look like.

마지막으로 본문 여백에 종종 아이콘을 표시하는 경우가 있다. 이 아이콘은 해당 단

락에서 설명하는 특정 작업을 수행하는 데 필요한 도구 모음 버튼을 나타낸다.

XV

Page 17: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

코드 예제

다른 소프트웨어 개발 서적과 마찬가지로 이 책에서도 주제를 설명하기 위해 코드

예제를 광범위하게 사용한다. 이러한 예제는 대부분 IDE에서 열고 컴파일 및 실행

할 수 있는 완전한 IDE 프로젝트이며 위키북스 및 wrox.com의 코드 예제 페이지

에서 내려받을 수 있다. http://wikibook.co.kr/projavaforwebapps으로 가서 예

제 코드 탭을 선택하거나 http://www.wrox.com/go/projavaforwebapps로 가

서 Download Code 탭을 클릭하면 전체 코드 예제를 ZIP 파일 형태로 내려받을 수

있다. 각 장의 코드 예제는 인텔리J IDEA 프로젝트와 이클립스 프로젝트의 두 가지

버전이 있으며, 자신이 사용 중인 IDE에 맞는 버전을 선택하면 된다. 이러한 두 IDE

외의 다른 IDE를 사용하는 경우 인텔리J IDEA 프로젝트를 메이븐 프로젝트로 가져

올 수 있을 것이다.

이 책의 초반부에는 예제를 내려받을 필요 없이 IDE에서 처음부터 예제를 작성하는

것이 가능하지만 점차 예제가 복잡해지면 이렇게 하기가 불가능하다. 예제 코드 전

체를 책으로 보여주는 것은 비현실적이기 때문에 필수적인 부분만 보여주고 있기 때

문이다. 반복적인 코드는 대부분 생략했다. 예를 들어, 2부에서 4부까지의 예제에서

스프링 프레임워크 구성은 대부분 동일하다. 이러한 경우 전체 구성을 다 보여주기

보다는 이전과 달라진 부분만 보여주는 것이 효과적일 것이다. 따라서 예제를 실행

하고 테스트하려면 위키북스나 wrox.com의 코드 다운로드 페이지에서 예제 코드

를 내려받아야 한다.

각 장의 첫 번째 페이지에는 “코드 예제”라는 부분이 있다. 이 부분에서는 해당 장의

모든 코드 예제 이름을 나열하고 코드 예제를 다운로드하는 링크를 안내한다. 일부

장을 제외한 대부분의 장에서 코드 예제 다운로드를 제공한다.

XVI

Page 18: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

메이븐 의존성

이 책의 코드 예제에서는 스프링 프레임워크, 하이버네이트 ORM 및 스프링 시큐리

티 같은 타사 의존성에 많이 의존하고 있다. 이러한 의존성 JAR 파일을 코드 예제에

포함하면 큰 파일을 불필요하게 반복적으로 다운로드해야 하므로 아파치 메이븐 의

존성 관리 기능을 이용해 모든 예제 프로젝트를 메이븐 프로젝트로 구성했다. 각 프

로젝트를 열면 IDE가 로컬 메이븐 리포지토리에서 자동으로 의존성을 확인하거나

필요한 경우 로컬 메이븐 리포지토리로 의존성을 다운로드한다.

각 장의 첫 번째 페이지에는 “새로운 메이븐 의존성”이라는 부분이 있다. 이 부분에

는 이전의 모든 의존성에 이어 해당 장에서 추가로 사용할 메이븐 의존성이 나열된

다. 각 예제 프로젝트의 pom.xml 파일을 참조해서 의존성을 확인할 수도 있다. 일

부 장을 제외한 대부분의 장에서 새로운 메이븐 의존성이 추가된다.

각 메이븐 의존성에는 의존성을 사용할 수 있는 클래스패스(classpath)를 정의하는

범위가 있다. 가장 일반적인 범위는 “컴파일(compile)” 범위로서 컴파일 클래스패

스, 단위 테스트 컴파일과 실행 클래스패스, 그리고 애플리케이션을 실행할 때 최종

적인 런타임 클래스패스에서 의존성을 사용할 수 있게 지정한다. 자바 EE 웹 애플리

케이션의 경우 이 범위를 사용하면 배포되는 애플리케이션으로 의존성이 복사된다

는 의미다. “런타임(runtime)” 범위는 의존성을 단위 테스트 실행 및 런타임 실행 클

래스패스의 프로젝트에서 사용할 수 있지만 컴파일 범위와는 달리 애플리케이션이

나 해당 단위 테스트를 컴파일할 때는 사용할 수 없도록 지정한다. 런타임 의존성은

배포되는 애플리케이션으로 복사된다. 마지막으로 “사전 제공(provided)” 범위는 애

플리케이션이 실행되는 컨테이너에서 의존성을 제공하는 것을 가리킨다. 자바 EE 애

플리케이션의 경우 의존성이 이미 서블릿 컨테이너 또는 애플리케이션 서버의 클래

스패스에 있으며 배포되는 애플리케이션으로 복사되지 않는다는 의미다. 메이븐과

XVII

Page 19: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

IDE는 애플리케이션과 단위 테스트를 컴파일할 때 알아서 의존성을 제공해준다. 이

밖에도 다른 메이븐 범위가 있지만 이 책에서는 여기서 소개한 범위만 사용한다. 본

문과 예제 프로젝트에 나오는 메이븐 의존성 중 일부에는 특정 의존성을 무시하는

제외(exclusion) 요소가 지정돼 있다. 이를 임시 의존성(transient dependency)이

라 한다. 이러한 제외 요소는 일반적으로 중복된 항목을 명확하게 구분하기 위한 것

이다. 의존성이 현재 사용 중인 버전보다 이전 버전의 의존성에 의존하는 경우 제외

요소를 통해 이러한 차이가 있음을 명시하고 메이븐의 근접 알고리즘에 의해 발생하

는 문제를 방지한다. 일부 제외 요소는 자바 SE 또는 자바 EE의 신규 버전에서 의존

성을 이미 제공하거나 의존성 ID가 변경됐기 때문에 사용했다. 이러한 이유로 제외

요소가 사용된 경우 해당 본문에서 이를 명시한다.

보안을 책의 끝부분에서 다루는 이유

솔직히 말해서 애플리케이션 보안은 거추장스럽다. 제품에 인증과 권한 부여를 추가

하는 기술과 기법을 적용하면 코드가 복잡해져서 배우는 과정에 방해가 된다. 사실

보안에 대해 가장 먼저 생각하는 것은 자연스러운 일이며 항상 보안을 염두에 두는

것도 잘못된 일이 아니다. 그러나 올바른 툴을 사용하면 프로젝트가 완료된 후(또는

거의 완료된 시점에) 간단하게 인증과 권한 부여를 추가할 수 있다. 이 책에서는 먼

저 업계 표준 툴을 이용해 다기능 고품질 웹 애플리케이션을 개발하는 기술을 배우는

데 초점을 맞춘다. 강력한 애플리케이션을 구축하기 위한 기술을 모두 터득한 후 4부

에서 애플리케이션에 인증과 권한 부여를 추가해 무단 및 악의적인 접근으로부터 애

플리케이션을 보호하는 방법을 배울 것이다.

XVIII

Page 20: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

정오표

최대한 정확한 내용을 전달하기 위해 최선을 다하고 있지만 사람이 하는 일에 완벽

이란 있을 수 없기에 종종 실수가 발생한다. 이 책에서도 수정이 필요한 오류가 있을

수 있다. 사실 관계 오류나 오탈자, 코드에 잘못된 부분 등을 발견하면 꼭 알려주길

바란다! 이러한 정보는 다른 독자들이 문제를 해결하는 데는 물론이고 이 책의 개정

판을 개선하는 데도 큰 도움이 된다.

이 책의 정오표를 확인하려면 위키북스 홈페이지의 검색란에 이 책의 제목(자바 웹

개발 완벽 가이드)을 입력한다. 가장 빠른 방법은 ISBN(9788998139773)으로 검색

하는 것이다. 이 책의 페이지를 찾으면 정오표 탭을 클릭한다. 그러면 다른 독자들이

제출하고 위키북스 편집자가 확인한 정오표를 볼 수 있다. 직접 발견한 오류가 나오

지 않는다면 오탈자 등록 버튼을 클릭해 문제를 보고하는 내용을 입력한다. 오류를

확인하고 수정안을 제시하면 이 책의 정오표 페이지에서 소개하고 향후 개정판에서

는 문제를 수정할 것이다.

XIX

Page 21: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

엔터프라이즈 애플리케이션 개발

01. 자바 플랫폼 엔터프라이즈 에디션 소개............................................................46

자바 플랫폼 연대표............................................................................................................................46

초창기............................................................................................................................................................47

엔터프라이즈 자바의 탄생.....................................................................................................................48

자바 SE와 자바 EE의 동반 발전.........................................................................................................49

최신 플랫폼 기능.......................................................................................................................................52

계속된 발전.................................................................................................................................................57

기본적인 웹 애플리케이션의 구조 이해..............................................................................58

서블릿, 필터, 리스너 및 JSP................................................................................................................58

디렉터리 구조와 WAR 파일.................................................................................................................59

배포 설명자.................................................................................................................................................60

클래스 로더 아키텍처..............................................................................................................................61

엔터프라이즈 아카이브(EAR)...............................................................................................................62

정리...............................................................................................................................................................64

02. 웹 컨테이너 이용하기...........................................................................................................65

웹 컨테이너 선택..................................................................................................................................65

아파치 톰캣.................................................................................................................................................66

글래스피시...................................................................................................................................................68

제이보스 및 와일드플라이.....................................................................................................................68

기타 컨테이너와 애플리케이션 서버..................................................................................................69

이 책에서 톰캣을 사용하는 이유.........................................................................................................70

01 PART

XX

Page 22: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

톰캣 설치................................................................................................................................................70

윈도우 서비스로 설치............................................................................................................................71

명령줄 애플리케이션으로 설치..........................................................................................................71

커스텀 JSP 컴파일러 구성........................................................................................................74

톰캣에 애플리케이션 배포 및 배포 취소..........................................................................75

수동 배포 및 배포 취소.........................................................................................................................75

톰캣 관리자 사용.....................................................................................................................................76

IDE에서 톰캣 디버깅하기...........................................................................................................78

인텔리J IDEA 사용.................................................................................................................................78

이클립스 사용...........................................................................................................................................82

정리.............................................................................................................................................................87

03. 첫 번째 서블릿 작성.............................................................................................................88

서블릿 클래스 작성..........................................................................................................................89

서블릿이 확장하는 대상.......................................................................................................................90

이니셜라이저와 디스트로이어............................................................................................................92

배포를 위한 서블릿 구성.............................................................................................................94

설명자에 서블릿 추가............................................................................................................................94

서블릿과 URL 매핑................................................................................................................................95

서블릿 실행 및 디버깅..........................................................................................................................98

doGet(), doPost() 및 다른 메서드..................................................................................100

서비스 메서드 실행 중 수행해야 하는 작업................................................................................100

XXI

Page 23: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

HttpServletRequest 사용..................................................................................................................101

HttpServletResponse 사용..............................................................................................................104

초기화 매개변수를 이용한 애플리케이션 구성............................................................112

컨텍스트 초기화 매개변수 사용.........................................................................................................112

서블릿 초기화 매개변수 사용.............................................................................................................113

폼을 통한 파일 업로드..................................................................................................................116

고객 지원 프로젝트 소개......................................................................................................................116

파일 업로드를 위한 서블릿 구성.......................................................................................................117

파일 업로드 수신.....................................................................................................................................120

다중 스레드로부터 애플리케이션을 보호하는 방법..................................................121

요청과 스레드, 메서드 실행................................................................................................................122

공유 자원 보호.........................................................................................................................................123

정리.............................................................................................................................................................124

04. JSP로 콘텐츠 표시하기.................................................................................................. 125

output.println("<br />")보다는 <br />가 사용하기 쉽다......................................127

JSP의 장점............................................................................................................................................128

런타임에 JSP에서 일어나는 일.........................................................................................................129

첫 번째 JSP 작성.............................................................................................................................131

파일 구조....................................................................................................................................................131

지시문, 선언, 스크립트릿, 식..............................................................................................................133

코드 주석 지정.........................................................................................................................................135

JSP 임포트 추가.....................................................................................................................................137

지시문 사용...............................................................................................................................................138

<jsp> 태그 사용........................................................................................................................................142

XXII

Page 24: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

JSP에서 자바 사용하기(그리고 이를 피해야 하는 이유)......................................144

JSP에서 암시적 변수 사용..................................................................................................................144

JSP에서 자바를 사용하지 말아야 하는 이유................................................................................151

서블릿과 JSP의 결합.....................................................................................................................153

배포 설명자에서 JSP 프로퍼티 구성...............................................................................................153

서블릿에서 JSP로 요청 전달..............................................................................................................157

JSP 문서(JSPX)에 대한 간단한 소개................................................................................162

정리.............................................................................................................................................................165

05. 세션을 이용한 상태 유지................................................................................................ 166

세션이 필요한 이유..........................................................................................................................166

상태 유지....................................................................................................................................................167

사용자 기억하기......................................................................................................................................168

애플리케이션 워크플로 지원...............................................................................................................168

세션 쿠키 및 URL 다시 쓰기....................................................................................................169

세션 쿠키....................................................................................................................................................170

URL을 통한 세션 ID 전달...........................................................................................................172

세션 취약점...............................................................................................................................................176

세션에 데이터 저장하기...............................................................................................................180

배포 설명자에서 세션 구성.................................................................................................................180

데이터 저장 및 검색...............................................................................................................................183

데이터 제거...............................................................................................................................................189

세션에 더 복잡한 데이터 저장하기..................................................................................................191

세션의 유용한 적용..........................................................................................................................195

고객 지원 애플리케이션에 로그인 추가..........................................................................................196

리스너를 이용한 세션 변경 감지.......................................................................................................200

활성 세션의 목록 유지..........................................................................................................................203

XXIII

Page 25: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

세션을 사용하는 애플리케이션의 클러스터링..............................................................208

클러스터 내의 세션 ID 사용................................................................................................................208

세션 복제 및 장애 조치에 대한 이해...............................................................................................210

정리.............................................................................................................................................................212

06. JSP에서 식 언어 사용...................................................................................................... 213

식 언어......................................................................................................................................................214

식 언어의 목적.........................................................................................................................................214

기본 구문 이해....................................................................................................................................215

EL 식 배치.................................................................................................................................................217

EL 구문 작성하기.............................................................................................................................218

예약된 키워드...........................................................................................................................................219

연산자 우선순위......................................................................................................................................220

객체 프로퍼티 및 메서드......................................................................................................................226

EL 함수.......................................................................................................................................................228

정적 필드 및 메서드 접근....................................................................................................................229

열거형..........................................................................................................................................................230

람다 식........................................................................................................................................................231

컬렉션..........................................................................................................................................................232

EL 식에서 범위가 있는 변수 사용하기..............................................................................234

암시적 EL 범위 사용..............................................................................................................................235

암시적 EL 변수 사용..............................................................................................................................239

스트림 API를 이용한 컬렉션 접근........................................................................................242

중간 연산....................................................................................................................................................243

최종 연산 사용.........................................................................................................................................245

XXIV

Page 26: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

스트림 API의 실제 사용.......................................................................................................................246

식 언어로 자바 코드 대체....................................................................................................................248

정리.............................................................................................................................................................251

07. 자바 표준 태그 라이브러리 사용........................................................................... 252

JSP 태그 및 JSTL 소개...............................................................................................................253

태그 사용하기...........................................................................................................................................253

코어 태그 라이브러리(c 네임스페이스) 사용하기......................................................257

<c:out>.........................................................................................................................................................258

<c:url>..........................................................................................................................................................259

<c:if>.............................................................................................................................................................261

<c:choose>, <c:when>, <c:otherwise>.........................................................................................262

<c:foreach>...............................................................................................................................................263

<c:forTokens>.........................................................................................................................................265

<c:redirect>...............................................................................................................................................266

<c:import>..................................................................................................................................................266

<c:set>, <c:remove>..............................................................................................................................267

코어 라이브러리 태그 사용하기.........................................................................................................268

국제화 및 서식 지정 태그 라이브러리(fmt 네임스페이스) 사용하기............272

국제화 및 지역화 컴포넌트.................................................................................................................273

<fmt:message>........................................................................................................................................274

<fmt:setlocale>........................................................................................................................................276

<fmt:bundle>, <fmt:setbundle>.........................................................................................................276

<fmt:requestencoding>......................................................................................................................278

<fmt:timezone>, <fmt:setTimezone>..............................................................................................278

<fmt:formatdate>, <fmt:parsedate>................................................................................................279

XXV

Page 27: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

<fmt:formatnumber>, <fmt:parsenumber>.................................................................................280

i18n 및 서식 지정 라이브러리 태그 실제로 사용하기................................................................282

데이터베이스 접근 태그 라이브러리(sql 네임스페이스) 사용하기.......................................285

XML 프로세싱 태그 라이브러리(x 네임스페이스) ...................................................287

JSP 태그로 자바 코드 대체하기............................................................................................288

정리.............................................................................................................................................................291

08. 커스텀 태그 및 함수 라이브러리 작성............................................................ 292

TLD, 태그 파일 및 태그 핸들러.............................................................................................293

자바 표준 태그 라이브러리 TLD 읽기............................................................................................294

JSP 지시문과 태그 파일 지시문의 비교.........................................................................................302

HTML 템플릿으로 사용할 첫 번째 태그 파일 작성..................................................303

날짜 서식 지정 태그 핸들러 작성..........................................................................................306

EL 함수를 이용한 문자열 단축...............................................................................................311

커스텀 JSP 태그로 자바 코드 대체하기...........................................................................313

정리.............................................................................................................................................................320

09. 필터를 이용한 애플리케이션 개선...................................................................... 321

필터의 용도...........................................................................................................................................322

로깅 필터....................................................................................................................................................322

인증 필터....................................................................................................................................................322

압축 및 암호화 필터...............................................................................................................................323

오류 처리 필터.........................................................................................................................................323

XXVI

Page 28: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

필터 작성과 선언, 매핑.................................................................................................................324

필터 체인....................................................................................................................................................324

URI 패턴과 서블릿 이름 매핑하기....................................................................................................325

여러 요청 디스패처 형식에 매핑하기..............................................................................................325

배포 설명자 사용하기............................................................................................................................326

어노테이션 사용하기.............................................................................................................................327

프로그래밍 방식의 구성 사용하기....................................................................................................328

필터의 올바른 순서 지정.............................................................................................................329

URL 패턴 매핑과 서블릿 이름 매핑 비교......................................................................................329

간단한 예제로 필터 순서 이해하기..................................................................................................331

비동기 요청 처리에 필터 사용하기..................................................................................................333

필터의 실용적인 사용법...............................................................................................................339

간단한 로깅 필터 추가..........................................................................................................................340

필터를 사용한 응답 콘텐츠 압축.......................................................................................................341

필터를 이용한 인증 간소화........................................................................................................347

정리.............................................................................................................................................................349

10. 웹소켓을 이용한 대화식 애플리케이션 개발............................................ 350

진화: AJAX에서 웹소켓으로....................................................................................................351

문제: 서버에서 브라우저로 새 데이터 얻기...................................................................................352

해결책 1: 잦은 폴링.................................................................................................................................352

해결책 2: 긴 폴링....................................................................................................................................353

해결책 3: 청크 인코딩...........................................................................................................................355

해결책 4: 애플릿과 어도비 플래시...................................................................................................356

웹소켓: 아무도 몰랐던 해결책의 재발견.........................................................................................358

XXVII

Page 29: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

웹소켓 API.............................................................................................................................................362

HTML 5(자바스크립트) 클라이언트 API........................................................................................363

자바 웹소켓 API......................................................................................................................................365

웹소켓을 이용한 멀티플레이어 게임 개발.......................................................................369

기본적인 틱-택-토 알고리즘 구현...................................................................................................369

서버 엔드포인트 만들기.......................................................................................................................370

자바스크립트 게임 콘솔 작성.............................................................................................................375

웹소켓 틱-택-토 테스트......................................................................................................................381

클러스터에서 웹소켓을 이용한 통신...................................................................................382

서블릿 인스턴스 두 개로 간단한 클러스터 시뮬레이션............................................................383

이진 메시지 주고받기............................................................................................................................385

시뮬레이트된 클러스터 애플리케이션 테스트..............................................................................387

고객 지원 애플리케이션에 "담당자와 채팅" 기능 추가하기.................................389

인코더와 디코더를 이용한 메시지 변환..........................................................................................390

채팅 서버 엔드포인트 만들기.............................................................................................................392

자바스크립트 채팅 애플리케이션 작성하기..................................................................................396

정리.............................................................................................................................................................399

XXVIII

Page 30: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

11. 로깅을 활용한 애플리케이션 모니터링............................................................ 400

로깅의 개념 이해...............................................................................................................................401

로그를 사용해야 하는 이유.................................................................................................................402

로그에 추가할 수 있는 콘텐츠...........................................................................................................403

로그를 기록하는 방법............................................................................................................................404

로깅 레벨 및 범주 사용.................................................................................................................407

다양한 로깅 레벨을 사용하는 이유..................................................................................................407

정의된 로깅 레벨.....................................................................................................................................408

로깅 범주가 작동하는 방법.................................................................................................................409

로그 여과가 작동하는 방법.................................................................................................................409

로깅 프레임워크 선택....................................................................................................................409

API와 구현 비교......................................................................................................................................410

성능..............................................................................................................................................................411

아파치 커먼즈 로깅 및 SLF4J 소개.................................................................................................411

log4j 2 소개...............................................................................................................................................413

애플리케이션에 로깅 통합하기...............................................................................................418

log4j 2 구성 파일 만들기.....................................................................................................................418

웹 필터로 피시 태깅 활용하기.................................................................................................422

자바 코드를 이용한 로깅 문 작성.....................................................................................................424

JSP에서 로그 태그 라이브러리 사용하기......................................................................................426

고객 지원 애플리케이션에서 로깅하기...........................................................................................427

정리.............................................................................................................................................................427

XXIX

Page 31: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

스프링 프레임워크와의 통합

12. 스프링 프레임워크 소개................................................................................................... 430

제어 반전과 의존성 주입......................................................................................................................432

관점 지향 프로그래밍............................................................................................................................433

데이터 접근과 트랜잭션 관리.............................................................................................................433

애플리케이션 메시징.............................................................................................................................433

웹 애플리케이션을 위한 모델-뷰-컨트롤러 패턴......................................................................434

스프링 프레임워크의 장점..........................................................................................................434

논리적 코드 그룹화................................................................................................................................435

하나의 코드 기반을 활용하는 여러 사용자 인터페이스............................................................435

애플리케이션 컨텍스트.................................................................................................................436

스프링 프레임워크 시동...............................................................................................................438

배포 설명자를 이용한 스프링 시동..................................................................................................439

이니셜라이저에서 프로그래밍 방식으로 스프링 시동...............................................................442

스프링 프레임워크 구성...............................................................................................................446

XML 구성 만들기....................................................................................................................................449

하이브리드 구성 만들기...............................................................................................................452

@Configuration을 이용한 자바 기반 스프링 구성.................................................458

빈 정의 프로필의 활용..................................................................................................................463

프로필이 작동하는 방법.......................................................................................................................464

안티패턴과 보안에 대한 고려.............................................................................................................467

정리.............................................................................................................................................................468

02 PART

XXX

Page 32: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

13. 컨트롤러로 서블릿 대체하기....................................................................................... 469

@RequestMapping....................................................................................................................470

@RequestMapping 속성을 이용해 요청의 일치 범위 줄이기.............................................470

컨트롤러 메서드 매개변수 지정.........................................................................................................476

컨트롤러 메서드에 유효한 반환형 선택..........................................................................................486

스프링 프레임워크의 모델과 뷰 패턴 사용.....................................................................489

명시적 뷰와 뷰 이름 사용....................................................................................................................490

암시적 뷰와 모델 속성 사용................................................................................................................493

응답 엔터티 반환.....................................................................................................................................495

폼 객체 활용.........................................................................................................................................501

모델에 폼 객체 추가...............................................................................................................................502

스프링 프레임워크의 <form> 태그 사용.........................................................................................503

제출된 폼 데이터 획득..........................................................................................................................505

고객 지원 애플리케이션 업데이트........................................................................................506

다중 파트 지원 활성화..........................................................................................................................506

서블릿을 스프링 MVC 컨트롤러로 변환........................................................................................508

커스텀 다운로딩 뷰 작성......................................................................................................................509

정리.............................................................................................................................................................511

14. 서비스와 리포지토리로 컨트롤러 지원하기............................................... 512

모델-뷰-컨트롤러와 컨트롤러-서비스-리포지토리..............................................513

프로그램 로직의 다양한 유형.............................................................................................................514

리포지토리 - 지속성 로직...................................................................................................................515

서비스 - 비즈니스 로직.......................................................................................................................515

컨트롤러 - 사용자 인터페이스 로직................................................................................................516

XXXI

Page 33: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

웹 애플리케이션 컨텍스트 대신 루트 애플리케이션 컨텍스트 사용.............518

여러 사용자 인터페이스에서 루트 애플리케이션 재사용.........................................................518

컨트롤러에서 서비스로 비즈니스 로직 옮기기............................................................................520

리포지토리를 데이터 저장소로 사용................................................................................................525

비동기 및 예약 실행으로 서비스 기능 향상...................................................................530

실행자와 스케줄러..................................................................................................................................531

스케줄러와 비동기식 지원 구성.........................................................................................................532

@Async 메서드 작성 및 사용...........................................................................................................534

@Scheduled 메서드 작성 및 사용.................................................................................................535

웹소켓에 로직 계층 분리 적용.................................................................................................537

스프링 애플리케이션 컨텍스트로 컨테이너가 관리하는 객체 추가.....................................537

스프링 웹소켓 구성자 사용.................................................................................................................539

웹소켓은 비즈니스 로직을 위한 인터페이스일 뿐이다.............................................................541

정리.............................................................................................................................................................546

15. 스프링 프레임워크 i18n을 이용한 애플리케이션 국제화........... 547

스프링 프레임워크 i18n이 필요한 이유............................................................................547

쉬운 국제화 방법.....................................................................................................................................548

직접 오류 메시지 지역화하기.............................................................................................................549

기본 국제화 및 지역화 API 사용...........................................................................................549

리소스 번들과 메시지 형식.................................................................................................................549

메시지 원본 사용.....................................................................................................................................552

메시지 원본을 활용한 JSP 국제화...................................................................................................554

스프링 프레임워크에서 국제화 구성...................................................................................555

메시지 원본 만들기................................................................................................................................556

로캘 확인자...............................................................................................................................................558

핸들러 인터셉터를 이용한 로캘 변경..............................................................................................560

사용자 프로필 로캘 설정 제공하기..................................................................................................561

XXXII

Page 34: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

표준 시간대 지원.....................................................................................................................................562

테마를 통해 국제화를 개선하는 방법..............................................................................................563

코드 국제화...........................................................................................................................................564

<spring:message> 태그 활용...........................................................................................................565

깔끔한 애플리케이션 오류 처리.........................................................................................................567

고객 지원 애플리케이션 업데이트........................................................................................571

메시지 원본 직접 사용..........................................................................................................................572

정리.............................................................................................................................................................577

16. JSR 349, 스프링 프레임워크 및 하이버네이트

유효성 검사기를 활용한 빈 유효성 검사..................................................... 578

빈 유효성 검사의 기본 개념......................................................................................................579

하이버네이트 유효성 검사기의 장점................................................................................................581

어노테이션 메타데이터 모델...............................................................................................................582

스프링 프레임워크를 이용한 빈 유효성 검사...............................................................................583

스프링 프레임워크 컨테이너에서 유효성 검사 구성................................................583

스프링 유효성 검사기 빈 구성...........................................................................................................584

오류 코드 지역화 설정..........................................................................................................................586

메서드 유효성 확인 빈 후처리기 사용............................................................................................587

동일한 유효성 검사 빈을 사용하도록 스프링 MVC 구성........................................................589

빈에 제약조건 유효성 검사 어노테이션 추가................................................................590

기본 제공 제약조건 어노테이션.........................................................................................................590

공통적인 제약조건 속성.......................................................................................................................591

제약조건의 실제 사용............................................................................................................................592

@Valid를 이용한 재귀적인 유효성 검사........................................................................................594

유효성 검사 그룹 사용..........................................................................................................................596

컴파일 시 제약조건의 적합성 확인..................................................................................................598

XXXIII

Page 35: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

메서드 유효성 검사를 위한 스프링 빈 구성...................................................................599

구현이 아닌 인터페이스에 어노테이션 지정.................................................................................599

메서드 매개변수에서 제약조건과 재귀적인 유효성 검사 사용..............................................600

메서드 반환값의 유효성 검사.............................................................................................................601

메서드 유효성을 검사할 클래스 지정..............................................................................................602

스프링 MVC 컨트롤러에서 매개변수 유효성 검사 사용..........................................................603

사용자에게 유효성 검사 오류 표시..................................................................................................605

유효성 검사 제약조건 작성........................................................................................................608

커스텀 제약조건에서 다른 제약조건 상속.....................................................................................609

제약조건 유효성 검사기 만들기.........................................................................................................610

제약조건 유효성 검사기의 수명주기 이해.....................................................................................612

고객 지원 애플리케이션에 유효성 검사 통합................................................................613

정리.............................................................................................................................................................616

17. RESTful과 SOAP 웹 서비스...................................................................................... 617

웹 서비스................................................................................................................................................618

초창기의 웹 서비스 SOAP..................................................................................................................619

간단한 해결책을 제시하는 RESTful 웹 서비스...........................................................................620

스프링 MVC를 이용한 RESTful 웹 서비스 구성......................................................630

스테레오타입 어노테이션을 이용한 컨트롤러 구분...................................................................631

별도의 웹과 REST 애플리케이션 컨텍스트 만들기...................................................................632

RESTful 웹 서비스에서 오류 상황 처리.........................................................................................635

RESTful 응답과 컨트롤러 메서드 매핑..........................................................................................640

인덱스 엔드포인트를 이용한 검색 개선..........................................................................................644

웹 서비스 엔드포인트 테스트...................................................................................................646

테스트 툴 선택.........................................................................................................................................647

웹 서비스에 요청 수행..........................................................................................................................647

XXXIV

Page 36: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

SOAP를 위한 스프링 웹 서비스 사용...............................................................................650

계약 우선 XSD와 WSDL 작성...........................................................................................................651

SOAP 디스패처 서블릿 구성 추가...................................................................................................654

SOAP 엔드포인트 만들기...................................................................................................................656

정리.............................................................................................................................................................660

18. 메시징과 클러스터링 활용을 통한 유연성과 안정성 향상............... 661

메시징과 클러스터링이 필요한 시점 알기.......................................................................662

애플리케이션 메시징.............................................................................................................................662

클러스터링 소개......................................................................................................................................666

메시징과 클러스터링이 함께 작동하는 방법.................................................................................671

애플리케이션에 메시징 지원을 추가하는 방법............................................................675

애플리케이션 이벤트 만들기...............................................................................................................675

애플리케이션 이벤트 구독...................................................................................................................676

애플리케이션 이벤트 게시...................................................................................................................678

클러스터에서 메시지를 배포하는 방법...........................................................................................680

배포를 지원하기 위한 이벤트 업데이트..........................................................................................681

커스텀 이벤트 멀티 캐스터 생성 및 구성......................................................................................683

웹소켓을 이용한 이벤트 전송 및 수신............................................................................................685

멀티캐스트 패킷으로 노드 검색.........................................................................................................687

다중 배포를 통한 클러스터 시뮬레이션..........................................................................................691

AMQP를 이용한 메시지 배포..................................................................................................692

AMQP 브로커 구성................................................................................................................................694

AMQP 멀티캐스터 만들기..................................................................................................................695

AMQP 지원 애플리케이션 실행........................................................................................................698

정리.............................................................................................................................................................699

XXXV

Page 37: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

JPA와 하이버네이트 ORM을 이용한

애플리케이션 개발

19. 자바 지속성 API와 하이버네이트 ORM 소개......................................... 702

데이터 지속성......................................................................................................................................702

플랫 파일 엔터티 저장소......................................................................................................................703

구조화된 파일 저장소............................................................................................................................704

관계형 데이터베이스 시스템...............................................................................................................704

객체 지향 데이터베이스.......................................................................................................................705

스키마리스 데이터베이스 시스템......................................................................................................706

객체-관계형 매퍼 소개.................................................................................................................707

엔터티 저장의 문제 이해......................................................................................................................708

편리한 엔터티 지속성을 구현하는 O/RM......................................................................................710

표준 O/RM API를 제공하는 JPA.....................................................................................................711

하이버네이트 ORM의 장점.................................................................................................................713

하이버네이트 ORM에 대한 간단한 소개 ........................................................................714

하이버네이트 매핑 파일 사용.............................................................................................................714

세션 API.....................................................................................................................................................716

SessionFactory에서 세션 얻기.......................................................................................................719

스프링 프레임워크로 SessionFactory 만들기...........................................................................721

관계형 데이터베이스 준비..........................................................................................................722

MySQL과 MySQL 워크벤치 설치...................................................................................................723

MySQL JDBC 드라이버 설치............................................................................................................726

톰캣에서 연결 리소스 만들기.............................................................................................................727

메이븐 의존성에 대한 참고 사항............................................................................................727

정리.............................................................................................................................................................728

03 PART

XXXVI

Page 38: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

20. JPA 어노테이션을 이용한 엔터티와 테이블 매핑............................ 729

간단한 엔터티로 시작하기..........................................................................................................730

엔터티 표시하기와 테이블로 매핑하기...........................................................................................731

JPA가 엔터티 필드를 사용하는 방법 지정....................................................................................734

대체 키 매핑..............................................................................................................................................735

기본 데이터 형식 사용..........................................................................................................................742

열 이름과 다른 세부 정보 지정..........................................................................................................745

지속성 유닛 만들기와 사용........................................................................................................748

데이터베이스 테이블 설계...................................................................................................................749

지속성 유닛의 범위 이해......................................................................................................................751

지속성 구성 만들기................................................................................................................................752

지속성 API 사용......................................................................................................................................755

복합 데이터 형식 매핑..................................................................................................................759

열거형을 엔터티 프로퍼티로 사용....................................................................................................760

JPA가 날짜와 시간을 처리하는 방법 이해....................................................................................762

큰 프로퍼티를 CLOB과 BLOB으로 매핑......................................................................................765

정리.............................................................................................................................................................767

21. 스프링 프레임워크 리포지토리에서 JPA 이용...................................... 768

스프링 리포지토리와 트랜잭션 사용...................................................................................769

트랜잭션의 범위 이해............................................................................................................................769

트랜잭션과 엔터티 관리자를 위한 스레드 사용...........................................................................770

예외 변환 활용.........................................................................................................................................772

스프링 프레임워크에서 지속성 구성...................................................................................774

DataSource 조회...................................................................................................................................774

코드에서 지속성 만들기.......................................................................................................................775

트랜잭션 관리 설정................................................................................................................................780

XXXVII

Page 39: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

JPA 리포지토리 생성 및 사용.................................................................................................783

지속성 유닛 주입.....................................................................................................................................783

표준 CRUD 작업 구현..........................................................................................................................785

모든 엔터티를 위한 기본 리포지토리 만들기...............................................................................786

서비스에서 트랜잭션 경계 표시.........................................................................................................794

트랜잭션 서비스 메서드 사용.............................................................................................................798

DTO와 엔터티를 통한 데이터 변환.....................................................................................800

고객 지원 애플리케이션을 위한 엔터티 만들기...........................................................................800

BCrypt를 이용한 사용자 비밀번호 보호........................................................................................806

서비스에서 엔터티로 데이터 전송....................................................................................................808

정리.............................................................................................................................................................810

22. 스프링 데이터 JPA를 이용한

보일러플레이트 리포지토리 제거.......................................................................... 812

스프링 데이터의 통합 데이터 접근......................................................................................813

코드 중복 피하기.....................................................................................................................................813

스톡 리포지토리 인터페이스 사용....................................................................................................818

엔터티를 검색하는 쿼리 메서드 작성..............................................................................................819

커스텀 메서드 구현 제공......................................................................................................................823

스프링 데이터 JPA 리포지토리 구성 및 생성..............................................................828

리포지토리 자동 생성 활성화.............................................................................................................828

스프링 데이터 JPA 인터페이스 작성 및 사용..............................................................................837

XXXVIII

Page 40: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

고객 지원 애플리케이션 리팩터링........................................................................................839

기존 리포지토리 변환............................................................................................................................839

지원 티켓에 설명 추가..........................................................................................................................841

정리.............................................................................................................................................................846

23. JPA와 하이버네이트 서치를 이용한 데이터 검색............................. 847

검색 소개................................................................................................................................................848

인덱스의 중요성 이해............................................................................................................................848

세 가지 다른 접근법...............................................................................................................................850

고급 기준을 사용한 객체 검색.................................................................................................850

복잡한 조건 쿼리 만들기......................................................................................................................851

쿼리에서 OR 사용..................................................................................................................................860

성능 향상을 위한 유용한 인덱스 생성............................................................................................862

JPA를 통한 전체 텍스트 인덱스 활용...............................................................................863

MySQL 테이블에 전체 텍스트 인덱스 생성.................................................................................863

검색 가능 리포지토리 생성 및 사용.................................................................................................865

전체 텍스트 검색의 이식성.................................................................................................................872

아파치 루씬과 하이버네이트 서치를 이용한 데이터 인덱싱..............................872

루씬 전체 텍스트 인덱싱......................................................................................................................873

엔터티에 어노테이션을 지정해 메타데이터 인덱싱하기..........................................................874

JPA를 통한 하이버네이트 서치 사용..............................................................................................877

정리.............................................................................................................................................................882

XXXIX

Page 41: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

24. 고급 매핑과 커스텀 데이터 형식 만들기...................................................... 883

더 알아볼 내용....................................................................................................................................884

비표준 데이터 형식 변환.............................................................................................................885

속성 변환기...............................................................................................................................................886

변환 어노테이션......................................................................................................................................887

속성 변환기 작성 및 사용....................................................................................................................889

엔터티에 POJO 포함하기..........................................................................................................891

포함 가능 형식 지정...............................................................................................................................891

프로퍼티에 포함 표시............................................................................................................................892

포함된 열 이름 재정의..........................................................................................................................894

엔터티 간 관계 정의........................................................................................................................896

일대일 관계 이해.....................................................................................................................................896

일대다 및 다대일 관계 사용 ..............................................................................................................898

다대다 관계 만들기................................................................................................................................902

다른 일반적인 상황 해결.............................................................................................................903

수정 버전과 타임스탬프를 이용한 엔터티 버전 지정................................................................903

공통 프로퍼티를 가진 추상 엔터티 정의..........................................................................904

기본 및 포함된 컬렉션 매핑................................................................................................................907

키-값 쌍의 Map 저장...........................................................................................................................910

여러 테이블에 엔터티 저장.................................................................................................................912

프로그래밍 방식 트리거 만들기.............................................................................................913

CRUD 작업 전후에 동작 수행............................................................................................................913

엔터티 리스너 사용................................................................................................................................916

고객 지원 애플리케이션 개선...................................................................................................917

Attachment의 컬렉션 매핑.....................................................................................................918

로드 타임 위빙을 이용한 단순 프로퍼티의 지연 로딩...............................................................920

정리.............................................................................................................................................................924

XL

Page 42: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

스프링 시큐리티를 이용한

애플리케이션 보호

25. 스프링 시큐리티 소개......................................................................................................... 928

인증이란?...............................................................................................................................................928

인증 통합....................................................................................................................................................929

권한 부여....................................................................................................................................................941

스프링 시큐리티 소개....................................................................................................................945

스프링 시큐리티의 기반 이해.............................................................................................................945

스프링 시큐리티의 권한 부여 서비스..............................................................................................947

스프링 시큐리티 구성............................................................................................................................948

정리.............................................................................................................................................................948

26. 스프링 시큐리티를 이용한 사용자 인증........................................................ 949

인증 공급자 선택 및 구성...........................................................................................................950

사용자 세부 정보 공급자 구성...........................................................................................................951

LDAP와 액티브 디렉터리 공급자 사용..........................................................................................964

OpenID를 사용한 인증.........................................................................................................................968

사용자 기억하기......................................................................................................................................971

그밖의 인증 공급자 소개......................................................................................................................972

커스텀 인증 공급자 작성.............................................................................................................973

올바른 시동 순서.....................................................................................................................................973

공급자 생성 및 구성...............................................................................................................................977

교차 사이트 요청 위조 공격 예방.....................................................................................................983

정리.............................................................................................................................................................987

04 PART

XLI

Page 43: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

27. 권한 부여 태그 및 어노테이션 활용................................................................... 988

선언을 통한 권한 부여..................................................................................................................989

메서드 코드에서 사용 권한 검사.......................................................................................................989

URL 보안 적용.........................................................................................................................................992

어노테이션을 이용한 사용 권한 선언..............................................................................................996

메서드 포인트컷 규칙 정의...............................................................................................................1006

권한 부여 결정..................................................................................................................................1007

접근 결정 보터.......................................................................................................................................1007

접근 결정 관리자 사용........................................................................................................................1008

접근 제어 목록을 통한 객체 보안........................................................................................1010

스프링 시큐리티 ACL.........................................................................................................................1011

접근 제어 목록 구성.............................................................................................................................1013

ACL을 엔터티로 채우기.....................................................................................................................1017

고객 지원 애플리케이션에 권한 부여 추가...................................................................1018

커스텀 사용자 세부 정보로 전환.....................................................................................................1019

서비스 메서드의 보안..........................................................................................................................1024

스프링 시큐리티의 태그 라이브러리 사용...................................................................................1029

정리...........................................................................................................................................................1032

XLII

Page 44: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

28. OAuth를 이용한 RESTful 웹 서비스 보호............................................. 1033

웹 서비스 보안..................................................................................................................................1034

웹 GUI와 웹 서비스 보안 비교.........................................................................................................1034

인증 메커니즘 선택..............................................................................................................................1035

OAuth 소개........................................................................................................................................1037

핵심 요소..................................................................................................................................................1038

시작: OAuth 1.0....................................................................................................................................1038

표준: OAuth 1.0a..................................................................................................................................1038

혁신: OAuth 2.0.............................................................................................................................1045

스프링 시큐리티 OAuth............................................................................................................1054

OAuth 2.0 공급자.................................................................................................................................1055

OAuth 2.0 클라이언트 만들기.........................................................................................................1060

고객 지원 애플리케이션 완성.................................................................................................1063

요청 임시값과 시그니처 생성...........................................................................................................1064

클라이언트 서비스 구현.....................................................................................................................1066

임시값 서비스 구현..............................................................................................................................1070

토큰 서비스 구현...................................................................................................................................1072

리소스 서버 필터 커스터마이즈.......................................................................................................1076

스프링 시큐리티 다시 구성...............................................................................................................1079

OAuth 클라이언트 애플리케이션 만들기.....................................................................1085

REST 템플릿 커스터마이즈..............................................................................................................1085

스프링 시큐리티 OAuth 클라이언트 구성...................................................................................1087

REST 템플릿 사용................................................................................................................................1090

공급자와 클라이언트 함께 테스트..................................................................................................1091

정리...........................................................................................................................................................1092

XLIII

Page 45: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

엔터프라이즈 애플리케이션 개발

01PART

Page 46: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부에서 다루는 내용

01 자바 플랫폼 엔터프라이즈 에디션 소개

02 웹 컨테이너 활용

03 첫 번째 서블릿 작성

04 JSP로 콘텐츠 표시하기

05 세션을 이용한 상태 유지

06 JSP에서 식 언어 활용

07 자바 표준 태그 라이브러리 활용

08 커스텀 태그 및 함수 라이브러리 작성

09 필터를 이용한 애플리케이션 개선

10 웹소켓을 이용한 대화식 애플리케이션 개발

11 로깅을 활용한 애플리케이션 모니터링

Page 47: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발46

자바 플랫폼 연대표

자바 언어와 플랫폼은 길고 유명한 역사를 가지고 있다. 1990년대 중반의 태동기부터 2007년~2012

년에 해당하는 혁명의 침체기까지 자바는 다양한 변화를 겪었고 각종 논란의 중심에 있었다. 초

기에 자바는 JDK(Java Development Kit, 자바 개발 키트)라고 불렀고 작은 규모의 필수적인

API(Application Programming Interface, 애플리케이션 프로그래밍 인터페이스)로 구성된 플랫

폼과 밀착된 언어였다. 썬 마이크로시스템즈는 1995년 초기 알파와 베타를 공개했다. 이때의 자바

는 현재 기준으로 보면 매우 느리고 원시적이었지만 소프트웨어 개발의 혁명을 시작하는 역할을

했다.

이 장의 내용

•자바 SE 및 자바 EE 버전 연대표

•서블릿, 필터, 리스너 및 JSP 소개

•WAR 및 EAR 파일과 클래스 로더 계층

코드 예제

다운로드할 예제 코드 없음

새로운 메이븐 의존성

추가할 메이븐 의존성 없음

01자바 플랫폼 엔터프라이즈 에디션 소개

Page 48: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 47

초창기

자바의 역사는 그림 1-1의 자바 플랫폼 연대표에 요약돼 있다. 자바 언어와 자바 SE 플랫폼은 항상

함께 발전해왔다. 두 제품의 새 버전은 항상 동시에 출시됐고 서로 밀접하게 연결돼 있었다. 자바 플

랫폼은 1997년 버전 1.1까지 JDK라고 불렸지만 버전 1.2부터 JDK와 플랫폼은 더는 같은 의미를 뜻

하지 않게 됐다. 1998년 후반 출시된 버전 1.2에서 자바 기술 스택은 다음과 같은 핵심 컴포넌트로

나뉘었다.

1995JDK베타

1996년1월23일JDK1.0출시

1997년2월19일JDK1.1출시

1995

1998년12월8일J2SE1.2출시

1999년12월12일J2EE1.2출시

2001년9월24일J2EE1.3출시

2003년11월11일J2EE1.4출시

2006년5월11일자바EE5출시

2009년12월10일자바EE6출시

2013년6월12일자바EE7출시

2006~2009자바EE1차침체기

2010~2013자바EE2차침체기

1998년5월자바프로페셔널에디션(JPE)발표

1997년6월서블릿1.0출시

2000년5월8일J2SE1.3출시

2002년2월6일J2SE1.4출시

2004년9월30일J2SE5.0출시

2006년12월11일자바SE6출시

2007~20115년간의자바침체기

2011년7월28일자바SE7출시

2014년3월18일자바SE8출시

2015

그림 1-1: 자바 SE와 자바 EE의 발전 과정을 보여주는 연대표. 상단의 사건은 자바 SE의 주요 사건을 나타내고 하단의 사건은 자바 EE의

주요 사건을 나타낸다.

≆ 자바-잘알고있듯이자바는엄격하고강력한형식의구문을포함하는언어다.

≆ 자바2플랫폼스탠더드에디션:J2SE라고도하며java.lang및java.io등의패키지에포함된클래스를포함하는플랫

폼을나타낸다.자바애플리케이션을구축하는기본구성요소로자리잡았다.

≆ JVM(JavaVirtualMachine,자바가상머신):컴파일된자바코드를실행하는소프트웨어가상머신이다.컴파일된자바코

드는바이트코드에불과하므로JVM은바이트코드를이를실행하는컴퓨터의기계어로컴파일하는역할을한다(이를종종

JustInTime컴파일러또는JIT컴파일러라고도한다).JVM은또한애플리케이션코드를대신해메모리관리를수행한다.

≆ JDK(JavaDevelopmentKit,자바개발키트):소프트웨어개발자가자바애플리케이션을개발하는데필요한핵심구성요

소다.자바언어컴파일러,문서생성기,네이티브코드작업용툴,그리고(일반적으로)플랫폼에서플랫폼클래스의디버깅

을활성화하는자바소스코드가포함돼있다.

≆ JRE(JavaRuntimeEnvironment,자바런타임환경):최종사용자가컴파일된자바애플리케이션을실행하기위해다운

로드해야하는구성요소다.여기에는JVM이포함돼있지만JDK에들어있는개발툴은포함돼있지않다.물론JDK에는

JRE가포함돼있다.

Page 49: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발48

이러한 5가지 컴포넌트는 기존에는 구현이 아닌 사양이었다. 어떤 기업이든 이 자바 기술 스택의 구

현을 개발할 수 있었고 실제로 여러 기업에서 구현을 개발했다. 물론 썬은 자바, J2SE, JVM, JDK

및 JRE의 표준 구현을 제공했지만 IBM, 오라클, 그리고 애플에서도 각기 다른 기능을 갖춘 경쟁 구

현을 만들었다.

IBM 구현은 필요에 의해 개발됐다. 썬이 IBM 운영체제에서 실행되는 바이너리를 제공하지 않았기

때문에 IBM이 직접 개발한 경우다. 애플 맥 OS 운영체제의 경우도 비슷하게 애플이 직접 구현을

개발했다. 이러한 구현은 사용하는 데 비용은 들지 않았지만 완전히 자유롭게 사용할 수 있는 것은

아니었으므로 오픈소스 소프트웨어로 간주되지는 않는다. 이에 오픈소스 커뮤니티에서는 신속하게

OpenJDK 프로젝트를 구성하고 자바 스택의 오픈소스 구현을 제공하기 시작했다.

이 밖에도 그리 널리 사용되지는 않지만 여러 회사에서 애플리케이션을 대상 아키텍처의 기계어로

컴파일해서 JIT 컴파일을 생략하고 성능을 향상할 수 있는 구현을 개발했다. 썬 자바 구현은 대부분

의 사용자와 개발자에게 충분하며 선호되는 구현이기도 하다. 오라클이 썬을 인수한 후에는 썬과 오

라클의 구현은 하나가 됐다.

그림 1-1에 표시되지 않은 다른 사항으로 J2SE를 사용할 수 있고 JVM에서 실행되는 다른 언어들

이 있다. 수년간 자바 바이트코드(경우에 따라 기계어)로 컴파일되고 JVM에서 실행되는 십여 종

의 언어가 만들어졌다. 널리 알려진 예로는 클로저(Clojure, 리스프 변종), 그루비(Groovy), 제이

루비(JRuby, 자바 기반 루비 구현), 자이썬(Jython, 자바 기반 파이썬 구현), 리노(Rhino), 스칼라

(Scala) 등이 있다.

엔터프라이즈 자바의 탄생

자바에 대한 간단한 역사는 자바 개발자라면 이미 알고 있을 내용이기에 불필요하게 느껴질 수 있

지만 자바 플랫폼 스탠더드 에디션의 역사는 자바 플랫폼 엔터프라이즈 에디션의 탄생과 발전에

밀접한 관계가 있기 때문에 함께 설명하는 것이 중요하다. 썬은 인터넷과 웹 애플리케이션의 급속

한 성장을 보면서 애플리케이션 개발을 위한 고급 툴이 필요하다는 것을 인식하기 시작했다. 1998

년, J2SE 1.2를 출시하기 직전 썬은 JPE(Java Professional Edition, 자바 프로페셔널 에디션)라는

제품이 개발 중임을 발표한다. 이때 HTTP 요청에 응답할 수 있는 축소된 애플리케이션인 서블릿

(Servlet)이라는 기술이 이미 개발되고 있었다. 1997년 자바 서블릿 1.0이 자바 웹 서버와 함께 출시

됐지만 자바 커뮤니티에서 원하는 기능이 상당수 누락돼 있었기에 큰 반응을 얻지는 못했다.

Page 50: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 49

이후 썬은 서블릿과 JPE의 몇 차례 내부 버전업을 거쳐 1999년 12월 12일 자바 2 플랫폼 엔터프라이

즈 에디션(J2EE; Java 2 Platform, Enterprise Edition) 버전 1.2를 출시한다. 이 버전 번호는 당시

자바 및 J2SE 버전과 일치했으며 다음과 같은 사양을 포함하고 있었다.

≆ 서블릿2.2

≆ JDBC확장API2.0

≆ JNDI(자바네이밍및디렉터리인터페이스)1.0

≆ JSP(자바서버페이지)1.2

≆ EJB(엔터프라이즈자바빈즈)1.1

≆ JMS(자바메시지서비스)1.0

≆ JTA(자바트랜잭션API)1.0

≆ 자바메일API1.1

≆ JAF(자바빈즈활성화프레임워크)1.0.

J2SE와 마찬가지로 J2EE도 사양이었다. 썬은 사양의 컴포넌트에 대한 참조 구현체를 제공했지만 다

른 기업에서도 자유롭게 구현을 개발할 수 있었다. 지금까지 다양한 구현이 개발됐고 다음 장에서

이들 중 일부를 소개한다. 이러한 구현은 당시는 물론 현재까지 오픈소스와 상용 솔루션으로 선보이

고 있다. J2EE는 J2SE를 보완하는 성공적인 기술로 자리 잡았으며 일부 컴포넌트는 필수 요소로 인

식되어 J2EE에서 J2SE로 마이그레이션됐다.

자바 SE와 자바 EE의 동반 발전

J2EE 1.3은 자바와 J2SE 1.3이 출시된 지 1년이 지나 2001년 9월 출시됐고 다시 약 1년 후 자바/J2SE

1.4가 출시됐다. 대부분의 컴포넌트가 마이너 업그레이드됐고 새로운 기능이 추가됐다. 다음과 같은

기능이 J2EE 사양에 추가됐고 구현이 확장되고 업그레이드됐다.

≆ JAXP(JavaAPIforXMLProcessing)1.1

≆ JSTL(자바서버페이지태그라이브러리)1.0

≆ J2EE커넥터아키텍처1.0

≆ JAAS(자바인증및권한부여서비스)1.0

이 시점에 기술은 상당히 성숙했지만 아직은 개선의 여지가 많았다.

Page 51: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발50

J2EE 1.4는 자바 플랫폼 엔터프라이즈 에디션의 발전 과정에서 중요한 버전으로 평가된다. 2003년

11월에 출시됐으며(자바/J2SE 1.4가 출시된 지 2년 후, 그리고 자바/J2SE 5.0이 출시되기 약 1년 전)

서블릿 2.4와 JSP 2.0이 포함됐다. 점차 필수적인 기술로 인식되던 JDBC 확장 API, JNDI 및 JAAS

사양이 자바/J2SE 1.4로 이전된 것도 이 버전이다. 또한 J2EE 컴포넌트가 다음과 같은 몇 가지 고수

준 카테고리로 분류되기 시작했다.

≆ 웹 서비스 기술:JAXP1.2,J2EE1.1에추가된새로운웹서비스,JAX-RPC(XML기반RPC용자바API)1.1,JAXR(XML레

지스트리용자바API)1.0

≆ 웹 애플리케이션 기술:서블릿,JSP,JSTL1.1컴포넌트,그리고새로운JSF(자바서버페이스)1.1

≆ 엔터프라이즈 애플리케이션 기술: EJB2.1,커넥터아키텍처1.5,JMS1.1,JTA,자바메일1.3,JAF

≆ 관리 및 보안 기술:JACC(컨테이너용자바권한부여서비스공급자계약)1.0,JMX(자바관리확장)1.2,엔터프라이즈에디

션관리API1.0,엔터프라이즈에디션배포API1.1

이름이 바뀌는 시기

이름이 바뀌는 시기를 거치면서 종종 자바 개발자들이 혼동하는 변화가 일어났다. 이 책에서 이 시

기를 언급하는 것은 이 책에서 사용하는 명명 규칙과 이전에 알고 있던 명명 규칙과의 차이를 명확

하게 이해하도록 돕기 위해서다. 2004년 9월 출시된 자바/J2SE 5.0에는 자바 역사상 언어 구문의

가장 중요한 세 가지 변화인 제네릭, 어노테이션, 열거형이 추가됐다. 또한 이 버전은 기존의 패턴과

는 다른 버전 번호를 사용했지만 J2SE API와 자바 명령줄에서 보고하는 버전은 여전히 1.5였기 때

문에 혼란의 여지가 있었다. 썬은 이전의 공개 버전 번호에 사용되던 1을 빼고 마이너 버전으로 버

전을 구분하기로 결정했으며, 버전 번호 끝에 붙은 “.0”이 오히려 혼란을 일으킨다고 판단하고 간단

하게 버전 5라고 부르기 시작했다.

그리고 이와 동시에 자바 2 플랫폼 스탠더드 에디션(J2SE) 대신 자바 플랫폼 스탠더드 에디션(자바

SE)이라는 이름을 사용하기 시작한다. 이러한 변화는 2006년 자바 SE 6이 발표되면서 공식화됐으

며 지금까지 이 이름이 유지되고 있다. 즉, 자바 SE 6은 내부적으로 1.6이며, 자바 SE 7과 자바 SE 8

은 각각 내부적으로 1.7과 1.8이다.

동일한 이름 변경이 J2EE에도 적용됐지만 J2EE 1.5는 J2SE 5.0과 자바 SE 6 중간에 출시됐기 때문

에 한 버전 일찍 이름이 바뀌었다. 자바 플랫폼 엔터프라이즈 에디션 5(자바 EE 5)는 2006년 5월,

J2SE 5.0이 출시된 지 18개월 후, 그리고 자바 SE 6이 출시되기 7개월 전에 출시됐다. 자바 EE 5는

Page 52: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 51

내부적으로 1.5이고 자바 EE 6과 자바 EE 7은 내부적으로 각각 1.6, 1.7이다. J2SE와 자바 SE는 같

은 제품을 의미하며 현재는 자바 SE라는 용어를 사용하는 것이 좋다. 마찬가지로 J2EE와 자바 EE는

같은 의미이며 자바 EE를 사용하는 것이 좋다. 이 책의 나머지 부분에서는 자바 SE와 자바 EE라는

용어를 사용한다.

자바 EE 5는 다양한 변화와 개선을 거쳤으며 현재까지도 가장 많이 배포된 자바 EE 버전이며 다음

과 같은 변경 및 추가 기능을 포함하고 있다.

≆ JAXP및JMX가J2SE5.0으로이전되어자바EE5에는포함되지않았다.

≆ JAX-WS(XML기반웹서비스용자바API)2.0,JAXB(XML바인딩용자바아키텍처)2.0,자바플랫폼용웹서비스메타데

이터2.0,SAAJ(SOAPwithAttachmentsAPIforJava)1.2,StAX(XML용스트리밍API)1.0이웹서비스기술에추가됐다.

≆ JPA(자바지속성API)1.0및공용어노테이션API1.0이엔터프라이즈애플리케이션기술에추가됐다.

자바 SE 및 EE 침체기

2006년 자바 SE 6 출시는 이후 약 5년간 지속된 자바 SE 출시의 침체기의 시작을 알리며 자바 커뮤

니티의 많은 개발자들에게 실망과 분노를 안겨준 시기로 기록됐다. 썬은 자바 SE 7에 추가될 새로운

언어 기능과 API를 약속했지만 출시 일정은 기약 없이 미뤄졌다. 그동안 C# 언어와 .NET 플랫폼과

같은 다른 기술들은 발전을 거듭해서 언어 기능과 플랫폼 API 측면에서 자바를 능가하기 시작했고

일부에서는 이제 자바는 시대에 뒤처졌다는 평가도 나오기 시작했다. 설상가상으로 자바 EE 5가 출

시된 후 자바 EE까지 2009년까지 3년 이상 침체기에 들어갔다. 다행스럽게도 2009년 초부터 개발

이 시작된 자바 EE 6이 2009년 12월, 자바 EE 5 이후 3년 7개월 만에, 자바 SE 6 이후 거의 3년 만

에 출시됐다.

이 시기에 자바 엔터프라이즈 에디션은 매우 거대해졌다.

≆ SAAJ,StAX및JAF가자바SE6으로이전됐다.

≆ JAX-RS(RESTful웹서비스용자바API)1.1및JAXM(XML메시징용자바API)1.3사양이웹서비스기술에추가됐다.

≆ JUEL(자바통합식언어,또는간단하게EL)2.0이웹애플리케이션기술에추가됐다.

≆ JASPIC(컨테이너용자바인증서비스공급자인터페이스)1.0이관리및보안기술에추가됐다.

≆ 엔터프라이즈애플리케이션기술은CDI(자바컨텍스트및의존성주입)1.0,자바의존성주입1.0,빈유효성검사1.0,관리

되는빈1.0,인터셉터1.1을비롯해가장크게개선됐고기존의모든컴포넌트가업데이트됐다.

Page 53: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발52

또한 자바 EE 6은 자바 EE 아키텍처의 두 영역에서 중요한 전환점으로 기록됐다.

≆ 이버전에는지난10년이상사용된전통적인XML구성방식을보완하는어노테이션기반및프로그래밍방식애플리케이

션구성이추가됐다.

≆ 이버전에는자바EE웹프로필이도입됐다.

웹 프로필 인증 프로그램은 자바 EE가 매우 방대해지면서 인증된 구현을 유지 관리하고 업데이트

하기가 어려워진 점을 감안해 전체 자바 EE 플랫폼의 부분집합으로 자바 EE 구현을 인증할 수 있는

기회를 제공한다. 이 부분집합에는 대다수의 애플리케이션에 매우 중요한 특성만 포함되고 소수의

애플리케이션에만 필요한 사양은 제외됐다. 자바 EE 6의 경우 다음과 같이 구성돼 있다.

≆ 웹서비스또는관리및보안컴포넌트는자바EE웹프로필에포함되지않는다.

≆ 웹애플리케이션기술의모든항목과자바EE커넥터아키텍처,JMS및자바메일을제외한엔터프라이즈애플리케이션기

술의모든항목이웹프로필에포함된다.

오라클이 썬 마이크로시스템즈를 인수한 것은 5년간의 자바 침체기에 해당하는 2010년 1월이었는

데, 이 사건은 그동안의 자바 SE 침체기와 함께 자바 커뮤니티에 또 다른 걱정거리를 안겼다. 오라

클이 그동안 오픈소스 프로젝트에 대해 보여준 자세는 그다지 민첩하거나 적극적이지 않았기 때문

에 오라클이 썬을 인수한 후 자바를 중단할지 모른다는 우려가 있었던 것이다. 다행히도 이 우려가

현실화되지는 않았다.

오라클은 곧바로 자바 팀을 재구성하고 오픈소스 커뮤니티와의 대화 채널을 마련했으며 썬이 약속

했던 것보다 훨씬 현실적인 자바 SE 및 자바 EE 버전에 대한 향후 로드맵을 발표했다. 자바 SE 7 개

발이 새로 시작됐고 오라클의 일정에 따라 2011년 6월 출시됐다. 자바 SE 6이 출시된 지 거의 5년

만의 일이었다. 두 번째 자바 EE 침체기는 2013년 6월 자바 EE 7이 출시되면서 끝났으며 자바 EE 6

이 출시된 지 3년 7개월 만의 일이었다. 현재 오라클은 2년마다 두 플랫폼의 새 버전을 교대로 출시

하겠다고 약속하고 있다. 이 약속이 제대로 지켜질지는 앞으로도 지켜볼 일이다.

최신 플랫폼 기능

자바 SE 7 및 8과 자바 EE 7은 언어와 지원 API에 대한 중요한 변화를 통해 자바 기술에 생기를 불

어넣었다고 평가받고 있다. 이 책 전체에서 이러한 새로운 기능들을 사용할 것이므로 이 절에서 이

러한 기능을 간략하게 정리하겠다.

Page 54: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 53

자바 SE 7

원래 자바 SE 7에 추가될 기능들은 매우 야심적인 목표를 가지고 선정됐으나 오라클은 썬을 인수한

후 이러한 목표를 모두 달성하려면 시간이 매우 오래 걸린다는 사실을 곧바로 인정했다. 각 기능들

이 모두 중요했기 때문에 일부 기능을 향후 버전으로 연기하는 방향으로 결정이 내려졌다. 그렇지

않으면 자바 SE 7을 2015년 이후로 연기해야 했으며, 이 안을 받아들일 수는 없었다.

자바 SE 7에는 동적 언어와 압축된 64비트 포인터(64비트 JVM의 성능 향상을 위한)에 대한 지원이

추가됐고 자바 애플리케이션 개발의 생산성을 높이기 위한 다양한 언어 기능이 추가됐다. 가장 유용

한 변화로는 제네릭 인스턴스화를 위한 단축형인 다이아몬드 지시자를 꼽을 수 있다. 자바 7 이전에

는 제네릭 형식에 대한 변수 선언과 할당에 제네릭 형식 인자를 포함시켜야 했다. 다음은 매우 복잡

한 java.util.Map 변수를 선언하고 할당하는 예를 보여준다.

Map<String, Map<String, Map<Integer, List<MyBean>>>> map =

new Hashtable<String, Map<String, Map<Integer, List<MyBean>>>>();

이 선언에 포함된 정보는 상당 부분 중복된 것이다. 이 변수에 Map<String, Map<String, Map<Integer,

List<MyBean>>>> 이외의 다른 것은 아예 할당할 수 없으므로 이러한 형식 인자를 일일이 지정할 필요

는 없다. 자바 7의 다이아몬드 지시자를 이용하면 이 선언과 할당을 훨씬 간단하게 만들 수 있다. 이

제 컴파일러가 다음과 같이 인스턴스화된 java.util.Hashtable의 형식 인자를 유추할 수 있다.

Map<String, Map<String, Map<Integer, List<MyBean>>>> map = new Hashtable<>();

자바 7 이전의 다른 흔한 불만 사항으로는 try-catch-finally 블록에서 회수 가능한 자원을 사용할

때 자원을 회수하기 위해 중복된 코드를 작성해야 하는 문제가 있었다. 다음의 지저분한 JDBC 코드

를 보자.

Connection connection = null;

PreparedStatement statement = null;

ResultSet resultSet = null;

try {

connection = dataSource.getConnection();

statement = connection.prepareStatement(...);

// 문 준비

resultSet = statement.executeQuery();

// 결과 집합으로 작업 수행

Page 55: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발54

} catch (SQLException e) {

// 예외로 작업 수행

} finally {

if (resultSet != null) {

try {

resultSet.close();

} catch (SQLException ignore) { }

}

if (statement != null) {

try {

statement.close();

} catch (SQLException ignore) { }

}

if (connection != null && !connection.isClosed()) {

try {

connection.close();

} catch (SQLException ignore) { }

}

}

자바 7의 try-with-resource 구문을 이용하면 이 코드를 대폭 간소화할 수 있다. try-with-

resource 구조에는 java.lang.AutoCloseable을 구현하는 모든 클래스를 사용할 수 있다. JDBC

Connection, PreparedStatement 및 ResultSet 인터페이스는 모두 이 인터페이스를 확장하므로 다음 예

제와 같이 try-with-resource 구조를 이용하면 try 키워드의 괄호 안에 선언한 자원이 암시적인

finally 블록에서 자동으로 회수된다. 이 정리 작업 중 예외가 발생하는 경우 기존 예외의 억제된

예외에 추가되며, 억제된 예외가 없는 경우 자원이 모두 회수된 후 예외가 발생한다.

try (Connection connection = dataSource.getConnection();

PreparedStatement statement = connection.prepareStatement(...)) {

// 문 설정

try (ResultSet resultSet = statement.executeQuery()) {

// 결과 집합으로 작업 수행

}

} catch (SQLException e) {

// 예외로 작업 수행

}

Page 56: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 55

try-catch-finally 구조의 다른 개선된 기능으로 multi-catch가 있다. 자바 7부터는 예외 형식을

파이프 문자(|)로 구분하는 식으로 한 catch 블록에서 여러 예외를 포착할 수 있다. 예를 들면 다음

과 같다.

try {

// 작업 수행

}

catch (MyException | YourException e) {

// 동일한 방법으로 예외 처리

}

한 가지 주의할 사항은 한 예외가 다른 예외를 상속하는 경우 multi-catch 구문에서 사용할 수 없

다는 것이다. 예를 들어 FileNotFoundException은 IOException을 확장하므로 다음 예제는 잘못된 예에

해당한다.

try {

// 작업 수행

} catch (IOException | FileNotFoundException e) {

// 동일한 방법으로 예외 처리

}

물론 이 문제는 상식적으로 이해할 수 있는 문제이기도 하다. 가령 IOException을 포착하면 두 가지

예외 형식을 모두 포착할 수 있다.

자바 7의 다른 부수적인 언어 기능으로는 바이트와 정수를 위한 이진 리터럴(1928라는 리터럴

을 0b11110001000으로 지정할 수 있음)과 숫자 리터럴의 밑줄(원하는 경우 같은 리터럴을 1_928 및

0b111_1000_1000으로 지정할 수 있음)이 있다. 마지막으로 이제 드디어 switch 인자로 String을 사용

할 수 있게 됐다.

자바 EE 7

2013년 6월 12일 출시된 자바 EE 7에서는 여러 가지 기능이 바뀌고 신규 기능이 추가됐다. 이러한

새로운 기능은 이 책 전체에서 다룰 것이므로 여기서는 자세히 설명하지는 않는다. 자바 EE 7의 변

화를 요약하면 다음과 같다.

≆ JAXB가자바EE에서자바SE7로이전됐다.

≆ 자바플랫폼용배치애플리케이션1.0과자바EE용동시성유틸리티1.0이엔터프라이즈애플리케이션기술에추가됐다.

Page 57: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발56

≆ 웹소켓용자바API1.0(10장에서설명한다)및JSON처리용자바API1.0이웹애플리케이션기술에추가됐다.

≆ 자바통합식언어가크게확장되어람다식과자바SE8컬렉션스트림API와비슷한기능을사용할수있게됐다(자세한

내용은6장에서다룬다).

≆ 일반적인웹애플리케이션에필요할가능성이높은사양인JAX-RS,웹소켓용자바API및JSON처리용자바API를포함

하게끔웹프로필이약간확장됐다.

자바 SE 8

자바 SE 8의 새로운 기능은 이 책의 예제를 작성하는 데 매우 유용하게 사용됐다. 가장 주목할 만한

변화는 람다 식(lambda expression, 비공식적으로는 클로저[closure]라고 한다)의 추가를 꼽을 수

있다. 람다 식은 형식 이름을 할당하거나 다른 식별자에 연결할 필요 없이 정의하고 호출할 수 있는

일종의 익명 함수다. 람다 식은 자바 애플리케이션에서 매우 흔한 단일 메서드 인터페이스를 익명으

로 구현하는 데 특히 유용하다. 예를 들어, 이전에는 익명 Runnable을 이용해 다음과 같이 Thread를

인스턴스화했다.

public String doSomethingInThread(String someArgument) {

...

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

// 작업 수행

}

});

...

}

이제 람다 식으로 다음과 같이 간소화할 수 있다.

public String doSomethingInThread(String someArgument) {

...

Thread thread = new Thread(() -> {

// 작업 수행

});

...

}

Page 58: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 57

람다 식은 인자, 반환형 및 제네릭을 가질 수 있으며 원하는 경우 람다 식 대신 메서드 참조(method

reference)를 이용해 인터페이스가 일치하는 메서드로 참조를 전달할 수 있다. 다음 코드는 Thread

를 인스턴스화하는 앞의 두 코드와 같은 기능을 한다. 메서드 참조와 람다 식을 변수에 할당하는 것

도 가능하다.

public String doSomethingInThread(String someArgument) {

...

Thread thread = new Thread(this::doSomething);

...

}

public void doSomething() {

// 작업 수행

}

날짜 및 시간 API가 부족하다는 점은 초창기부터 자바 사용자들의 커다란 불만 중 하나였다. java.

util.Date는 처음부터 문제가 많았고 java.util.Calendar가 추가되면서 문제는 더욱 악화됐다. 자바

SE 8은 새로운 날짜 및 시간 API인 JSR 310을 추가함으로써 마침내 이 문제를 해결했다. 이 API는

상당 부분 Joda Time에 기반을 두고 있지만 Joda Time 개발자가 지적한 문제를 해결하기 위해 상

당히 개선된 기반 아키텍처를 가지고 있다. 마침내 자바에서도 강력하고 제대로 설계된 날짜 및 시

간 API를 사용할 수 있게 됐다.

계속된 발전

지금까지 살펴본 것처럼 자바 SE와 EE 플랫폼은 지난 20년간 함께 발전을 거듭해왔고 앞으로도 계

속 함께 발전할 것이다. 이 책의 독자들은 자바 SE에 대해서는 잘 알고 있지만 자바 EE는 전혀 사용

해보지 않았거나 이전 버전의 자바 EE를 사용해 봤지만 새로 추가된 기능을 배우고 싶을 수 있다.

1부에서는 다음과 같은 자바 EE의 가장 중요한 기능을 배운다.

≆ 애플리케이션서버와웹컨테이너(2장)

≆ 서블릿(3장)

≆ JSP(4장,6장,7장,8장)

≆ HTTP세션(5장)

≆ 필터(9장)

≆ 웹소켓(10장)

Page 59: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발58

기본적인 웹 애플리케이션의 구조 이해

자바 EE 웹 애플리케이션은 다양한 컴포넌트로 구성된다. 먼저 여러분이 작성하는 코드가 있고 이

코드에서 사용하는 타사 라이브러리가 있다. 배포 설명자(deployment descriptor)는 애플리케이

션을 배포 및 시작하는 데 필요한 명령을 포함한다. ClassLoader는 동일한 서버에서 애플리케이션을

다른 웹 애플리케이션으로부터 격리하는 역할을 한다. 마지막으로 WAR 및 EAR 파일의 형태로 애

플리케이션을 패키징해야 한다.

서블릿, 필터, 리스너 및 JSP

서블릿은 모든 자바 EE 웹 애플리케이션의 핵심 컴포넌트로서 3장에서 자세히 배우겠지만 HTTP

요청을 수신하고 응답하는 역할을 하는 자바 클래스다. 오류가 있거나 다른 컴포넌트가 가로채는 요

청을 제외하고 애플리케이션의 거의 모든 요청은 몇 가지 유형의 서블릿을 통한다. 필터는 서블릿에

대한 요청을 가로챌 수 있는 컴포넌트 중 하나로서 데이터 서식 지정과 응답 압축, 인증 및 권한 부

여까지 다양한 용도로 사용할 수 있다. 9장에서는 다양한 필터의 사용법을 알아본다.

다른 유형의 애플리케이션과 마찬가지로 웹 애플리케이션에도 수명주기가 있는데 시작 및 종료 프

로세스가 있고 그 사이에 많은 일이 일어난다. 자바 EE 웹 애플리케이션은 다양한 유형의 리스너를

지원하며 이러한 리스너는 애플리케이션의 시작 및 종료, HTTP 세션 생성, 세션 삭제와 같은 다양

한 이벤트를 코드에 알리는 역할을 한다. 이러한 리스너에 대해서는 1부와 2부 전체에서 자세히 알

아볼 것이다.

자바 EE의 가장 강력한 툴을 선택한다면 자바 서버 페이지(JSP) 기술을 꼽을 수 있을 것이다. JSP를

이용하면 HTML의 String을 OutputStream 또는 PrintWriter로 직접 출력하는 작업 없이 웹 애플리케

이션을 위한 동적인 HTML 기반 그래픽 사용자 인터페이스를 만들 수 있다. JSP에 대해 설명하려면

자바 서버 페이지 표준 태그 라이브러리, 자바 통합 식 언어, 커스텀 태그, 국제화 및 지역화와 같은

다양한 주제를 다뤄야 한다. 4장과 6장~9장에서 이러한 주제에 상당히 많은 지면을 할애해 설명할

것이다.

물론 자바 EE에는 서블릿, 필터, 리스너, JSP 외에도 많은 기능이 있으며 이 책에서 모든 기능을 다

루지는 않겠지만 많은 기능을 다룰 예정이다.

Page 60: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

디렉터리 구조와 WAR 파일

표준 자바 EE 웹 애플리케이션은 WAR 파일 또는 압축 해제된 웹 애플리케이션 디렉터리로 배포된

다. 자바 아카이브(Java Archive)라고 하는 JAR 파일에 대해서는 이미 잘 알고 있을 것이다. 사실

JAR 파일은 JVM이 인식하는 표준 디렉터리 구조를 압축한 ZIP 형식의 압축 파일에 불과하다. JAR

파일 형식에 특별한 기술이 적용되는 것은 아니므로 일반 압축 프로그램으로 쉽게 만들고 읽을 수

있다. 웹 애플리케이션 아카이브(Web Application Archive)라고 하는 WAR 파일은 자바 EE 웹

애플리케이션을 위한 아카이브 파일이다.

자바 EE 웹 애플리케이션 서버는 모두 WAR 파일 애플리케이션 아카이브를 지원하며, 그중 대부분

은 압축 해제된 애플리케이션 디렉터리도 지원한다. 아카이브 파일이나 압축 해제 디렉터리는 그림

1-2에 나오는 것처럼 동일한 디렉터리 관례를 사용한다. 이 구조에는 JAR 파일과 비슷하게 클래스

및 다른 애플리케이션 자원이 포함되지만 클래스 파일은 JAR 파일과 달리 애플리케이션 루트와 상

대적인 위치에 저장되지 않고 /WEB-INF/classes에 저장된다. WEB-INF 디렉터리에는 자바 EE 웹 애플

리케이션 서버가 애플리케이션을 배포 및 실행하는 방법을 결정하는 데 사용할 정보 및 명령 파일을

저장하며, classes 하위 디렉터리는 패키지 루트 역할을 한다. 컴파일된 애플리케이션 클래스 파일

과 다른 자원은 모두 이 디렉터리에 저장된다.

표준 JAR 파일과 달리 WAR 파일은 번들 JAR 파일을 /

WEB-INF/lib에 포함할 수 있다. 이 디렉터리에 있는 JAR 파

일의 모든 클래스는 애플리케이션의 클래스패스에 있는 애

플리케이션에서도 사용할 수 있다. /WEB-INF/tags 및 /WEB-

INF/tld 디렉터리는 각각 JSP 태그 파일과 태그 라이브러리

설명자를 저장하도록 예약돼 있다. 태그 파일과 태그 라이

브러리에 대한 내용은 8장에서 자세히 다루겠다. i18n 디렉

터리는 사실 자바 EE 사양의 일부는 아니지만 대부분의 애

플리케이션 개발자가 국제화(i18n) 및 지역화(L10n) 파일

을 저장할 때 따르는 관례다.

디렉터리 구조에 META-INF 디렉터리가 두 개 있음을 알 수

있다. 일부 개발자들이 이를 혼동하는 경우가 있지만 간

단한 클래스패스의 규칙을 기억하면 두 디렉터리를 구분

할 수 있다. JAR 파일의 META-INF 디렉터리와 비슷하게

웹 애플리케이션 루트

META-INF

WEB-INF

MANIFEST.MF

classes

기타 웹에서 접근 가능한 파일

i18n

lib

tags

tld

META-INF

자바 .class 파일 및 자원

국제화 파일

번들 JAR 파일

JSP 태그 파일

JSP 태그 라이브러리 설명자

애플리케이션 자원

컨테이너 자원

그림 1-2

Page 61: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발60

/META-INF 디렉터리에는 애플리케이션 매니페스트 파일이 저장되며, 특정 웹 컨테이너나 애플리케

이션 서버의 자원을 포함할 수도 있다. 예를 들어 아파치 톰캣(2장에서 설명한다)의 경우 톰캣에 애

플리케이션을 배포하는 방법을 커스터마이즈하기 위해 이 디렉터리에서 context.xml 파일을 찾고 이

를 참고한다. 이러한 파일은 자바 EE 사양에 포함되지 않으며 지원되는 파일은 단일 애플리케이션 서

버부터 인접한 웹 컨테이너까지 다양하다.

JAR 파일과 달리 루트 레벨 /META-INF 디렉터리는 애플리케이션 클래스패스에 있지 않으며

ClassLoader를 통해 이 디렉터리의 자원을 가져올 수 없다. 반면 /WEB-INF/classes/META-INF는 클래

스패스에 있다. 이 디렉터리에는 어떤 애플리케이션 자원도 넣을 수 있으며 여기에 넣은 자원은

ClassLoader를 통해 접근할 수 있다. 일부 자바 EE 컴포넌트는 이 디렉터리에 속한 파일을 지정한

다. 예를 들어 3부에서 배울 자바 지속성 API에서는 /WEB-INF/classes/META-INF에 저장되는 두 파일

(persistence.xml과 orm.xml)을 지정한다.

WAR 파일 또는 압축 해제된 웹 애플리케이션 디렉터리에 포함된 대부분의 파일은 URL을 통해 직

접 접근할 수 있다. 예를 들어 http://example.org/foo에 배포된 애플리케이션의 루트와 상대적인 /

bar.html 파일의 경우 http://example.org/foo/bar.html에서 접근할 수 있다. 달리 적용되는 필터나 보

안 규칙이 없는 경우 /WEB-INF 및 /META-INF 디렉터리에 포함된 자원을 제외하고 애플리케이션의 모

든 자원에 마찬가지로 적용된다. 이 디렉터리의 파일은 보호되는 자원이며 URL을 통해 접근할 수

없다.

배포 설명자

배포 설명자(deployment descriptor)는 웹 애플리케이션을 설명하고 자바 EE 웹 애플리케이션 서

버에 웹 애플리케이션을 배포 및 실행하기 위한 지침을 제공하는 메타데이터다. 일반적으로 이 메타

데이터는 배포 설명자 파일인 /WEB-INF/web.xml에 포함되며, 이 파일에는 서블릿, 리스너 및 필터에

대한 정의와 함께 HTTP 세션, JSP, 그리고 애플리케이션의 일반 구성 옵션을 포함한다. 자바 EE 6

의 서블릿 3.0에는 어노테이션과 자바 구성 API로 웹 애플리케이션을 구성하는 기능이 추가됐다.

또한 애플리케이션 내의 JAR 파일이 /META-INF/web-fragment.xml 배포 설명자에 구성된 서블릿, 필터

및 리스너를 포함할 수 있는 웹 조각(web fragment)이라는 개념이 추가됐다. 웹 조각도 어노테이

션과 자바 구성 API를 사용할 수 있다.

Page 62: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 61

자바 EE 6의 웹 애플리케이션 배포의 이러한 변화 때문에 이 과정을 구성하는 작업이 크게 복잡해

졌다. 웹 조각을 특정 순서로 검색하고 활성화하도록 구성하면 이러한 복잡성을 완화할 수 있다. 다

음 두 방법 중 하나를 사용할 수 있다.

≆ 각웹조각의web-fragment.xml파일은중첩된<before>및<after>태그를이용해다른웹조각이전또는이후에웹

조각을활성화하도록제어하는<ordering>요소를포함할수있다.이러한태그에는현재웹조각의상대적인순서를지

정하기위한다른웹조각의이름을지정하는중첩된<name>요소가포함된다.<before>및<after>는이름을따로지정

하지않은다른모든웹조각이전또는이후에활성화하도록지정하는중첩된<others>요소를포함할수있다.

≆ 특정웹조각을직접만들지않았고그내용을제어할수없더라도애플리케이션의배포설정자내에서다른웹조각의순

서를제어할수있다./WEB-INF/web.xml의<absolute-ordering>요소와중첩된<name>및<others>요소를이용하

면웹조각에지정된다른모든순서지시보다우선하는번들웹조각의절대순서를구성할수있다.

기본적으로 서블릿 3.0 이상의 환경에서는 서블릿, 리스너, 필터 등을 구성하기 위한 자바 EE 웹 애

플리케이션 어노테이션을 찾기 위해 웹 애플리케이션과 웹 조각을 검색한다. 필요한 경우에는 루트

<web-app> 또는 <web-fragment> 요소에 metadata-complete="true" 속성을 추가해 이 검색과 어노테이션

구성을 비활성화할 수 있다. 또한 배포 설명자에 <absolute-ordering /> 요소를 (중첩 요소 없이) 추

가해 애플리케이션에서 모든 웹 조각을 비활성화할 수도 있다.

웹 애플리케이션 배포 설명자와 어노테이션 구성에 대해서는 이 책의 1부 전체에서 자세하게 다룬

다. 2부에서는 컨테이너 이니셜라이저(container initializer)와 자바 API를 이용한 프로그래밍 방

식 구성을 알아보고 스프링 프레임워크를 간편하고 테스트하기 쉽게 구동하는 법을 배운다.

클래스 로더 아키텍처

자바 EE 웹 애플리케이션을 개발할 때는 ClassLoader 아키텍처를 제대로 이해하는 것이 필수다. 왜

냐하면 여러분이 익숙한 표준 자바 SE 애플리케이션의 아키텍처와는 다르기 때문이다. 일반적인 애

플리케이션에서 자바 SE 플랫폼의 java.* 클래스는 재정의할 수 없는 특수한 루트 ClassLoader에 로

드된다. 이것은 예를 들어 악성 코드가 String 클래스를 바꾸거나 Boolean.TRUE 및 Boolean.FALSE를 다

시 정의하지 못하도록 방지하는 보안 조치다.

루트 ClassLoader 다음에는 JRE 설치 디렉터리의 확장 JAR에서 클래스를 로드하는 확장 ClassLoader

가 나오며, 마지막으로 애플리케이션 ClassLoader가 애플리케이션의 다른 모든 클래스를 로드한

다. 이처럼 루트가 모든 ClassLoader의 최상위 조상 역할을 하는 ClassLoader의 계층이 형성된다. 하

Page 63: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발62

위 ClassLoader는 클래스 로드 요청을 받으면 항상 부모 ClassLoader로 먼저 로드를 위임하며 루트

ClassLoader가 확인될 때까지 계층을 거슬러 올라간다. 루트 ClassLoader를 제외하고 ClassLoader는

부모 ClassLoader가 먼저 클래스를 찾지 못한 경우에만 해당 JAR 컬렉션과 디렉터리에서 클래스를

로드한다.

이러한 클래스 로딩 방식을 parent-first 클래스 로더 위임 모델이라고 하는데, 여러 애플리케이션

유형에 적합하지만 대부분의 자바 EE 웹 애플리케이션에는 맞지 않는다. 자바 EE 웹 애플리케이션

을 실행하는 서버는 일반적으로 극도로 복잡하며 여러 공급 업체에서 구현을 제공하는 경우가 많다.

따라서 서버가 애플리케이션에 사용되는 것과 동일한 타사 라이브러리를 사용하고 그중 일부에서

버전 충돌이 발생할 수 있다. 여기에 다른 웹 애플리케이션에서도 타사 라이브러리의 버전 충돌을

유발할 수 있으며 더 심각한 문제로 이어질 수 있다. 이 문제를 해결하려면 parent-last 클래스 로

더 위임 모델이 필요하다.

자바 EE 웹 애플리케이션 서버는 각 웹 애플리케이션에 공통 서버 ClassLoader를 상속하는 격리된

각각의 ClassLoader를 할당한다. 애플리케이션이 격리되므로 다른 애플리케이션의 클래스에 접근할

수 없다. 이 방법은 클래스 충돌의 위험을 해소할뿐더러 다른 웹 애플리케이션을 방해하거나 피해를

주지 못하게 차단하는 보안 조치 기능도 제공한다. 또한 웹 애플리케이션 ClassLoader는 (일반적으

로) 자신이 먼저 클래스를 로드할 수 없는 경우에만 부모에 클래스를 로드하도록 요청한다. 이 방법

으로 부모가 먼저가 아니라 나중이 되도록 클래스 로딩을 위임함으로써 웹 애플리케이션 클래스와

라이브러리가 서버의 클래스와 라이브러리보다 높은 우선순위를 갖게 할 수 있다. 번들 자바 SE 클

래스의 보호 상태를 유지하기 위해 웹 애플리케이션 ClassLoader는 여전히 다른 클래스를 로드하기

전에 루트 ClassLoader를 확인한다. 이 위임 모델은 웹 애플리케이션에서 거의 모든 경우에 적합하지

만 매우 드물게 적합하지 않은 경우가 있다. 이 때문에 자바 EE 준수 서버는 위임 모델을 parent-

last에서 parent-first로 변경하는 기능을 제공한다.

엔터프라이즈 아카이브(EAR)

WAR 파일에 대해서는 앞에서 알아봤는데 EAR 파일이라는 다른 유형의 자바 EE 아카이브가 있다.

엔터프라이즈 아카이브(Enterprise Archive)는 JAR 파일과 WAR 파일, 구성 파일을 배포 가능한

단일 아카이브(JAR 및 WAR와 마찬가지로 ZIP 형식)로 압축한 것이다.

그림 1-3

Page 64: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1장 _ 자바 플랫폼 엔터프라이즈 에디션 소개 63

위 ClassLoader는 클래스 로드 요청을 받으면 항상 부모 ClassLoader로 먼저 로드를 위임하며 루트

ClassLoader가 확인될 때까지 계층을 거슬러 올라간다. 루트 ClassLoader를 제외하고 ClassLoader는

부모 ClassLoader가 먼저 클래스를 찾지 못한 경우에만 해당 JAR 컬렉션과 디렉터리에서 클래스를

로드한다.

이러한 클래스 로딩 방식을 parent-first 클래스 로더 위임 모델이라고 하는데, 여러 애플리케이션

유형에 적합하지만 대부분의 자바 EE 웹 애플리케이션에는 맞지 않는다. 자바 EE 웹 애플리케이션

을 실행하는 서버는 일반적으로 극도로 복잡하며 여러 공급 업체에서 구현을 제공하는 경우가 많다.

따라서 서버가 애플리케이션에 사용되는 것과 동일한 타사 라이브러리를 사용하고 그중 일부에서

버전 충돌이 발생할 수 있다. 여기에 다른 웹 애플리케이션에서도 타사 라이브러리의 버전 충돌을

유발할 수 있으며 더 심각한 문제로 이어질 수 있다. 이 문제를 해결하려면 parent-last 클래스 로

더 위임 모델이 필요하다.

자바 EE 웹 애플리케이션 서버는 각 웹 애플리케이션에 공통 서버 ClassLoader를 상속하는 격리된

각각의 ClassLoader를 할당한다. 애플리케이션이 격리되므로 다른 애플리케이션의 클래스에 접근할

수 없다. 이 방법은 클래스 충돌의 위험을 해소할뿐더러 다른 웹 애플리케이션을 방해하거나 피해를

주지 못하게 차단하는 보안 조치 기능도 제공한다. 또한 웹 애플리케이션 ClassLoader는 (일반적으

로) 자신이 먼저 클래스를 로드할 수 없는 경우에만 부모에 클래스를 로드하도록 요청한다. 이 방법

으로 부모가 먼저가 아니라 나중이 되도록 클래스 로딩을 위임함으로써 웹 애플리케이션 클래스와

라이브러리가 서버의 클래스와 라이브러리보다 높은 우선순위를 갖게 할 수 있다. 번들 자바 SE 클

래스의 보호 상태를 유지하기 위해 웹 애플리케이션 ClassLoader는 여전히 다른 클래스를 로드하기

전에 루트 ClassLoader를 확인한다. 이 위임 모델은 웹 애플리케이션에서 거의 모든 경우에 적합하지

만 매우 드물게 적합하지 않은 경우가 있다. 이 때문에 자바 EE 준수 서버는 위임 모델을 parent-

last에서 parent-first로 변경하는 기능을 제공한다.

엔터프라이즈 아카이브(EAR)

WAR 파일에 대해서는 앞에서 알아봤는데 EAR 파일이라는 다른 유형의 자바 EE 아카이브가 있다.

엔터프라이즈 아카이브(Enterprise Archive)는 JAR 파일과 WAR 파일, 구성 파일을 배포 가능한

단일 아카이브(JAR 및 WAR와 마찬가지로 ZIP 형식)로 압축한 것이다.

그림 1-3

그림 1-3에는 EAR 파일 예제가 나오는데 WAR 파일과 마찬

가지로 루트 /META-INF 디렉터리는 아카이브 매니페스트를 포

함하며 애플리케이션 클래스패스에서는 이 디렉터리를 사용

할 수 없다. /META-INF/application.xml 파일은 EAR 파일에 포

함된 다양한 컴포넌트를 배포하는 방법을 설명하는 특수한 배

포 설명자다. EAR 파일의 루트 단계에는 모든 웹 애플리케

이션 모듈의 WAR 파일이 모듈당 하나씩 포함된다. 이러한

WAR 파일은 특수한 파일은 아니며 일반적인 독립 WAR 파

일과 동일한 내용과 기능을 가진다. 또한 EAR 파일은 다양한

용도의 JAR 라이브러리를 포함할 수 있다. JAR 파일은 /META-

INF/application.xml 배포 설명자에 선언된 엔터프라이즈 자바빈즈를 포함하거나 엔터프라이즈 아카

이브 내에서 두 개 이상의 WAR 모듈에 공유되는 간단한 타사 라이브러리일 수 있다.

짐작할 수 있겠지만 엔터프라이즈 아카이브에도 자체 ClassLoader 아키텍처가 있다. 일반적으로 이

아키텍처에는 서버 ClassLoader와 각 모듈에 할당된 웹 애플리케이션 ClassLoader의 계층 사이에 추

가 ClassLoader가 삽입된다. 삽입된 ClassLoader는 엔터프라이즈 애플리케이션을 다른 엔터프라이즈

애플리케이션으로부터 격리하면서도 단일 EAR의 여러 모듈에서 EAR에 포함된 공용 라이브러리를

공유할 수 있게 해준다. 이 새로운 ClassLoader는 parent-last (기본) 또는 parent-first 위임 모델을

사용할 수 있다. 그러면 웹 애플리케이션 ClassLoader는 parent-first 위임 (EAR 라이브러리 클래스

에 우선순위 부여) 또는 parent-last 위임을 (WAR 클래스에 우선순위 부여) 선택할 수 있다.

아쉽게도 엔터프라이즈 아카이브는 완전한 자바 EE 사양의 기능이기 때문에 대부분의 웹 컨테이너

전용 서버(예: 아파치 톰캣)는 이를 지원하지 않는다. 따라서 이 책에서는 더 이상 다루지 않는다.

경고 이 절에서 설명한 ClassLoader 예는 단순한 예라는 점을 기억하자. 자바 EE 사양에서는 분명히

parent-first 및 parent-last 클래스 로딩에 대해 명시하고 있지만 구현에 따라 모델을 다른 방식으로 지원할 수 있으

며 애플리케이션에 따라서는 서버에서 미묘한 문제가 발생할 수 있다. 특정 서버의 ClassLoader 아키텍처가 여러분

의 애플리케이션에 적당한지 여부를 확인하려면 해당 서버의 설명서를 읽어보는 것이 좋다.

Page 65: 자바 웹 개발 완벽 가이드 : JSP/서블릿부터 웹소켓, 스프링 MVC, JPA/하이버네이트, 스프링 시큐리티까지

1부 _ 엔터프라이즈 애플리케이션 개발64

정리

1장에서는 먼저 자바 SE와 자바 EE의 역사를 간단히 살펴보고 지난 19년간 이 두 플랫폼이 어떻게

발전해왔는지 확인했다. 그런 다음 이 책의 주요 주제인 서블릿, 필터, 리스너, JSP 등에 대해 간단

하게 소개했으며 자바 EE 애플리케이션이 내부적으로 그리고 파일 시스템 상에서 어떻게 구성되는

지 살펴봤다. 그다음으로 웹 애플리케이션 아카이브와 엔터프라이즈 아카이브를 알아보고 이러한

아카이브가 자바 EE 애플리케이션을 전송하고 배포하는 데 어떻게 사용되는지 확인했다.

이 책의 나머지 부분에서는 이러한 주제를 심도 있게 설명하고 1장을 진행하면서 궁금하게 생각했

을 내용을 알아볼 것이다. 2장에서는 애플리케이션 서버와 웹 컨테이너를 자세히 알아보고 자신에

게 맞는 제품을 선택하는 방법을 설명한다. 또한 이 책의 예제를 실행하는 데 사용할 톰캣을 설치하

는 방법도 알아본다.