BaseController

haribo·2021년 3월 21일
1

Web

목록 보기
4/7

Intro


BaseController : 자바에서의 DB 헬퍼와 같은 것

Mybatis 쓰면서 안쓰게됨 (preparestatement, resultset, connection)

스프링 쓸때 안쓰지만 동작 원리를 알기 위해 핵심적으로 알아야함.

JAVA는 각기 다른 DB에 대응하기 위해 JDBC를 만들어둠 (동일한 방법으로 쿼리 실행)
절차가 복잡하고 관련된 객체를 해제해줘야하는게 번거롭다.

외부 XML로 빼서 관리해주는 마이바티스를 사용.

마이바티스 안쓰는 곳도 있음 → 금융권. xml에 텍스트로 쿼리 노출되니까 안좋음.

Base Controller


basecontroller 목적 : 모든 서블릿 클래스에서 반복되는 코드를 재사용 가능한 형태로 묶어서 작업의 효율성을 높이기 위해 사용

Base Controller.java

package study.jsp.model2.helper;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
//import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// --> URL에 노출되는 @WebServlet은 자식 클래스에서 정의하도록 하고,
//     이 클래스는 추상클래스로 변경한다.
//@WebServlet("/BaseController")
public abstract class BaseController extends HttpServlet {
	private static final long serialVersionUID = 2666361012404301949L;

    public BaseController() {
        // 실행되는 주체를 확인하기 위해서 클래스 이름을 콘솔에 출력한다.
    	String className = this.getClass().getName();
    	System.out.println(className);
    }

    /** Get 방식 요청이 들어오면 실행된다. */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 공통 처리 메서드로 제어를 이동시킨다.
		this.pageInit(request, response);
	}

    /** Post 방식 요청이 들어오면 실행된다. */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 공통 처리 메서드로 제어를 이동시킨다.
				this.pageInit(request, response);
	}
	
	/**
	 * Get, Post 방식에 상관 없이 공통 처리되는 메서드
	 * @param request  - JSP request 내장 객체
	 * @param response - JSP response 내장 객체 
	 */
	
	private void pageInit(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 페이지 형식 지정하기
		response.setContentType("text/html; charset=utf-8");
		// 파라미터 처리 형식 지정하기
		request.setCharacterEncoding("utf-8");
		
		// View의 이름
		String view = doRun(request, response);
		
		// 획득한 View가 존재한다면 화면 표시
		if (view != null) {
			// View를 생성한다.
			view = "/WEB-INF/views/" + view + ".jsp";
			RequestDispatcher dispatcher = request.getRequestDispatcher(view);
			dispatcher.forward(request, response);
		}
	}
	
	/** 웹 페이지 구성에 필요한 처리를 수행한 후, View의 이름을 리턴한다.
	 *  이 메서드를 추상화 한다.
	 *  이 클래스를 상속받는 자식 클래스는 반드시 이 메서드를 재정의 해야 한다.
	 */
	public abstract String doRun(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;

}
  • 클래스이름 확인 : 상속을 위해서
  • get, post → init에 다 몰아줌
  • doRun : view이름을 그때 그때 다르게 하기 위해 추상으로 만들어놓음
  • 일반 클래스로 자식클래스를 만듬 (but 상속받기 떄문에 서블릿임)
  • view 이름이 page init 에 넘어감

Hello.java

package study.jsp.model2.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import study.jsp.model2.helper.BaseController;

@WebServlet("/hello")
public class Hello extends BaseController{

	/**
	 * 
	 */
	private static final long serialVersionUID = 6519981277847414078L;

	@Override
	public String doRun(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String view = "hello";
		return view;
	}

}
  • view 이름을 리턴해주는 doRun 메서드를 가지고 있는 BaseController의 자식클래스

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<!doctype html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>Hello JSP</title>
</head>

<body>
	<h1>Hello Base Controller</h1>    
</body>

</html>

Flow

  1. url 요청
  2. 해당하는 서블릿이 베이스컨트롤러에 요청
  3. dorun → 상속되어서 자식한테감 → 리턴값 page init으로

etc.

모델 2의 기본패턴 = BaseController

모델2 ≠ spring

profile
그림 그리는 백엔드 개발자

0개의 댓글