35일차 정리
핸들러 매핑 ?
- 웹 애플리케이션에서 클라이언트의 요청을 적절한 핸들러(처리기)로 매핑하는 역할을 수행하는 컴포넌트
- 주로 스프링 프레임워크(Spring Framework)와 같은 웹 프레임워크에서 사용
- 주된 역할은 클라이언트로부터 들어오는 HTTP 요청을 적절한 컨트롤러(혹은 핸들러)로 라우팅하는 것
- 사용자가 웹 애플리케이션에 요청을 보냈을 때, 핸들러 매핑은 해당 요청을 어떤 컨트롤러가 처리할지를 결정
- 좋은 FrontController 기반의 프레임워크들이 멤버변수로 가지게하는 것
- 싱글톤 패턴 유지
싱글톤 패턴 ?
- 객체지향 프로그래밍에서 사용되는 디자인 패턴 - 생성
- 특정 클래스에 대해 오직 하나의 인스턴스만을 생성하도록 보장하는 패턴
- ==new 를 절약하는 패턴
- 한 번 new 해서 존재하는 객체가 있다면, 해당 객체를 계속 재사용함
예시 )
HandlerMapper.java
package controller.common;
import java.util.HashMap;
import java.util.Map;
import controller.board.BoardAction;
import controller.board.MainAction;
import controller.member.JoinAction;
import controller.member.LoginAction;
import controller.member.LogoutAction;
import controller.page.BoardPageAction;
import controller.page.JoinPageAction;
import controller.page.LoginPageAction;
public class HandlerMapper { //핸들러맵핑을 통해 한번의 new를 다 해놓고 불러다 쓰는것
private Map<String,Action> mapper;
public HandlerMapper() {
this.mapper = new HashMap<String, Action>();
this.mapper.put("/main.do", new MainAction());
this.mapper.put("/board.do", new BoardAction());
this.mapper.put("/login.do", new LoginAction());
this.mapper.put("/logout.do", new LogoutAction());
this.mapper.put("/join.do", new JoinAction());
this.mapper.put("/BoardPage.do", new BoardPageAction());
this.mapper.put("/JoinPage.do", new JoinPageAction());
this.mapper.put("/LoginPage.do", new LoginPageAction());
}
// public Map<String, Action> getMapper() {
// return mapper;
// }
//
// public void setMapper(Map<String, Action> mapper) {
// this.mapper = mapper;
// }
public Action getAction(String command) {
return this.mapper.get(command);
}
}
위처럼 생성자에 핸들러매핑을 통해 한번만 객체를 생성해놓고 재사용을 하는 것이다.
FrontController.java
package controller.common;
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
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("*.do")
// 톰캣(server)이 구동될때, xxx.do로 끝나는 요청에 대하여 FC를 호출하게됨
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
private HandlerMapper mappings;
public FrontController() {
super();
this.mappings = new HandlerMapper();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
private void doAction(HttpServletRequest request, HttpServletResponse response) {
// 1. 사용자가 무슨 요청을 했는지 추출 및 확인
String uri=request.getRequestURI();
String cp=request.getContextPath();
String command=uri.substring(cp.length());
System.out.println("command : "+command);
// 2. 요청을 수행
//Action action = this.mappings.getMapper().get(command); // 내가 요청한 값에 대한 action을 가져오기
Action action = this.mappings.getAction(command);
//action 가져오면 execute
ActionForward forward = action.execute(request,response);
// 3. 응답(페이지 이동 등)
// 1) 전달할 데이터가 있니? 없니? == 포워드? 리다이렉트?
// 2) 어디로 갈까? == 경로
if(forward == null) {
// command 요청이 없는 경우
}
else {
if(forward.isRedirect()) {
try {
response.sendRedirect(forward.getPath());
} catch (IOException e) {
e.printStackTrace();
}
}
else {
RequestDispatcher dispatcher=request.getRequestDispatcher(forward.getPath());
try {
dispatcher.forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
'웹' 카테고리의 다른 글
MVC 패턴으로 프로젝트 진행 시 유의사항 (1) | 2024.09.03 |
---|---|
[JSP, JavaScript] 네이버 로그인 API (0) | 2024.08.30 |
이미지파일 업로드 (0) | 2024.08.29 |