Part1. 서블릿 프로그래밍
클라이언트에서 웹 브라우저를 통해 요청이 들어오면 서버에서 해당 요청을 수행하고 결과값을 클라이언트에게 전송한다.
HTTP 프로토콜로 통신하는 웹을 잘 활용할 수 있는 API를 제공한다.
자바언어로 구현해야한다.
서블릿과 동일한 기능을 가지고 있지만, 서블릿과 다른 점이 있다.
HTML 페이지 안에서 스크립트 형태로 구현된다. 코드가 좀 더 간결하다
웹 애플리케이션의 역할에서
1. JSP는 뷰 페이지를 만들 때 사용 → 뷰 : 요청을 받거나 보여주는 페이지
2. 서블릿을 컨트롤러 페이지를 만들 때 사용 → 컨트롤러 : 뷰에서 온 요청을 처리하는 페이지
웹에서 수행되는 애플리케이션
수행되는 위치에 따라
Client Side : 클라이언트의 자원을 이용하고 클라이언트에 의해 수행될 때
Server Side : 서버에서 수행되고 서버의 자원을 사용하며, 그 결과를 클라이언트에 전송할 때
구현하는 방식에 따라
컴파일 방식 : 웹 애플리케이션이 미리 컴파일되고 실행 파일이 만들어진 후 사용되면
비컴파일 방식 : 요청이 있을 때마다 해석되거나 컴파일이 필요없을 때
Resourcce Oreiented Architecture : 리소스 중심의 표현, 전달, 접근 방식의 기술
서버 ↔ 클라이언트
자원의 접근을 위해서 URI와 HTTP 요청방식을 사용하고 다양한 형식으로 클라이언트에게 응답을 보낼 수 있다.
웹 서버
웹에서 서버 기능을 수행하는 프로그램
HTTP 프로토콜을 기반으로 클라이언트에게 요청을 받으면 해당 요청을 서비스하는 기능을 담당한다.
제공하는 기능들
웹 어플리케이션 서버
웹 서버 → 다양한 문서와 웹 애플리케이션 처리 / 웹 , Client, Server 환경의 요청 처리 → 많은 요청이 왔을 때 웹 서버 혼자서 감당 X
⇒ 웹 서버의 기능을 분리해서 처리하기 위해 웹 애플리케이션 서버를 사용
ex) Tomcat
WAS의 구성
톰캣
JSP/서블릿 컨테이너와 웹서버만 제공
일반적으로 독립적인 웹서버를 설치 + 톰캣 연동
WAS 시장의 점유율이 높다.
서블릿/JSP 웸 서버 애플리케이션
컨테이너
개발자대신 웹 컴포넌트 저장, 메모리 로딩, 객체 생성 및 초기화 같이 웹 컴포넌트를 관리해주는 역할
서블릿 컨테이너
서블릿 생명주기 관리 및 수행하는 프로그램
클라이언트 요청에 따라 서블릿을 수행하는 프로그램
서블릿 표준 API를 기반으로 클래스를 제공
→ 기본적인 동작과 API 호환성을 지원
JSP 컨테이너
JSP를 서블릿으로 변환하는 프로그램
Application Layer에 해당하는 프로토콜
Transport Layer에서 TCP를 이용해 웹 브라우저와 웹 서버 간에 통신하는 프로토콜이다.
특징
HTTP 요청정보
HTTP 응답정보
웹 브라우저에서 클라이언트에게 요청을 받아 서버가 실행할 수 있는 유일한 자바 프로그램
서블릿 표준 API를 기반으로 클래스를 제공
→ 기본적인 동작과 API 호환성을 지원
⇒ 서블릿 API를 상속하고 있기에 웹에서 동작하는 기본 동작을 갖추고 있다.
서블릿 객체의 생명주기
init()
service()
destroy()
- 웹 애플리케이션 서비스가 중지되는 시점에 한번만 실행된다.
⇒ 즉 서빌릿은 최초 요청 시 객체가 생성되고 그 이후 요청들에 대해서는 재사용되다가 서버가 종료될때 서블릿 객체는 삭제된다.
응답, 요청 객체가 생성되고 사라지는 과정
ServletRepoonse 인터페이스
HttpServletResponse가 상속하고 있는 인터페이스
일반적인 네트워크 통신에서의 응답 관련 메소드 제공
HttpServletResponese
HTTP 통신 기반의 응답 관련 메소드 제공
ex) 쿠키 설정, HTTP 응답 헤더 설정
ServletRequet 인터페이스
HttpServletRequest가 상속하고 있는 인터페이스
일반적인 네트워크 통신에서의 요청관련 메소드 제공
주요메소드
- getContentLength
- getPrameter
- getServerPort
HttpServletRequest
HTTP 통신 기반의 요청 관련 메소드 제공
호출 메소드
HttpServletRequest 인터페이스를 통해 호출 가능 → getRequestURI() / getRequestURL()
URI : 클라이언트가 요청한 문서정보를 반환
URL : 클라이언트가 서비스를 요청한 문서의 전체 정보 (프로토콜 + 서버주소 + 포트번호 + URI)
쿼리 : URL과 함께 넘어온 정보들
GET 요청은 requestybody가 없으므로 URL에 붙어 쿼리형태로 데이터를 넘겨줄 수 있다.
클라이언트가 웹서버에 정보를 요청할 떄 질의 문자열을 사용해서 필요한 데이터를 전달한다.
<servlet>
<servlet-name>
<servlet-class>
<init-param>
<param-name>
<param-value>
<load-on-startup>
CGI
클라이언트 요청이 들어올때마다 독립적인 프로세스가 만들어진다.
→ 프로세스마다 메모리에 데이터가 로딩된다.
서블릿
서블릿 최초 요청 → init() 호출 ⇒ 하나의 프로세스 생성
최초 이후 서블릿 요청 → service() 호출 = 만들어진 프로세스내에 스레드 생성
스레드는 독립적인 stack을 가지고 있지만 code, heap 영역은 다른 스레드와 공유한다.
⇒ 메모리 측면에서 효율적
⇒ 변수의 범위를 주의해서 사용해야한다.
멤버 변수
지역 변수
HTTP 통신의 특징 중 하나
클라이언트가 요청을 보내고 서버가 응답을 보내면 연결이 끊기기때문에 이전에 요청을 보냈던 클라이언트에 대한 정보가 없는 것을 의미한다.
계속된 요청에 사용할 수 있도록 이전 서비스 결과를 저장한 정보들을 상태정보라고 한다.
클라이언트 혹은 서버에 저장하는 방식이 있다.
웹 애플리케이션 단위로 유지하며 서버측에 저장되는 객체이다.
ServletContext는 해당 웹 애플리케이션에 포함된 모든 서블릿이 공유하고 있다.
→ 속성을 이용해 서블릿 간 정보 공유가 가능하다.
ServletContext 추출하는 방법
ServletContext는 해당 웹 애플리케이션에 포함된 모든 서블릿이 공유하고 있다.
ServletContext 변수 설정
web.xml 파일에서 이용
ServletContext 변수 추출
ServletContext.getInitParameter() 이용
활용 예시
특징
쿠키생성
javax.servlet.http.Cookie 객체를 이용해 생성한다.
→ 해당 객체의 함수들을 이용해 쿠키의 속성을 설정할 수 있다.
일정기간동안 클라이언트 상태 정보 저장을 목적으로 한다.
저장 위치
활용 예시
💡세션 트래킹
HttpSession 객체 생성
HttpServletRequest.getSession(boolean create)
요청 재지정
아래 객체들을 이용해 요청온 페이지에서 다른 페이지로 요청을 옮겨줄 수 있다.
Reqeust 단위 정보 공유
Filter 인터페이스
방법 1 : 태그 이용
<filter>
태그 이용해 필터 객체 등록<filter-mapping>
태그로 필터와 서블릿 매핑필터 등록
<filter>
태그<filter-name>
<filter-class>
<init-param>
<param-name>
<param-value>
필터 매핑
<filter-mapping>
태그<filter-name>
<url-pattern>
<servlet-name>
FilterConfig
필터 객체에 필터에 대한 정보값들을 전달한다.
방법 2 : @WebFilter 이용
= 이벤트 핸들러
각 이벤트가 발생한 시점에서 수행될 처리 내용을 구현할 수 있다
웹의 이벤트 소스
방법 1 : 태그 이용
<listner>
태그 이용해서 web.xml에 등록방법 2 : @WebListener 이용
자바에서는 프로그램 실행 중 발생하는 오류도 객체로 표현한다.
방법 1: try catch 처리
방법 2: Throw 처리
throw로 처리한 오류가 발생시 해당 함수를 호출한 부분에서 오류 해결
방법 3 : web.xml 오류 처리
<error-page>
<error-code>
, <exception-type>
에 지정된 오류 유형을 가진 오류가 발생 시
→ <location>
태그에 지정된 오류 페이지가 실행
Part2. JSP 프로그래밍
템플릿 데이터에 동적인 데이터를 끼워 넣을 수 있는 방법을 제공한다.
추상화를 위한 JSP 기능
자바빈즈 컴포넌트 아키텍처
컨테이너는 JSP와 서블릿 클래스를 웹 컴포넌트로 인식
스크립트 태그의 종류에 따라 자바 소스로 변환된다.
지시자
<%@ … %>
페이지에 대한 정보 설정
page 지시자
<%@ page 속성 = 값 %>
include 지시자
<%@ include file = “파일명” %>
선언문
<%! 변수 선언 %>
혹은 <%! 메소드 선언 %>
스크립트릿
<% … %>
표현식
<%= … %>
주석
<%-- … -->
JSP 파일이 자바 소스로 변환될 때 _jspService() 메소드 안에 자동으로 생성된 코드로 인해 미리 선언과 초기화가 된 객체들
_jspSerive() 메소드내에서만 내장 객체는 사용할 수 있기때문에, 스크립트릿과 표현식에서만 사용할 수 있다.
많이 쓰는 기능을 JSP 스펙으로 이미 정의해서 컨테이너마다 동일하게 구현해놓은 표준 액션 태그이다.
태그 사용
<태그 라이브러리 이름 : 태그 이름>
표준 액션 태그 종류
<jsp : forward page = “경로”>
<jsp : include file = “파일경로”>
JSP 자바빈즈의 장점
JSP 자바빈즈 개발 규약
패키지화
기본 생성자 존재
멤버 변수 ⇒ private
getter/setter 메소드 ⇒ public
직렬화 구현 (선택사항)
자바빈즈 생성 및 사용
생성
사용
<jsp:useBean class = “클래스명” id=”식별자명”>
<jsp:getProperty property=”변수명” name=”id명”>
<jsp:setProperty property=”변수명” name=”id명” value=”저장할값”>
Part3. JSP 프로그래밍2
자바 프로그램에서 DB 관련 작업을 수행한다.
자바언어로 다양한 관계형 데이터베이스에 접속하고 SQL 문을 수행하기 위해 사용되는 표준 SQL 인터페이스 API 이다.
💡 JDBC 프로그램 ↔ JDBC 인터페이스 ↔ JDBC 드라이버 ↔ DB
JDBC 드라이버 로딩
DBMS 서버 접속
Statement, PreparedStatement 객체
Statement 실행
자원 해제
- 최근에 사용한 객체부터 거꾸로 올라가며 해제
Connection을 효율적으로 관리하고 사용하기 위해 Connection Pool을 사용
Connection Pool은 미리 Connection 객체를 가지고 있어 사용자가 요청이 들어올때 바로 사용할 수 있는 특징이 있다.
이때 Connection Pool을 관리하는 목적으로 DataSource 객체를 사용한다.
💡사용방법
JSP의 내장객체처럼 내장 객체 참조변수 이름으로 곧바로 사용할 수 있다.
내장객체의 대부분은 map 형태로 되어 있다.
param
질의 문자열을 쉽게 가져올 수 있다.
${param.keyName}
혹은 ${param[keyName]}
활용 예시) <jsp:forward page=”${param.p}” />
header
요청정보의 헤더정보를 가져온다.
request, session, application 단위로 정보를 추출하는 간단한 방법
Tag Handler Class
태그 기능을 자바 클래스 파일에 구현
Tag Libray Descriptor
JSP 태그와 연결
TLD 파일 등록
JSP 컨테이너가 TLD 파일을 인지하도록 web.xml에 등록 혹은 WEB-INF 폴더에 넣기
커스텀 태그 사용
taglib 지시자를 이용해 JSP 페이지에서 선언
JSP 파일에 직접 구현한다.
Tag 파일 (*.tag)
JSP 페이지처럼 작성하지만 tag 지시자를 사용
일반 JSP 페이지에서 사용할 수 없는 지시자 사용
내부적으로 태그 파일이 태그 핸들러 파일로 변환되어 사용된다.
커스텀 태그 사용
taglib 지시자를 사용해 JSP 페이지에서 선언
tag 지시자
커스텀 태그에 대한 기본적인 정보를 설정
attribute 지시자
커스텀 태그에 사용할 속성 정의
variable 지시자
EL에서 사용하는 변수를 선언할 때 사용
name-given
EL에서 사용할 변수의 이름을 지정
scope
<jsp:doBody>
커스텀 태그 몸체의 내용을 출력해주는 태그
태그 라이브러리를 공통으로 사용하기 위한 표준
Core, Formatting, SQL, XML, Functions 5개의 태그 라이브러리를 제공하고 있다.
기본 액션
ex) <c:set>, <c:out>, <c:remove>, <c:catch>
조건 액션
ex) <c:if>, <c:choose>, <c:when>, <c:otherwise>
반복 액션
ex) <c:forEach>, <c:forTokens>
URL 액션
ex) <c:import>. <c:url>, <c:param>, <c:redirect>
서비스 지역이나 문화에 맞줘 작업이 수행될 수 있게 도와주는 역할을 한다.
ex) <fmt:message>, <fmt:param>, <fmt:requestEncoding>, <fmt:timeZone>
데이터베이스에 관련된 기능을 수행한다.
ex) <sql:setDataSource>, <sql:query>, <sql:update>
Part4. MVC 기반 웹 프로젝트
개발 디자인 패턴
Model
View
→ 클라이언트로부터 요청이 일어나거나 처리된 결과를 보여주는 페이지
Controller
→ 뷰에서 클라이언트가 서비스를 요청했을 때 실행되는 곳
구조적인 측면에서 3계층 아키텍쳐 사용
Presentation tier
클라이언트 ↔ 애플리케이션
프론트엔드
Business tier
서비스 처리를 위한 비즈니스 로직을 구현
벡엔드, 미들웨어
Persistent tier
데이터베이스 서버나 파일 시스템에 접근해서 데이터를 생성, 관리하는 계층
벡엔드
jdbc 드라이버 로딩 과정
sql Injection
참조도서
- 처음 해보는 Servlet & JSP 웹 프로그래밍