[JSP·Servlet] Servlet과 JSP — 웹 서버 동작 원리부터 MVC 구조까지
목차
Web Back-End: Servlet / JSP 연동 구조
서버 단에서 실행하는 가장 대표적인 기술 스택이다. DB를 HTTP 프로토콜로 직접 사용하는 것은 불가능하므로, Java와 DB 프로토콜을 연결하는 JDBC를 사용한다.

클라이언트가 서버에 **요청(Request)**을 보내며, 이때 함께 전달되는 데이터를 파라미터라 한다.
- Web Server (HTTP 서버): HTML·CSS·JS 등 정적 파일만 처리
- Application Server: Logic 처리 담당 (비즈니스 로직, 데이터베이스 로직)
- WAS (Web Application Server): Web Server + Application Server 통합
톰캣(Tomcat)은 WAS 역할을 하며 두 가지를 모두 처리할 수 있다.
Java EE와 Servlet
일반 Java SE(Standard Edition)가 아닌, 웹에서 수행되는 **Java EE(Enterprise Edition)**를 사용해야 한다.
- Servlet: 웹에서 동작하는 Java. Java EE에서 제공
- JSP: Servlet만으로 처리하기 방대한 부분을 해결하기 위해 등장 (문법 유사)
- JDBC: RDBMS와 연결하는 역할

사이트를 배포할 때는 설정 파일인 web.xml로 서버 구성을 정의한다.

Servlet 3.0 이상부터는
web.xml대신 Annotation(@WebServlet등)을 사용한다.
Servlet 생명주기 메서드

Servlet을 implement하면 톰캣이 자동으로 호출하는 메서드 5개가 있다.
| 메서드 | 설명 |
|---|---|
destroy() | 서블릿이 서버에서 제거될 때 자원 해제 (톰캣 종료 시 호출) |
init() | destroy()의 반대, 서블릿 초기화 |
getServletInfo() | 서블릿의 정보를 반환 |
getServletConfig() | 설정 정보를 반환 |
service() | 가장 중요. 클라이언트 요청(request)·응답(response)을 모두 처리 |
service() 메서드는 반드시 구현해야 한다. 불편함을 줄이기 위해 GenericServlet을 상속받고 service() 메서드를 오버라이드한다.

GET / POST 방식
Form 데이터를 서버에 전송하는 방식은 두 가지다.
| 방식 | 특징 |
|---|---|
| GET | URL 뒤에 ?로 데이터 포함. 길이 제한·노출 위험 |
| POST | Body에 포함. 길이 제한 없고 노출 위험 감소 |

GET·POST에 따라 처리 방식이 달라지는 HTTP 환경에서는 GenericServlet 대신 **HttpServlet**을 사용한다.



HttpServlet은 추상메서드가 없는 추상클래스이므로, 메서드 중 하나 이상만 오버라이드하면 된다.

URL 매핑과 페이지 이동
URL 패턴 매핑은 생성한 클래스 이름과 동일하게 지정한다.




상위 클래스의 메서드를 사용하면 출력이 가능하다.
URL에서 root context 설정 후 매핑한 경로로 접근한다.



GET/POST 방식에 따라 doGet / doPost 처리 분기가 결정된다.
서블릿의 역할:
- 클라이언트가 보낸 데이터(파라미터) 획득
- 그 데이터로 비즈니스 로직 처리
- 응답 페이지(HTML) 생성
파라미터 처리

URL 패턴 singleparam.do를 찾아 처리한다.







서블릿에서는 파라미터를 구분하는 메서드가 존재한다.

실행하면 URL이 다음처럼 인코딩된다.
http://localhost:8080/backend/singleparam.do?userid=cyh1219&username=%EC%A1%B0%EC%96%91%ED%9B%88&area=0
브라우저가 URL 인코딩을 자동으로 처리한다.
한글 처리

POST 방식에서 한글이 깨지는 경우가 있다. GET·POST 방식별 한글 처리 방법을 반드시 기억하자.

- 파라미터가 하나:
getParameter(name)사용 - 파라미터가 여러 개(checkbox 등):
getParameterValues(name)사용
JSP (JavaServer Pages)

웹에서 HTML·CSS·JS 세 가지는 빠질 수 없다.

JSP는 Servlet으로 변환되는 과정이 있으므로 최초 1회만 변환 작업이 일어나고, 이후에는 서블릿 메서드만 호출된다.
- JSP: 스크립트 기반 언어 문법 + 실행 시 컴파일 언어(Java) 방식 → 두 언어의 장점을 모두 활용
JSP 스크립트 요소

메서드 영역 선언부

!로 선언한다는 점이 중요하다.

응답 페이지는 태그 밖에 HTML 태그로 작성하면 된다.
Data get, Logic, response 객체 등을 사용할 수 있다.


Java 주석 / HTML 주석 / JSP 주석의 차이를 확인하자.
JSP 기본 객체


pageContext: Java 객체를 담거나forward·include시 사용application: 애플리케이션 전체 공유 객체



ServletConfig: 설정 정보를 가져올 때 사용


실습: 방명록(GuestBook) 연동

서블릿 작성 중 테이블 SQL을 다 작성했는데 에러 발생 — 원인 확인:

guestBookWrite.java의 JDBC 연결 id/pw가 틀려서 연결이 안 된 것이었다. 수정 후 해결.

init() 메서드로 드라이버 로딩


블록 선택 후 Refactor → Rename을 사용하면 프로젝트 안에서 참조하던 모든 곳을 한 번에 변경할 수 있다.

WAR로 export하면 WAS가 관련 파일들(html, js, jsp 등)을 알아서 처리한다.
MySQL Connector 라이브러리 배치

JSP에서 DB 연결 시 mysqlconnector가 없어서 오류 발생. 서블릿 프로젝트에만 포함된 jar를 JSP는 찾지 못한다.
해결 방법: WAS 라이브러리 디렉터리에 jar 파일을 배치

모든 프로젝트가 DB를 사용하는 것은 아니므로 우선 WAS에 배치한다. (Maven을 사용하면 나중에 동적으로 다운로드 가능)

서블릿 → JSP 변환


서블릿(Java) 파일의 내용을 그대로 JSP 안으로 옮길 수 있다.

이 아래에서 조금 바뀐다.

페이지 이동: sendRedirect vs. forward
sendRedirect
response.sendRedirect(location)
- 기존 요청 정보를 버리고 새로 고침 후 이동
location은 URL 사용 → 어디든 이동 가능 (외부 URL 포함)- 데이터 전달 시 쿼리 스트링으로 전달

네이버 URL을 넣어도 이동된다.

sendRedirect는 풀 URL을 사용해야 한다. (중요!)
프로젝트나 경로가 바뀔 때마다 수정이 번거로우므로, getContextPath()로 루트 컨텍스트를 동적으로 가져오자.


파란색으로 표시된 부분이 빠지면 안 된다.



실제 톰캣 접근 시에는 guestbookjsp를 포함한 경로로 접근해야 한다.

getContextPath()를 사용하면 동적으로 받아와 수정이 필요 없다.
forward
RequestDispatcher.forward(request, response)
- 기존 request·response를 그대로 전달 (포워딩)
path에는 프로젝트 내부 파일 경로만 가능 (외부 URL 불가)- forward 시
path에 contextPath를 포함하면 안 됨 (쓰면 안됨!)

| 구분 | sendRedirect | forward |
|---|---|---|
| 이동 방식 | 클라이언트가 새 요청 | 서버 내부 전달 |
| URL | 모든 URL 가능 | 프로젝트 내부만 |
| Request 유지 | X (버림) | O (유지) |
| contextPath | 필요 | 불필요 (넣으면 오류) |
서블릿 URL 매핑 전략
join.jsp가 5군데 있을 때, 파일명을 register.jsp로 바꾸면 5군데를 모두 수정해야 한다.
원칙: 링크 클릭 시 JSP를 직접 이동시키지 말고, 항상 서블릿을 통해 이동한다.

하나의 메서드로 GET·POST를 모두 처리하는 방식:
- GET: request를 그대로 전달
- POST: request에 값을 세팅한 뒤 전달
JSP 지시어 (Directive)
서블릿만으로는 불편해서 JSP가 ASP처럼 쉽게 백엔드를 구성할 수 있도록 등장했다.


지시어: <%@ 로 시작하고 끝나며, @ 뒤에 page / include / taglib 중 하나가 온다.

import 속성을 제외한 속성은 중복 선언 시 에러. (import는 여러 개 허용)



설명을 달 때는 info 속성을 사용한다.



throwable 타입 하위에 error, exception이 있다.

include 지시어 vs. include 액션
하나의 파일 안에 다른 파일을 포함시키는 방법은 두 가지다.

- include 지시어: 포함 시 내용을 복사·붙여넣기 → 포함되는 파일이 자주 바뀌지 않을 때 적합
- include 액션: 매번 포함 시점에 동적으로 가져옴 → 포함 파일이 자주 바뀔 때 적합
in.jsp 내용이 수정되었을 때: 지시어로 포함했다면 a.jsp도 다시 컴파일해야 반영된다.
JSP 스크립트 요소 정리


변수 이름이나 메서드를 출력한 후 값 출력 — 스크립트릿(Scriptlet)

<% %>안에는 자바 코드를 자유롭게 작성할 수 있지만, 스크립트릿은 전체에서 최소한으로 줄여야 한다.
let은 의미상 ‘작은 스크립트’를 뜻한다 (piglet·owlet처럼 축소 접미사).
JSP 변환 시 자바 사이즈가 늘어나는데, 스크립트 요소 3가지가 그 원인이다.
정적 리소스(HTML·CSS·JS) 위치

정적 파일은 모두 Web Server(WS) 에 배치한다.

현재 HTTP 1.1 버전 사용, 포트 번호 8080

**컨테이너(Container)**와 컴포넌트(Component) 개념을 이해해야 한다.
Servlet 요청·응답 처리 흐름
서블릿이란?
- 웹 컨테이너에서 실행되며, 동적 컨텐츠를 생성하기 위한 자바 클래스
서블릿 프로그램 장점:
- 플랫폼 독립성
- 서버 독립성
- 확장성
- 개발 용이

직접 import하지 않아도 자동 import되지만 기억은 해두자.
HTTP 요청 구조


맨 위 흰 줄이 요청 줄, 그 아래로 body가 들어간다.

파라미터가 어디에 담겨서 전달되는지 확인.

톰캣의 요청 처리 흐름

클라이언트가 요청을 보내면 톰캣이 HttpRequest·HttpResponse 객체를 생성한다.
Request: 요청 정보가 담김Response: 아직 비어 있음

톰캣이 **스레드(Thread)**를 생성하고 Request·Response를 전달한다. 클라이언트 수만큼 스레드가 생성된다.

스레드가 service() → doGet() 실행 → 결과를 Response에 담아 출력한다.


응답을 클라이언트에게 보내고 사용했던 스레드·객체를 제거한다.
JSP 페이지 처리 과정
JSP와 서블릿은 같은 일을 할 수 있으며, 일반적으로 MVC 패턴으로 역할을 나눠 사용한다.
규칙에 따라 톰캣이 JSP를 서블릿(Java)으로 자동 변환한다.
JSP도 언어이므로 문법이 존재한다.

JSP의 element는 3가지로 분류된다.

**식 언어(Expression Language)**는 뒤에서 다룬다.
URL 매핑 심화

HelloServlet은 주소창에 표기된다. GET 방식은 주소창 직접 입력 가능, POST는 불가.
//@WebServlet("/HelloServlet")
//@WebServlet(value = {"/hello","/sub/hello","hello2"}) // 슬래시 다음 hello, sub/hello, hello2 가 오면 모두 이 서블릿이 처리
@WebServlet(value = {"/board","/board/","hello2"})
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// public HelloServlet() {
// super();
// // TODO Auto-generated constructor stub
// }
REST API 방식: GET으로 board 요청, POST로 board 요청을 구분한다.
URL 매핑은 절대 헷갈리지 말자. 클라이언트가 어떤 주소를 입력하느냐에 따라 적절한 서버 자원을 매칭시키는 것이 URL 매핑이며, 매우 중요하다.

서버를 띄우지 못하면 실행할 수 없다. 톰캣 404·403·500 오류를 보고 이해하고 해결할 줄 알아야 한다.


기본적으로 웹은 멀티스레드 환경이므로, 다양한 동시 접근 상황을 항상 고려해야 한다.