목차
1 웹 통신 구조
2 Servlet
3 JSP
1 웹 통신 구조
1) 웹 통신의 기본 흐름
(1) 웹 통신
웹 통신은 클라이언트가 서버에 요청을 보내고, 서버가 그 요청을 처리한 뒤 응답을 돌려주는 구조이다.
사용자가 브라우저에서 주소를 입력하거나 버튼을 누르면 요청이 발생하고, 서버는 그 요청에 맞는 결과를 다시 보내준다.
(2) Client
Client는 서버에 서비스를 요청하는 쪽이다.
웹에서는 보통 사용자의 브라우저가 Client 역할을 한다.
(3) Server
Server는 Client의 요청을 받아 처리하고 결과를 응답하는 쪽이다.
웹 페이지, 이미지, 데이터, 로그인 결과 같은 서비스를 제공한다.
(4) Request와 Response
Request는 Client가 Server에게 보내는 요청이고, Response는 Server가 Client에게 돌려주는 응답이다.
웹은 항상 요청이 먼저 발생하고, 그 요청에 대해 서버가 응답하는 방식으로 동작한다.
2) Web Server와 WAS
(1) Web Server
Web Server는 HTML, CSS, JavaScript, 이미지 같은 정적인 자원을 처리하는 서버이다.
이미 만들어져 있는 파일을 클라이언트에게 빠르게 전달하는 역할을 한다.
(2) 정적 페이지
정적 페이지는 요청이 들어와도 내용이 변하지 않는 페이지이다.
예를 들어 단순 HTML 파일, 이미지 파일, CSS 파일처럼 저장된 그대로 보여주는 자원이 여기에 해당한다.
(3) WAS
WAS는 Web Application Server의 약자이다.
Servlet과 JSP 같은 서버 프로그램을 실행해서 사용자 요청에 따라 동적인 결과를 만들어주는 서버이다.
(4) 동적 페이지
동적 페이지는 사용자 요청이나 DB 데이터에 따라 결과가 달라지는 페이지이다.
로그인한 사용자 이름을 보여주거나, 게시글 목록을 DB에서 조회해서 출력하는 경우가 여기에 해당한다.
3) Web Server와 WAS의 차이
(1) Web Server의 역할
Web Server는 정적인 파일을 빠르게 제공하는 데 적합하다.
복잡한 로직을 처리하지 않고 이미 만들어진 파일을 응답하기 때문에 속도가 빠르다.
(2) WAS의 역할
WAS는 사용자의 요청을 분석하고, Java 코드나 DB 작업을 통해 동적인 결과를 만든다.
단순 파일 전송이 아니라 프로그램 실행 결과를 응답한다.
(3) 둘을 함께 사용하는 이유
Web Server는 정적인 자원을 처리하고, WAS는 동적인 요청을 처리한다.
이렇게 역할을 나누면 서버 구조를 더 효율적으로 운영할 수 있다.
4) Container
(1) Servlet Container
Servlet Container는 Servlet 객체의 생성, 실행, 소멸을 관리하는 역할을 한다.
사용자의 요청이 들어오면 request와 response 객체를 만들어 Servlet에게 전달한다.
(2) JSP Container
JSP Container는 JSP 파일을 Servlet 형태의 Java 코드로 변환하고 실행하는 역할을 한다.
개발자는 JSP로 화면을 작성하지만, 실제 실행은 Servlet으로 변환된 뒤 이루어진다.
(3) Container를 사용하는 이유
개발자가 Servlet 객체 생성이나 요청 처리 흐름을 직접 전부 관리하지 않아도 된다.
Container가 생명주기, 요청 객체, 응답 객체, 스레드 처리 등을 대신 관리해준다.
2 Servlet
1) Servlet의 개념
(1) Servlet
Servlet은 Java를 이용해 웹 요청을 처리하는 서버 측 프로그램이다.
사용자의 요청을 받아 Java 코드로 처리하고, 처리 결과를 응답으로 돌려준다.
(2) Servlet을 사용하는 이유
HTML만으로는 사용자의 입력값 처리, DB 조회, 로그인 처리 같은 동적인 기능을 구현하기 어렵다.
Servlet을 사용하면 Java 코드로 요청을 분석하고 필요한 로직을 실행할 수 있다.
(3) HttpServlet
웹에서 사용하는 Servlet은 보통 HttpServlet 클래스를 상속받아 만든다.
HTTP 요청 방식에 따라 doGet 또는 doPost 메소드가 실행된다.
2) Servlet 동작 흐름
(1) 요청 발생
사용자가 브라우저에서 특정 URL로 요청을 보낸다.
이 요청은 Web Server와 WAS를 거쳐 Servlet Container로 전달된다.
(2) Servlet Mapping 확인
Container는 요청 URL과 연결된 Servlet을 찾는다.
이 연결 정보는 web.xml 또는 @WebServlet Annotation으로 설정할 수 있다.
(3) Servlet 실행
요청과 매핑된 Servlet이 실행된다.
Container는 요청 정보를 담은 request 객체와 응답을 작성할 response 객체를 Servlet에 전달한다.
(4) 응답 반환
Servlet은 요청을 처리한 뒤 response 객체를 이용해 결과를 만든다.
최종 결과는 클라이언트 브라우저로 전달된다.
3) 배포 서술자와 Servlet Mapping
(1) 배포 서술자
배포 서술자는 웹 애플리케이션의 설정 정보를 담는 파일이다.
대표적으로 WEB-INF 폴더 안의 web.xml 파일이 배포 서술자 역할을 한다.
(2) web.xml
web.xml에는 Servlet 등록, Servlet Mapping, Welcome File, Error Page, Session 설정 등을 작성할 수 있다.
웹 애플리케이션이 어떤 방식으로 동작해야 하는지 Container에게 알려주는 설정 파일이다.
(3) Servlet Mapping
Servlet Mapping은 사용자가 요청하는 URL과 실제 Servlet 클래스를 연결하는 설정이다.
클래스 이름을 직접 URL에 노출하지 않고, 더 간단한 주소로 Servlet에 접근할 수 있게 해준다.
(4) Annotation 방식
@WebServlet을 사용하면 Java 클래스 위에서 바로 URL 매핑을 설정할 수 있다.
web.xml을 직접 수정하지 않아도 Servlet과 URL을 연결할 수 있다.
4) Servlet Life Cycle
(1) Life Cycle
Servlet Life Cycle은 Servlet 객체가 생성되고, 요청을 처리하고, 소멸되는 전체 흐름이다.
이 흐름은 개발자가 직접 관리하는 것이 아니라 Servlet Container가 관리한다.
(2) init
init은 Servlet 객체가 처음 생성될 때 한 번 실행된다.
초기 설정이나 준비 작업을 할 때 사용할 수 있다.
(3) service
service는 클라이언트 요청이 들어올 때마다 실행된다.
요청 방식에 따라 doGet 또는 doPost를 호출한다.
(4) doGet
doGet은 GET 방식 요청을 처리하는 메소드이다.
주로 데이터를 조회하거나 검색하는 요청에서 사용된다.
(5) doPost
doPost는 POST 방식 요청을 처리하는 메소드이다.
주로 로그인, 회원가입, 게시글 작성처럼 데이터를 서버에 전달하거나 저장하는 요청에서 사용된다.
(6) destroy
destroy는 Servlet 객체가 소멸될 때 실행된다.
서버 종료나 Servlet 변경 등으로 객체가 제거될 때 마무리 작업을 할 수 있다.
5) GET 방식과 POST 방식
(1) GET 방식
GET 방식은 데이터를 URL 뒤에 붙여서 전송하는 방식이다.
주소창에 데이터가 보이기 때문에 검색이나 조회 요청에 주로 사용된다.
(2) GET 방식의 특징
URL에 데이터가 노출되므로 보안에 약하다.
또한 URL 길이에 제한이 있어 많은 데이터를 보내기에는 적합하지 않다.
(3) POST 방식
POST 방식은 데이터를 요청 body에 담아 전송하는 방식이다.
URL에 데이터가 직접 보이지 않기 때문에 GET보다 민감한 데이터 처리에 더 적합하다.
(4) POST 방식의 특징
로그인, 회원가입, 게시글 작성처럼 서버의 데이터를 추가하거나 변경하는 요청에 많이 사용된다.
전송할 수 있는 데이터 크기도 GET보다 비교적 자유롭다.
6) request와 response 객체
(1) HttpServletRequest
HttpServletRequest는 클라이언트가 보낸 요청 정보를 담는 객체이다.
사용자가 입력한 값, 요청 방식, 세션 정보 등을 가져올 수 있다.
(2) getParameter
getParameter는 사용자가 보낸 값 중 특정 name 값을 가진 데이터를 문자열로 가져온다.
form에서 입력한 값을 Servlet에서 받을 때 자주 사용한다.
(3) setAttribute
setAttribute는 request 객체에 데이터를 저장할 때 사용한다.
Servlet에서 처리한 결과를 JSP로 전달할 때 많이 사용한다.
(4) getRequestDispatcher
getRequestDispatcher는 요청과 응답을 다른 페이지로 전달할 때 사용한다.
Servlet에서 JSP로 화면 처리를 넘길 때 forward와 함께 사용한다.
(5) HttpServletResponse
HttpServletResponse는 클라이언트에게 보낼 응답 정보를 작성하는 객체이다.
응답 형식, 문자 인코딩, 출력 스트림, 페이지 이동 등을 설정할 수 있다.
(6) sendRedirect
sendRedirect는 클라이언트에게 다른 URL을 다시 요청하게 만드는 메소드이다.
요청 처리 후 다른 페이지로 이동시킬 때 사용한다.
3 JSP
1) JSP의 개념
(1) JSP
JSP는 Java Server Pages의 약자이다.
HTML 코드 안에 Java 코드를 넣어 동적인 웹 페이지를 만들 수 있게 해주는 기술이다.
(2) JSP를 사용하는 이유
Servlet은 Java 코드 안에 HTML을 문자열로 작성해야 해서 화면을 만들기 불편하다.
JSP는 HTML 중심으로 작성하면서 필요한 부분에 Java 코드를 넣을 수 있어 화면 작성이 더 쉽다.
(3) Servlet과 JSP의 역할 차이
Servlet은 요청 처리와 비즈니스 로직에 적합하고, JSP는 화면 출력에 적합하다.
MVC 구조에서는 Servlet이 Controller 역할을 하고, JSP가 View 역할을 맡는 경우가 많다.
2) JSP 실행 방식
(1) JSP 요청
사용자가 브라우저에서 JSP 파일을 요청한다.
요청은 서버의 JSP Container로 전달된다.
(2) Servlet 변환
JSP 파일은 그대로 실행되지 않고 Servlet 형태의 Java 파일로 변환된다.
JSP 안의 HTML과 Java 코드가 Java Servlet 코드로 바뀐다.
(3) 컴파일과 실행
변환된 Java 파일은 class 파일로 컴파일된 뒤 실행된다.
실행 결과로 만들어진 HTML이 클라이언트에게 응답된다.
(4) JSP 변경 시 재변환
JSP 파일이 변경되면 Container는 다시 Java 파일로 변환하고 컴파일한다.
변경되지 않은 JSP는 기존에 컴파일된 결과를 재사용할 수 있다.
3) JSP Elements
(1) JSP Elements
JSP Elements는 JSP 안에서 Java 코드나 설정 정보를 작성하기 위한 문법이다.
주석, 지시자, 선언문, 스크립트릿, 표현식 등이 있다.
(2) JSP 주석
JSP 주석은 서버에서만 의미가 있고 클라이언트에게 전달되지 않는다.
JSP 코드 안에 설명을 남기고 싶을 때 사용한다.
(3) 지시자 태그
지시자 태그는 JSP 페이지 전체에 영향을 주는 설정을 작성할 때 사용한다.
page, include, taglib 지시자가 대표적이다.
(4) 선언문 태그
선언문 태그는 JSP가 Servlet으로 변환될 때 클래스 영역에 들어갈 변수나 메소드를 작성할 때 사용한다.
멤버 변수나 멤버 메소드처럼 동작할 수 있다.
(5) 스크립트릿 태그
스크립트릿 태그는 JSP 안에 Java 코드를 작성할 때 사용한다.
조건문, 반복문, 지역 변수 선언 등을 작성할 수 있다.
(6) 표현식 태그
표현식 태그는 값을 화면에 출력할 때 사용한다.
내부적으로 out.print처럼 동작하므로 세미콜론을 붙이지 않는다.
4) JSP 내장 객체
(1) 내장 객체
JSP 내장 객체는 JSP에서 별도로 선언하지 않아도 사용할 수 있는 기본 객체이다.
JSP가 Servlet으로 변환될 때 자주 사용하는 객체들이 미리 준비된다.
(2) request
request는 클라이언트의 요청 정보를 담는 객체이다.
사용자가 보낸 파라미터 값을 읽거나, Servlet에서 전달한 데이터를 받을 수 있다.
(3) response
response는 클라이언트에게 보낼 응답 정보를 담는 객체이다.
응답 형식이나 페이지 이동 등을 설정할 수 있다.
(4) out
out은 JSP 화면에 값을 출력할 때 사용하는 객체이다.
표현식 태그나 스크립트릿에서 화면 출력을 처리할 수 있다.
(5) session
session은 사용자별 정보를 유지할 때 사용하는 객체이다.
로그인 정보처럼 한 사용자에게 계속 유지되어야 하는 값을 저장할 수 있다.
(6) application
application은 웹 애플리케이션 전체에서 공유되는 정보를 담는 객체이다.
모든 사용자와 모든 요청에서 공통으로 사용할 값을 저장할 수 있다.
5) JSP 지시자
(1) page 지시자
page 지시자는 JSP 페이지의 전체 설정을 담당한다.
import, contentType, errorPage, isErrorPage 같은 속성을 설정할 수 있다.
(2) import
import는 JSP에서 사용할 Java 클래스를 가져올 때 사용한다.
Java의 import문과 같은 역할을 한다.
(3) contentType
contentType은 응답 데이터의 형식과 문자 인코딩을 설정한다.
한글 깨짐을 방지하기 위해 charset=UTF-8 같은 설정을 함께 사용한다.
(4) include 지시자
include 지시자는 다른 JSP나 HTML 파일을 현재 JSP에 포함할 때 사용한다.
header, footer처럼 여러 페이지에서 공통으로 사용하는 영역을 분리할 수 있다.
(5) taglib 지시자
taglib 지시자는 JSP에서 태그 라이브러리를 사용하기 위해 작성한다.
JSTL이나 커스텀 태그를 사용할 때 필요하다.
6) JSP Exception 처리
(1) JSP 예외 처리
JSP 예외 처리는 JSP 실행 중 오류가 발생했을 때 별도의 에러 페이지로 이동해 처리하는 방식이다.
사용자에게 복잡한 오류 화면 대신 안내 화면을 보여줄 수 있다.
(2) errorPage
errorPage는 현재 JSP에서 예외가 발생했을 때 이동할 페이지를 지정한다.
오류가 발생하면 지정된 JSP가 실행된다.
(3) isErrorPage
isErrorPage는 해당 JSP가 에러 처리 페이지인지 설정하는 속성이다.
true로 설정하면 exception 내장 객체를 사용할 수 있다.
(4) exception 객체
exception 객체는 발생한 오류 정보를 담고 있다.
에러 페이지에서 오류 내용을 확인하거나 안내 메시지를 만들 때 사용할 수 있다.