프로그래밍 숲

자바(Java)/JSP Controller단 샅샅이 뜯어보기 - 입문자용 본문

프로그래밍_인포/Java&JSP

자바(Java)/JSP Controller단 샅샅이 뜯어보기 - 입문자용

jjscript 2023. 6. 22. 09:02
728x90
반응형

이 파일은 제가 진행하고 있는 프로젝트의 CustomerManageController.java 파일입니다. Java MVC에서의 컨트롤러는 사용자 입력을 처리하고 모델과 뷰를 업데이트하는 역할을 담당합니다.

전체 코드 (with 코드 설명 주석)

package com.Controller;

import com.Model.CustomerManageDto;
import com.Model.CustomerManageReqDto;
import com.Service.CustomerManageService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

// 이 Servlet이 어떤 URL 패턴에 응답할지를 결정 
// /CustomerManagement 경로로 오는 모든 요청이 이 Servlet에 의해 처리됨
@WebServlet("/CustomerManagement")
// CustomerManageService 클래스를 선언. init() 메서드에서 초기화될 것
public class CustomerManageController extends HttpServlet {
    private CustomerManageService customerManageService;

    @Override
        // init() 메서드는 서블릿이 시작될 때 한 번만 호출됨.
    public void init() throws ServletException {
        super.init();
                // CustomerManageService 클래스를 초기화.
        customerManageService = new CustomerManageService();
    }

    @Override
        // doPost() 메서드는 클라이언트로부터 HTTP POST 요청이 들어오면 호출됨
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
                        // CustomerManageReqDto 클래스의 새 인스턴스를 생성합니다.
            CustomerManageReqDto customerManageReqDto = new CustomerManageReqDto();
                        // CustomerManageService 클래스의 getCustomerInfo 메서드를 호출합니다.
            // 결과는 CustomerManageDto 객체의 리스트입니다.
            List<CustomerManageDto> customerManageResDto = customerManageService.getCustomerInfo(customerManageReqDto);

                        // 결과를 요청의 속성으로 설정합니다.
            req.setAttribute("customerManageResDto", customerManageResDto);

                        // 결과를 렌더링하기 위해 요청과 응답 객체를 JSP 페이지로 전달합니다.
            req.getRequestDispatcher("/jsp/CustomerManagement/CustomerManagement.jsp").forward(req, resp);
        } catch (SQLException e) {
            // SQL 예외가 발생한 경우, 클라이언트에게 내부 서버 오류 상태를 반환합니다.
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                        // 오류 메시지를 클라이언트에게 작성합니다.
            resp.getWriter().println("Internal server error");
        }
    }
}

세부 코드별 뜯어보기

@WebServlet("/CustomerManagement")
public class CustomerManageController extends HttpServlet {
    private CustomerManageService customerManageService;

extends HttpServlet

HttpServlet 클래스를 상속(extends)하고 있습니다. HttpServlet은 Java Servlet API의 일부로, HTTP 요청(GET, POST, PUT, DELETE 등)을 처리할 수 있는 기능을 제공합니다. 이를 상속받음으로써 CustomerManageController 클래스는 HttpServlet이 가지고 있는 메서드들을 오버라이드(재정의)하여 사용할 수 있게 됩니다.

어노테이션 주석(annotation)

자바에서 어노테이션은 코드에 메타데이터를 추가하기 위한 방법입니다. 메타데이터란, 데이터에 대한 데이터, 즉 코드에 대한 추가 정보를 말합니다. 어노테이션은 클래스, 메소드, 변수, 매개 변수 등에 붙일 수 있습니다. 어노테이션은 '@' 기호로 시작하며, 이어서 해당 어노테이션의 이름이 옵니다.

@Override: 이 어노테이션은 메소드가 슈퍼 클래스에서 상속 받은 메소드를 오버라이드한다는 것을 컴파일러에게 알려줍니다. 이 어노테이션을 사용하면 컴파일러는 메소드 이름, 매개 변수 타입, 반환 타입 등이 정확한지 확인합니다.

자바 어노테이션은 정보를 제공하거나, 코드의 동작을 변경하거나, 컴파일 시간 또는 런타임에 특정 동작을 수행하도록 하기 위한 도구로 생각할 수 있습니다.

    @Override
    public void init() throws ServletException {
        super.init();
        customerManageService = new CustomerManageService();
    }

public void init()

public void init() 은 현재 클래스인 CustomerManageController에서 HttpServlet의 init() 메소드를 오버라이드(재정의)한 것입니다. 이 메소드 내부에서는 CustomerManageController 클래스의 초기화 작업을 수행할 수 있습니다. 이 경우 super.init()를 호출하는 것이 좋습니다. 왜냐하면 이렇게 함으로써 부모 클래스인 HttpServlet의 초기화 작업이 먼저 수행되고, 그 다음에 CustomerManageController 클래스의 고유한 초기화 작업을 수행할 수 있기 때문입니다.

super.init()

super.init()는 HttpServlet 클래스에 정의된 init 메소드를 호출하는 코드입니다. 이 코드가 중요한 이유는 서블릿의 초기화 과정에서 중요한 역할을 수행하기 때문입니다.

서블릿 생명주기는 서블릿이 처음 생성되어서 요청을 처리하고, 마지막으로 소멸될 때까지의 과정을 말합니다. 이 생명주기는 보통 세 단계로 나눌 수 있습니다: 초기화(init), 서비스(service), 소멸(destroy).

  1. 초기화(init): 서블릿이 최초로 호출될 때 한 번만 실행되는 단계입니다. 이 단계에서는 서블릿의 설정을 준비하거나 리소스를 로드하는 등의 작업을 수행합니다.
  2. 서비스(service): 서블릿이 실제로 클라이언트의 요청을 처리하는 단계입니다. 클라이언트가 요청을 보낼 때마다 호출됩니다.
  3. 소멸(destroy): 서블릿이 메모리에서 제거될 때 호출되는 단계입니다. 이 단계에서는 서블릿이 사용했던 리소스를 정리하는 등의 작업을 수행합니다.

이 중에서 super.init()는 초기화 단계에서 호출되는 메소드로, HttpServlet 클래스의 init 메소드를 오버라이드하여 사용합니다. super 키워드는 자바에서 부모 클래스를 참조하는 데 사용됩니다. 이 init 메소드는 서블릿이 최초로 생성되었을 때 한 번만 실행되며, 주로 서블릿이 필요로 하는 자원을 준비하는 등의 초기화 작업을 수행하는 데 사용됩니다.

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doPost

doPost 메서드는 HttpServlet 클래스의 메서드로, 클라이언트로부터 HTTP POST 요청이 들어왔을 때 서버에서 수행해야 하는 동작을 정의합니다.

ServletException

Servlet API에서 발생할 수 있는 일반적인 예외를 나타냅니다. 이는 일반적으로 서블릿이 웹 컨테이너에 의해 실행되거나 웹 컨테이너에서 서블릿에게 요청을 전달하는 동안에 발생할 수 있는 예외 상황들을 처리하는 데 사용됩니다. 이 예외는 웹 애플리케이션의 문제를 나타내므로, 보통 구체적인 에러 메시지와 함께 클라이언트에게 표시됩니다.

IOException

이 예외는 입출력 작업 중에 문제가 발생했음을 나타내는 최상위 예외 클래스입니다. 이는 파일, 네트워크 스트림, 파일 시스템 등과 같은 어떠한 입출력 작업에서도 발생할 수 있습니다. 이 코드에서 IOException은 주로 요청 또는 응답의 입출력 과정에서 문제가 발생했음을 나타냅니다.

728x90
반응형
Comments