본문 바로가기

개발 이론/CRUD 게시판 만들기

[JAVA]BoardListServlet.java 파일 생성 및 코드 분석

반응형

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);
	}
	
}

 

 

 

 

반응형