1. @WebServlet
- JAVA EE (또는 Jakarta EE)에서 서블릿 클래스를 웹 요청 URL과 매핑하기 위해 사용하는 선언
- 아직은 Spring 연동이 되어 있지 않아서, 서블릿으로 작업한다.
- 예전에는 web.xml에 <servlet>와 <servlet-mapping>을 적어야했는데, 지금은 @WebService를 사용하면 클래스 바로 위에서 설정할 수 있다.
기본 문법은 다음과 같다.
@WebServlet("/경로")
public class BoardListServlet extends HttpServlet {
...
}
- /경로 에 적인 url로 들어온 요청을 BoardListServlet 이 처리하겠다는 의미
- 예를 들어, 브라우저에서 http://localhost:8080/프로젝트명/visit/list 라고 입력하면 Tomcat이 이 서블릿을 호출한다.
2. HttpServlet
- javax.servlet.http.HttpServlet 클래스
- 클라이언트(브라우저) 로부터의 HTTP 요청을 처리하는 기본 클래스
- 즉, 이걸 상속한 클래스를 만들면 브라우저의 GET, POST 같은 요청에 대응할 수 있습니다.
기본 구조는 다음과 같습니다.
1. 사용자가 visit/list 주소로 요청
2. @WebServlet("")가 매핑된 메소드인 BoardListServlet 호출
3. doGet() 메서드 실행
4. RequestDispatcher가 JSP로 요청을 넘겨줌
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// GET 요청 처리
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// POST 요청 처리
}
}
3. super();
BoardListServlet () 클래스가 생성될 때, 부모 클래스인 HttpServlet의 생성자도 함께 호출되도록 하는 것.
- 생략해도 됨. 자동으로 호출함.
- 자바는 생성자에서 super()가 명시되지 않으면 기본 생성자를 자동으로 호출한다.
4. @Override
- 부모 클래스에 있는 메소드를 재정의한다는 의미.
- 오류를 컴파일 시점에 잡아줌
> @override를 쓰고 오타 등의 에러가 났을 때, 컴파일 에러를 띄우며 알려준다.
> 만약 쓰지 않았다면, 새로운 메소드로 인식하고 조용히 넘어간다.
5. protected
- 같은 패키지 + 상속받은 클래스만 접근 가능
[protected 사용 이유]
1. HttpServlet 클래스가 원래 doGet()을 protected로 선언해놨음
- 재정의, override 할 때는 부모 클래스의 접근제어자보다 좁은 범위를 쓸 수 없기에 protected를 그대로 써야 함
- private나, default로 바꾸면 컴파일 에러 발생
- public은 가능하지만, override 구조에선 보통 protected 를 유지하는 것이 원칙이다.
2. 서블릿 객체는 톰캣(서버)이 자동으로 호출하기에 public일 필요가 없다.
- 톰캣이 내부적으로 service() > doGet() 을 자동으로 호출한다.
- 외부에서 접근할 일이 없기에 public일 필요가 없다.
[doGet() 예시]
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 필요한 데이터 가공이나 설정 등이 있다면 이 부분에서 수행
// JSP로 포워딩
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/visit/list.jsp");
dispatcher.forward(request, response);
}
6. HttpServletRequest
- 클라이언트(브라우저) 에서 서버로 전송된 요청(Request) 정보를 담고 있는 객체.
- 사용자가 form에 입력하거나 url에 붙인 파라미터 정보, 헤더 정보 등을 읽어올 수 있음
7. HttpServletResponse
- 서버에서 클라이언트로 전송되는 응답(Response) 정보를 다루는 객체
- 브라우저에 출력하거나, 리다이렉트 시키거나, 응답 헤더 설정 등을 할 수 있음
8. JSP 포워딩 / RequestDispatcher
- JSP 포워딩 : 클라이언트가 요청한 것을 서버 내부에서 다른 JSP나 서블릿으로 이동시켜 응답을 처리하게 하는 방식
- 이 때, 클라이언트는 URL이 바뀌는 것을 알지 못한다. 서버 내부에서 처리되기 때문.
- 지금은 Spring이 없는 순수 Servlet 으로 진행 중이기에 RequestDispatcher 를 직접 작성
- Spring MVC로 전환하면, @Controller, @GetMapping, Model 등을 쓰고 포워딩을 자동화할 수 있음
- request.getRequestDispatcher() : 포워딩할 경로 지정 (서버 내부 경로)
- dispatcher.forward(request, response) : 해당 JSP나 서블릿으로 요청을 넘김
BoardListServlet 최종코드
package com.visit.board.controller;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/visit/list")
public class BoardListServlet extends HttpServlet {
public BoardListServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// list.jsp 페이지 포워딩
// Spring MVC 방식이 아닌, 순수 Servlet 방식이어서 getRequestDispatcher() 사용 필수
// req.getRequestDispatcher("/board/list.jsp").forward(req, res);
req.getRequestDispatcher("/WEB-INF/views/visit/list.jsp").forward(req, res);
}
}
'개발 이론 > CRUD 게시판 만들기' 카테고리의 다른 글
| JSP 기초 : 반복 데이터를 출력하는 forEach 태그 (22) | 2025.09.07 |
|---|