핸들러 매핑, 싱글톤 패턴

2024. 8. 21. 15:21·웹
목차
  1. 핸들러 매핑 ?
  2. 싱글톤 패턴 ? 

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
  1. 핸들러 매핑 ?
  2. 싱글톤 패턴 ? 
'웹' 카테고리의 다른 글
  • MVC 패턴으로 프로젝트 진행 시 유의사항
  • [JSP, JavaScript] 네이버 로그인 API
  • 이미지파일 업로드
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    멘토씨리즈 자바
    html
    오버로딩
    Di
    recoverabledataaccessexception
    스프링 프레임워크
    티스토리챌린지
    상속
    수제비
    DispatcherServlet
    ViewResolver
    생성자
    java
    Spring
    codeup 4891 : 행복
    어노테이션
    aop
    정처기 실기
    객체지향
    오블완
    @Component
    @repository
    MVC
    @service
    2-layered 아키텍처
    정보처리기사
    정처기
    jsp
    정보처리기사 실기
    이벤트 스케줄러
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
핸들러 매핑, 싱글톤 패턴

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.