이번 포스팅에서는 실무에서 JSP와 Servlet을 바로 사용해야 하는 상황을 대비해, JSP/Servlet의 기본적인 사용법과 핵심 개념을 정리해보려 합니다.
JSP
JSP 특징
- 동적 웹 어플리케이션 컴포넌트로, 자바 코드를 사용 가능
- 파일 확장자는 .jsp
- 클라이언트의 요청에 따라 동적으로 작동 후, 최종 응답은 HTML 코드로 전달
- JSP는 웹서버(WAS)에서 자동으로 Servlet으로 변환되어 동작
- MVC 패턴에서 View 역할로 주로 사용
JSP 태그의 개념 이해
- Servlet은 java 언어를 이용하여 문서를 작성하고, PrintWriter 객체를 통해 HTML 코드를 삽입
- JSP는 이와 반대로 HTML 코드 안에 java 코드를 삽입하여 동적 문서를 작성
- HTML 코드 안에 자바 코드를 삽입하기 위해서는 JSP 태그를 사용
JSP 태그의 종류
- 스크립트릿(Scriptlet): <% %>
- JSP 페이지에서 Java 코드를 삽입하기 위한 가장 기본적인 태그
- 우리가 알고 있는 대부분의 Java 코드를 사용할 수 있음
- 예시:
<% int num = 10; if (num > 5) { out.println("num은 5보다 큽니다."); } %>
- 선언자(Declaration): <%! %>
- JSP 페이지 내에서 멤버 변수나 메서드를 선언할 때 사용
- 여기서 선언된 변수와 메서드는 JSP 전체(클래스 전체)에서 사용 가능 (전역 변수, 멤버 메서드)
- 예시:
<%! private String globalVar = "전역 변수입니다."; public String getGlobalVar() { return globalVar; } %>
- 표현식(Expression): <%= %>
- JSP 페이지 내에서 변수의 값 또는 메서드 호출 결과를 화면에 바로 출력할 때 사용
- 표현식의 결과 데이터 타입은 String으로 처리되며, 세미콜론(;)을 사용하지 않음
- out.println()을 대체하는 기능을 함
- 예시:
<%= "이 문장은 표현식으로 출력됩니다." %> <%= getGlobalVar() %>
- 주석(Comments): <%-- --%>
- 프로그램 실행에 영향을 주지 않고, 코드 설명이나 메모 용도로 사용
- HTML 주석: <!-- -->
- 브라우저 소스보기 시 주석이 그대로 노출
- JSP 주석: <%-- --%>
- 브라우저 소스보기 시 노출되지 않음
- 자바 주석: //, /* ... */
- 혼용해서 사용할 수 있음
- 지시자(Directive): <%@ %>
- JSP 페이지의 전체적인 속성을 지정할 때 사용
- 종류:
- page 지시자: JSP 페이지에 대한 정보 지정 (문서 타입, import, 에러 페이지 등)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- language: JSP가 사용할 언어 (java 고정)
- import: 자바 패키지 import
- errorPage: 에러 발생 시 보여줄 페이지 설정
- contentType: 결과 문서 유형 (주로 text/html)
- pageEncoding: 출력 문자 인코딩 (UTF-8 권장)
- include 지시자: JSP 페이지의 특정 영역에 다른 문서를 포함
<%@ include file="header.jsp" %>
- taglib 지시자: JSP에서 사용할 태그 라이브러리를 지정
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- page 지시자: JSP 페이지에 대한 정보 지정 (문서 타입, import, 에러 페이지 등)
- 액션 태그(Action Tag): <jsp:*>
- 다른 JSP 페이지를 포함하거나(JavaBean 사용, forward, include 등) 할 때 사용
- 예시:
<jsp:include page="header.jsp" /> <jsp:useBean id="beanName" class="com.example.BeanClass" />
JSP 태그 종류 정리 표
태그 태그 이름 설명 사용 예시
<% %> | 스크립트릿(scriptlet) | 모든 Java 코드를 삽입할 수 있는 부분 | <% if (condition) { %> ... <% } %> |
<%= %> | 표현식(expression) | 결과(값)를 출력하는 부분 | <%= variable %>, <%= methodCall() %> |
<%-- --%> | 주석(comments) | 주석 처리 | <%-- This is a comment --%> |
<%! %> | 선언자(declaration) | 클래스 멤버(필드, 메서드) 선언 | <%! private String name; %> |
<%@ %> | 지시자(directive) | 페이지 속성 설정, 다른 파일 포함 지시 등 | <%@ page language="java" %>, <%@ include file="header.jsp" %> |
<jsp:*> | 액션(action) | 다른 JSP 페이지 포함, JavaBean 사용 등 | <jsp:include page="header.jsp" />, <jsp:useBean id="beanName" ... |
JSP 아키텍쳐
- jsp 파일을 WAS(웹 서버)에서 실행(요청)하면, 먼저 JSP 파일을 자바 코드(서블릿)로 변환
- 변환된 자바 코드를 컴파일하여 실행
- 최종 결과를 HTML로 응답
서버 사이드 렌더링 vs 클라이언트 사이드 렌더링
- 서버 사이드 렌더링: JSP(서블릿)
- 서버에서 HTML을 미리 렌더링하여 클라이언트에 전송
- 클라이언트 측에서는 완성된 HTML만 받아서 표시
- 클라이언트 사이드 렌더링: React, Vue, Angular
- 서버에서 JSON 등의 데이터를 받고, 브라우저(클라이언트)에서 동적으로 렌더링
Servlet
Servlet 특징
- 동적 웹 어플리케이션 컴포넌트 (순수 자바 코드로 작성)
- .java 확장자
- 클라이언트의 요청에 따라 동적으로 동작 후, HTML로 응답
- Java Thread를 이용하여 동작
- MVC 패턴에서 Controller 역할로 많이 사용
JSP와 Servlet 비교
- JSP(HTML + JAVA)
- HTML 문서 안에 Java 코드를 직접 삽입할 수 있음
- 주로 사용자 인터페이스(View)를 생성하는 데 사용
- Servlet(Only JAVA)
- 순수 자바 코드 (.java 확장자)로 웹 페이지 처리를 담당
- 주로 비즈니스 로직을 처리하거나, 컨트롤러 역할 수행
- 비즈니스 로직, 데이터베이스 연동, 공통 로직 등을 처리
JSP를 Servlet으로 변환하는 경우
- JSP 파일 내에 자바 로직이 지나치게 많고, HTML은 거의 없는 경우
- 유지보수성, 확장성, 테스트 용이성, 재사용성, 응답 속도 측면에서 Servlet이 유리할 수 있음
서블릿 매핑과 web.xml 설정
1) URL-Mapping
- URL 매핑을 통해, 사용자가 특정 URL로 접근했을 때 어떤 서블릿이 동작할지 지정
- URL 매핑을 하지 않으면, 클래스 전체 경로가 주소에 노출되어 보안 문제와 가독성 문제 발생
- 어노테이션 이용 방법 (@WebServlet):
- @WebServlet("/HelloWorld") // URL 매핑 public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello world"); // 브라우저로 출력 resp.setContentType("text/html; charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("헬로 월드"); } }
2) web.xml 설정파일 수정
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>kr.co.park.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
JSP 내장 객체 - request, response, out 등
- JSP 내장 객체란, JSP 페이지에서 별도의 생성 코드 없이도 바로 사용할 수 있는 객체
- JSP가 서블릿으로 변환될 때, 컨테이너가 자동으로 객체들을 생성해주므로 개발자는 손쉽게 사용 가능
내장 객체 해당 클래스 설명
request | javax.servlet.http.HttpServletRequest | HTTP 요청 정보 객체 |
response | javax.servlet.http.HttpServletResponse | HTTP 응답 정보 객체 |
out | javax.servlet.jsp.JspWriter | JSP 페이지의 출력 스트림 객체 |
session | javax.servlet.http.HttpSession | 세션 관리를 위한 객체 |
application | javax.servlet.ServletContext | 어플리케이션 전역에서 공유되는 정보 관리 객체 |
pageContext | javax.servlet.jsp.PageContext | JSP 페이지에 대한 컨텍스트 정보 제공 |
page | javax.servlet.jsp.HttpJspPage | 현재 JSP 페이지 자체를 나타내는 객체 |
config | javax.servlet.ServletConfig | JSP 페이지의 초기화 파라미터 읽어오는 객체 |
exception | java.lang.Throwable | 에러 페이지에서 에러 정보를 담는 객체 |
HttpRequest 방식 - GET, POST
GET 방식
- 서버에 데이터를 요청할 때 주로 사용
- 전송하는 데이터가 주소(URL)에 노출됨
- 보안성이 낮음 (주소에 데이터가 보이기 때문)
- 전송 데이터 용량 제한이 있음
- 검색, 게시판 글 조회 등의 경우 사용
- HTML form 태그가 반드시 필요하지는 않음
- 쿼리스트링 형식: ?name=value&name2=value2
POST 방식
- 서버에 데이터를 전송할 때 주로 사용
- 전송 데이터가 메시지 바디에 포함되어 노출되지 않음
- 보안성이 높음
- 데이터 용량 제한이 사실상 없음(브라우저별 차이는 있을 수 있으나, GET보다는 훨씬 많은 양 전송 가능)
- HTML form 태그 필수
- 주로 회원가입, 로그인, 비밀번호 전송 등의 경우 사용
브라우저 한글처리
- 톰캣 서버의 기본 문자 인코딩은 ISO-8859-1
- 별도의 인코딩 설정 없이 한글을 전송하면 깨짐 현상 발생
1) GET 방식
- server.xml 파일의 <Connector> 태그에 URIEncoding="UTF-8" 속성 추가
- <!-- server.xml 예시 --> <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="20000" redirectPort="8443" />
2) POST 방식
- 서블릿이나 JSP에서 request 객체를 사용하기 직전에 인코딩 지정
request.setCharacterEncoding("UTF-8");
request 객체
- 웹 브라우저가 서버에 무엇을 요청할 때, 그 요청 정보가 담기는 객체
- 기능:
- 클라이언트(브라우저) 관련 정보 읽기
- 서버 관련 정보 읽기
- 클라이언트가 전송한 요청 파라미터 읽기
- 클라이언트가 전송한 쿠키 읽기
자주 사용하는 메서드
- getContextPath() : 현재 웹 어플리케이션의 컨텍스트 루트 경로 반환
- getMethod() : 요청 방식을 반환 (GET, POST 등)
- getServerName() : 서버 이름(도메인) 반환
- getServerPort() : 서버 포트 번호 반환
- getRequestURL() : 요청 URL 전체 반환
- getRequestURI() : 요청 URI 반환
- getRemoteAddr() : 클라이언트 IP주소 반환
- getProtocol() : 현재 요청 프로토콜 반환 (HTTP/1.1 등)
- getParameter(name) : 단일 파라미터 값 반환 (없으면 null)
- getParameterValues(name) : 같은 이름으로 여러 값을 가진 파라미터를 배열로 반환 (없으면 null)
예시:
String userName = request.getParameter("userName");
String[] hobbies = request.getParameterValues("hobby");
response 객체
- 서버가 웹 브라우저에 응답할 때, 그 응답 정보를 담는 객체
자주 사용하는 메서드
- getCharacterEncoding() : 응답 시 사용되는 문자 인코딩 형태 반환
- addCookie(Cookie c) : 쿠키를 지정하여 전송
- sendRedirect(String URL) : 지정한 URL로 리다이렉트(재요청)
- 예: response.sendRedirect("/loginSuccess.jsp");
위 내용들은 JSP와 Servlet의 기본적인 사용법과 아키텍처, 태그의 종류, 내장 객체 등에 관한 핵심 개념을 정리한 것입니다.
- 실무에서 JSP를 사용할 때는 서버 사이드 렌더링에 익숙해져야 하며,
- Servlet을 통해 로직 처리(Controller)를 담당하는 구조(MVC)를 이해해야 합니다.
- 또한 요청/응답 과정에서 인코딩, 세션/쿠키, request/response의 활용이 매우 중요합니다.
'🗄️ Backend > JSP' 카테고리의 다른 글
JSP Cookie , Session , Error page , Action Tag - 입사 전 리마인드 (1) | 2025.02.14 |
---|---|
JSP와 MyBatis (4) | 2024.10.18 |
JSP와 MVC2 패턴 (1) | 2024.10.18 |
JSP와 MVC 패턴: DAO/DTO, 커넥션 풀, EL, JSTL (1) | 2024.10.18 |
쿠키(Cookie)와 세션(Session) 완벽 가이드 (0) | 2024.10.18 |