JANGUN


JSP 프로그래밍


지음 : 김희천



목차

제1장 웹과 자바
제2장 개발 환경 설정하기
제3장 JSP 개요
제4장 JSP 동작원리
제5장 요청과 응답
제6장 내장 객체와 Scope
제7장 모듈화된 JSP 페이지 만들기
제8장 쿠기(Cookie) 사용하기
제9장 세션(Session) 사용하기
제10장 자바빈(JavaBeans) 사용하기
제11장 JDBC를 이용한 데이터베이스 프로그래밍
제12장 표현 언어와 표준 태그 라이브러리
제13장 MVC 패턴 이해하기
제14장 회원관리 시스템 만들기


제1장 웹과 자바

- 웹은 인터넷 상에 분산된 전 세계적 정보 공간 또는 정보 공유 서비스를 의미한다.
- 웹 문서는 웹 클라이언트가 요청할 때 웹 서버가 응답으로 제공하는 컨텐츠로 정적인 웹 문서와 동적인 웹 문서로 구분된다.
- 웹 어플리케이션이란 웹에서 수행되는 응용 프로그램이며, 수행 위치에 따라 웹 서버 기술과 웹 클라이언트 기술로 구분된다.
- JSP는 Java EE 기술 중 하나로 동적으로 웹 문서를 만들기 위한 서버 측 웹 프로그래밍 기술이다.
- 웹 서버란 웹에서 서버 기능을 처리하는 프로그램으로서 HTTP 프로토콜을 기반으로 하여 웹 클라이언트(브라우저)로부터의 요청을 받고 결과를 응답해 주는 기능을 담당한다.
- 웹 서버의 기능을 구조적으로 분리하여 웹 어플리케이션을 실행하고 관리하려는 목적으로 제시된 것이 웹 어플리케이션 서버(WAS)이다.
- 자바 기반의 웹 어플리케이션 서버는 동적으로 웹 문서를 만드는 웹 컨테이너와 비즈니스 로직을 처리하는 EJB 컨테이너 및 기타 기능을 포함한다.
- HTTP(HyperText Transfer Protocol)는 전송 계층의 TCP에 기반한 응용 계층의 프로토콜로서 웹 클라이언트와 웹 서버 사이에 웹 문서를 전송하기 위한 통신 규약이다.



제2장 개발 환경 설정하기

- JSP 페이지는 자바 서블릿 프로그램으로 번역되어 실행되므로 JDK를 설치해야 한다.
- 서블릿 프로그램이나 JSP 페이지를 실행시키고 관리하기 위해 웹 컨테이너를 설치해야한다. 톰캣(Tomcat)은 웹 컨테이너의 하나로 무료 공개 소프트웨어이다.
- 자바 기반의 통합 개발환경인 이클립스(Eclipse)를 이용하면 JSP 프로그램을 편리하게 개발, 컴파일 및 디버깅 작업 등을 할 수 있다.
- 웹 어플리케이션의 개발이 끝나면 실제 웹 서비스를 제공하기 위해서 배포 작업을 통해 웹 컨테이너에 웹 어플리케이션을 등록해야 한다.
- 웹 어플리케이션을 배포하기 위해 만드는 WAR 파일은 JSP 페이지, 서블릿, Java 클래스, HTML 파일 등을 묶은 압축 파일이다.



제3장 JSP 개요

- JSP 기술은 동적으로 웹 컨텐츠를 생성하기 위해 프로그래밍 코드가 담긴 스크립트와 HTML 태그를 함께 쓸 수 있게 해준다.
- 스크립트 요소는 JSP 페이지에 삽입되는 자바 코드인 스크립트릿, 변수나 수식의 값을 출력하는데 사용되는 표현식, 메서드나 변수의 선언에 사용되는 선언으로 나뉜다.
- 지시어는 JSP 페이지에 대한 설정을 정하는 것으로, 이것은 변역 과정에서 사용된다.
- 내장 객체는 JSP 프로그램을 작성할 때 자주 사용되는 기능을 미리 구현해 놓고 제공하는 객체로서 request, response, session, application, out, page 등이 여기에 해당한다.
- 액션 태그는 XML 태그와 같은 형식이며 특별한 기능을 제공한다.
- 표현 언어는 표현식보다 사용하기 쉬운 새로운 스크립트 언어로 스크립트 요소 밖에서 사용한다.



제4장 JSP 동작원리

- JSP 페이지에 대한 요청이 들어오면, JSP 페이지는 서블릿 프로그램으로 변환되고 컴파일되어 실행된 후, 그 결과가 클라이언트에 응답으로 전송한다.
- 응답 결과를 만들 때, 즉시 클라이언트로 결과를 전송하지 않고 출력 버퍼에 임시 저장할 수 있다. 실행이 끝나거나 버퍼가 차면 클라이언트로 결과를 전송하여야 한다.
- page 지시어를 통해 JSP 컨테이너에게 페이지의 속성과 실행 옵션을 알려줄 수 있다.
- WEB-INF 폴더에는 웹 어플리케이션 설정 정보를 담고 있는 web.xml 파일이 저장된다. WEB-INF\classes 폴더에는 웹 어플리케이션에서 사용되는 클래스 파일이, WEB-INF\lib 폴더에는 .jar 파일들이 저장된다.
- 개발된 웹 어플리케이션을 실제 서버에 배포하려면 이클립스를 이용하여 WAR 파일로 묶어서 배포하면 된다.
- 서블릿 클래스에는 doGet() 또는 doPost() 메서드가 구현되어야 한다. GET 방식으로 접근할 때 doGet() 메서드가 실행되며, POST 방식으로 접속할 때는 doPost() 메서드가 실행된다.



제5장 요청과 응답

- request 객체는 내장 객체의 하나로서 클라이언트 요청에 관한 정보를 가지고 있다. 따라서 request 객체는 클라이언트/서버의 정보, 클라이언트가 전달하는 데이터, 요청 헤더 등의 읽기 기능을 제공한다.
- 웹 브라우저는 GET 방식과 POST 방식 중 한 가지를 이용해서 파라미터를 전송한다. 데이터를 전송할 때 GET은 요청 URL에 전송할 데이터를 붙여서 전송하는 방식이고, POST 방식은 요청 몸체에 파라미터를 넣어 전송한다.
- 클라이언트로부터 전송된 파라미터가 하나의 값을 가질 때는 값을 읽기 위해 request.getParameter() 메서드를 사용하고, 여러 개의 값을 가질 수 있다면 getParameterValues() 메서드를 사용하여야 한다.
- 톰캣에서 GET 방식으로 전달된 파라미터를 읽을 때 사용할 charset은 server.xml 파일에서 <Connector> 태그의 'URIEncoding' 속성의 값으로 직접 지정하거나, <Connector> 태그의 'useBodyEncodingForURI' 속성의 값을 'true'로 지정한 후 JSP 페이지에서 request.setCharacterEncoding() 메서드를 이용하여 charset을 지정한다.
- 요청 헤더는 웹 브라우저가 웹 서버에 요청 정보를 보낼 때 데이터와 함께 전송되는 추가적인 정보로서, request 객체는 요청 헤더의 내용을 읽어 오는 메서드를 제공한다.
- response 객체는 내장 객체의 하나로 웹 서버가 클라이언트에게 보낼 응답을 만들 때 사용한다. response 객체를 이용하여 다른 페이지로 이동, 상태 코드 설정, 응답 헤더 설정, 쿠키 추가 등을 할 수 있으며 응답 몸체를 만들기 위한 출력 스트림을 얻을 수 있다.
- 응답 헤더는 웹 서버가 웹 브라우저에 요청에 대한 응답을 전송할 때 데이터와 함께 전송되는 추가 정보로서, response 객체는 응답 헤더에 데이터를 설정하는 메서드를 제공한다.



제6장 내장 객체와 Scope

- 내장 객체는 웹 컨테이너가 만들어 자동으로 제공하는 객체로서 JSP 프로그래밍에 필요한 정보를 가지고 있고 조작 기능을 제공한다.
- pageContext 객체는 하나의 JSP 페이지와 1:1로 대응되는 객체로서 JSP 페이지에서 사용될 수 있는 내장 객체들을 리턴하는 메서드를 제공한다.
- application 객체는 웹 어플리케이션의 정보를 저장하고 관리하는 객체이다. 따라서 특정 웹 어플리케이션에 포함된 모든 JSP 페이지는 하나의 application 객체를 공유하게 된다.
- JSP 페이지에서 데이터 출력을 위해 out 객체를 이용한다. out 객체는 웹 브라우저에 데이터를 전송하는 출력 스트림으로 JspWriter 유형의 객체이다.
- JSP 페이지 내에서 사용되는 HTML 태그나 텍스트들은 서블릿 프로그램으로 번역될 때 out.print()에 문자열 인자로 전달되며, 표현식에서는 수식이 인자로 전달된다.
- request 영역은 웹 브라우저의 요청 한번을 영역으로 한다. 즉, 하나의 요청을 처리하는 동안에 사용되는 JSP 페이지들은 하나의 request 영역에 속한다.
- session 영역은 웹 브라우저가 살아있는 동안의 범위를 나타낸다. 일단 세션이 생성되면 웹 브라우저를 종료할 때 까지 모든 요청들은 하나의 session 영역에 포함된다.
- application 영역은 웹 어플리케이션이 살아있는 동안의 범위를 나타낸다. 따라서 웹 컨테이너가 구동되고 같은 웹 어플리케이션에 속해 있는 모든 페이지들은 하나의 application 영역에 포함된다. application 영역은 웹 컨테이너가 종료되거나 재시작될 때 사라진다.
- 영역을 표현하는 내장 객체에 속성을 저장할 수 있다. 속성은 같은 영역에 속하는 JSP 페이지들 사이에서 정보를 공유하기 위한 목적으로 사용된다.



제7장 모듈화된 JSP 페이지 만들기

- <jsp:include>액션 태그는 지정한 페이지의 실행 결과를 태그가 위치한 부분에 응답 결과로 포함시킬 때 사용된다. 예를 들면 <jsp:inlclude page="page.jsp" flush = "false" />와 같다.
- include 지시어는 지정된 파일의 소스나 텍스트를 변환 작업 전에 삽입시키는 기능을 수행한다. 형식은 <%@ include file="파일이름" %>와 같다.
- prelude와 coda 방법은 web.xml 설정을 이용하여 중복되는 코드를 일괄적으로 특정 페이지의 앞 또는 뒤에 포함시키는 기능이다.
- <jsp:forward> 액션 태그는 하나의 JSP 페이지에서 다른 JSP 페이지로 강제 이동시킬 때 사용된다. 형식은 <jsp:forward page="이동할 페이지" />이다.
- from.jsp 페이지에서 to.jsp로 이동시키는 <jsp:forward> 태그를 만나면 그때까지 출력 버퍼에 저장되었던 내용을 모두 지워 실행을 중단하고 to.jsp 페이지로 요청을 이동한다. <jsp:forward>를 수행하기 전에 이미 from.jsp 페이지에서 클라이언트로 전송이 이루어졌다면 예외가 발생한다.
- <jsp:param> 태그는 <jsp:include>나 <jsp:forward>의 서브 요소로 사용되는 태그로서 request 객체 외에 추가로 요청 파라미터 데이터를 넘겨주는 기능을 수행한다.



제8장 쿠기(Cookie) 사용하기

- 웹 브라우저가 웹 서버에 최초 요청을 보내고 그 요청에 대한 응답을 웹 서버가 보낼 때, 상태 관리를 위해 쿠키를 응답 헤더에 넣어 보낼 수 있다. 웹 브라우저는 해당 쿠키를 저장했다가 같은 서버에 다른 요청을 보낼 때 쿠키를 요청 헤더에 넣어서 보낸다.
- 쿠키는 <이름, 값>의 형태로 구성되며 이름이나 값은 알파벳과 숫자로 된 문자열만 가능하다. 쿠키에 ‘유효시간’, ‘도메인’, ‘경로’ 등과 같은 추가적인 정보가 지정될 수 있다.
- 쿠키의 생성은 이름과 값을 인자로 주어 Cookie 객체를 만드는 것이며, 쿠키를 보내려면 response.addCookie(Cookie)를 이용한다.
- 쿠키의 유효시간은 쿠키가 생성된 이후에 사용될 수 있는 기간을 의미한다. 유효시간이 경과된 쿠키는 클라이언트에서 자동으로 삭제된다. 유효시간의 기본 값은 –1이며, 이 경우 쿠키는 웹 브라우저를 종료할 때 삭제된다.
- 쿠키 값을 변경하려면 같은 이름의 쿠키를 생성한 후 값을 변경하여 전송하면 되며, 삭제하려면 유효시간을 0으로 변경하여 전송해 주면 된다.
- 클라이언트에서 서버로 요청할 때, 쿠키에 지정된 도메인과 경로에 따라 상응하는 페이지로의 요청에만 쿠키가 동봉된다.



제9장 세션(Session) 사용하기

- 세션은 쿠키와 마찬가지로 클라이언트의 상태 정보를 관리하기 위한 것이다. 쿠키와 다르게 세션 정보는 웹 브라우저가 아니라 서버에 저장된다.
- 세션 관리를 위한 session 내장 객체는 클라이언트가 웹 서버에 최초 접속했을 때 자동으로 생성된다.
- 세션이 유지되는 동안 웹 브라우저의 여러 요청을 처리하는데 사용되는 JSP 페이지들은 session 객체를 공유한다.
- session 객체에 속성을 저장할 수 있다. 속성을 추가할 때는 다른 내장 객체와 마찬가지로 setAttribute() 메서드를 사용하고, 설정된 속성의 값을 읽어올 때에는 getAttribute() 메서드를 사용한다. session 객체는 HttpSession 유형이다.
- 웹 브라우저를 종료하면 서버에 저장된 세션이 삭제된다.
- 웹 브라우저를 종료하지 않더라도 세션의 유효시간이 경과하면 삭제된다. 유효시간은 서버에 추가 요청을 하지 않아도 세션을 유지시킬 수 있는 최대 시간이다. 서버에 저장된 세션을 삭제하기 위해서 invalidate() 메서드를 사용할 수도 있다.
- 세션의 유효시간을 설정하는 첫 번째 방법은 web.xml 파일에 <session-timeout> 항목을 추가하는 것이고, 두 번째 방법은 session 객체의 setMaxInactiveInterval() 메서드를 사용하여 유효시간을 설정하는 것이다.



제10장 자바빈(JavaBeans) 사용하기

- 자바빈이란 자바빈 설계규약에 따라 정의된 자바 클래스이다. 자바빈을 사용하면 비즈니스 로직과 프리젠테이션 로직을 분리할 수 있다.
- 자바빈을 사용하면 한번 만들어 놓은 자바빈을 다른 프로그램에서 재사용할 수 있다.
- 자바빈 클래스에 생성자를 넣으려면 파라미터가 없는 기본 생성자를 반드시 포함시켜야 한다.
- 자바빈 설계규약에 맞는 자바빈 클래스를 정의하려면 자바빈 클래스의 모든 속성에 대한 getter 메서드와 setter 메서드를 정의해야 한다.
- <jsp:useBean> 태그의 형식은 다음과 같으며 반드시 id 속성을 포함해야 한다. <jsp:useBean id=“빈이름” class=“패키지.클래스이름” scope=“범위” />
- <jsp:useBean> 태그는 scope로 설정되는 사용범위 안에 같은 이름의 자바빈 객체가 존재하지 않으면 새로운 자바빈 객체를 생성하며, 존재한다면 해당 자바빈 객체를 사용할 수 있도록 한다.
- <jsp:setProperty>, <jsp:getProperty> 액션 태그를 사용하여 자바빈 객체의 속성 값을 변경하거나 읽어올 수 있다.



제11장 JDBC를 이용한 데이터베이스 프로그래밍

- 데이터베이스는 정보를 뜻하는 데이터(data)와 집합장소를 의미하는 베이스(base)의 합성어로 ‘데이터를 모아놓은 집합장소’를 의미한다.
- 관계형 DBMS에서는 데이터를 테이블(table)형태로 저장한다.
- ‘MySQL 5.6 Command Line Client’ 프로그램을 이용하면 MySQL 명령어 및 SQL 구문을 실행시킬 수 있다.
- MySQL은 널리 사용되는 무료 DBMS이다.
- 데이터베이스에 저장된 데이터를 검색하거나 수정할 때 SQL 구문을 사용하다.
- DBMS 서버와 연결을 설정할 때는 java.sql 패키지가 제공하는 DriverManager 클래스를 사용한다.
- SQL의 select 구문을 실행할 때는 Statement 인터페이스의 executeQuery() 메서드를 사용하고, insert/update/delete 구문을 실행할 때는 executeUpdate() 메서드를 사용한다.
- 같은 SQL 구문을 여러 차례 사용할 때는 PreparedStatement 객체를 사용하는 것이 효과적이다.
- ResultSet 객체를 사용하여 select 구문의 실행 결과를 다룰 수 있다.



제12장 표현 언어와 표준 태그 라이브러리

- 표현 언어(Expression Language)는 JSP 2.0 버전부터 공식적으로 채택되었다. 웹 컨테이너가 직접 표현 언어를 해석할 수 있으며, 표현식을 사용하는 모든 곳에서 표현 언어를 사용한 수식을 사용할 수 있다.
- 표현 언어는 JSP의 스크립트 요소인 스크립트릿, 표현식, 선언부를 제외한 나머지 부분에서 사용될 수 있으며 기존의 표현식 보다 간단하게 값을 표현할 수 있다는 장점을 가지고 있다.
- 표현 언어에서 객체에 저장된 속성에 접근할 때 ‘.’이나 ‘[]’를 사용한다. 예를 들어 ${cookie.name}과 ${cookie[’name‘]}은 똑같이 이름이 “name”인 Cookie 객체를 리턴한다.
- 표현 언어에서 page, request, session, application 영역에 저장된 속성에 접근할 때는 pageScope, requestScope, sessionScope, applicationScope 내장 객체를 사용한다.
- 영역을 나타내는 내장 객체를 사용하여 ${requestScope.name}처럼 사용하지 않고 ${name}와 같이 속성의 이름만 지정한 경우, page, request, session, application 영역을 순서대로 검색해 이름이 “name”인 속성이 존재하는지 확인하고 존재하면 해당되는 값(객체)을 출력하게 된다.
- 자바 클래스의 메서드를 표현 언어로 호출하려면 다음과 같은 절차를 거쳐야 한다.
➀ 먼저 해당 메소드를 정의하는 자바 클래스 파일을 작성한다.
➁ 태그 라이브러리에 대한 정보를 TLD 파일에 기술하고 적당한 곳에 위치시킨다.
➂ 웹 애플리케이션의 WEB-INF 폴더에 존재하는 web.xml 파일에 ‘TLD 파일 사용에 필요한 설정’을 추가한다(선택사항).
➃ JSP 페이지에서 표현 언어를 이용하여 메소드를 호출한다.

- 사용자가 직접 만들어 사용하는 태그를 사용자 정의 태그 또는 커스텀 태그라고 하는데 이러한 사용자 정의 태그들 중에서 자주 사용되는 것들을 모아서 표준화 시킨 것이 바로 JSTL이다.
- JSTL에서 제공되는 태그는 다음과 같은 5가지로 분류된다.

라이브러리 이름 지원 기능 접두어
코어 변수 / 흐름제어 / URL처리 c
XML XML 관련 처리 x
국제화 메시지 형식 / 숫자 및 날짜 형식 fmt
데이터베이스 SQL sql
함수 컬렉션 처리 / String 처리 fn

- 코어 라이브러리는 자바의 기본 문법이나 변수 지정 등과 같은 코드를 지원하기위해 제공되는 태그들이다.
- URL 처리와 관련된 태그에는 <c:import>, <c:url>, <c:redirect> 태그 등이 있다.
- JSTL은 표현 언어 수식에서 사용할 수 있는 함수를 제공한다.



제13장 MVC 패턴 이해하기

- 모델 1 구조에서는 프리젠테이션 로직과 비즈니스 로직이 JSP 페이지에서 혼합되어 있다. 요청은 JSP 페이지로 전송되고, JSP 페이지는 해당 요청을 처리하기 위해 자바 빈 객체나 내장 객체를 이용하여 작업을 처리하고 그 결과를 다시 웹 브라우저에게 전달한다.
- 모델 2 구조에서는 프리젠테이션 로직과 비즈니스 로직이 분리되어 있다. 클라이언트의 요청을 JSP 페이지가 아닌 서블릿이 받는다. 서블릿은 사용자의 요청에 따라 필요한 비즈니스 로직을 처리하고 그 결과를 해당 JSP 페이지에 전달한다. JSP 페이지는 전달받은 페이지를 클라이언트에게 보내주는 역할을 담당한다.
- MVC(Model-View-Controller) 패턴이란 객체지향언어로 프로그램을 개발할 때 사용되는 개발 방법의 하나로 프로그램의 각 구성요소들을 역할에 따라 모델, 뷰 및 컨트롤러로 분류한다.
- MVC 패턴을 적용하는 이유는 개발 과정과 유지보수 및 재사용을 효율적으로 할 수 있기 때문이다.
- 모델은 비즈니스 로직의 처리를 담당하고, 뷰는 프리젠테이션 로직의 처리를 담당한다. 컨트롤러는 사용자와의 인터페이스와 프로그램 전체의 흐름 제어를 담당한다.
- MVC 패턴이 적용된 모델 2 구조에서 서블릿은 컨트롤러의 역할을 담당하고, JSP 페이지는 뷰의 역할을 담당한다. 그리고 자바 빈 클래스 등이 모델의 역할을 담당한다.



제14장 회원관리 시스템 만들기

- MemberInfo 클래스는 회원 정보 저장을 위한 자바빈 클래스이다.
- DataManager 클래스는 데이터베이스 관련 작업을 처리하는 자바 클래스이다.
- index.jsp 페이지는 메인 페이지이며, 로그인 폼과 로그인 버튼(login.jsp) 및 회원가입 페이지로의 링크(register_form.jsp)를 제공한다.
- register_form.jsp 페이지는 회원가입 폼과 회원가입 버튼(register.jsp)을 제공한다.
- login.jsp는 로그인 요청을 처리하는 페이지이다. 로그인이 성공한 경우 회원정보 화면(member_info.jsp)으로 이동된다.
- member_info.jsp 페이지는 회원 정보 제시와 수정을 위한 폼과 버튼(update.jsp)을 제공한다. 또 로그아웃과 회원탈퇴 페이지로의 링크(logout.jsp, delete.jsp)를 제공한다.