backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 프론트 컨트롤러 패턴 (Front Controller Pattern)
  • 1. 프론트 컨트롤러 패턴이란?
  • 2. 프론트 컨트롤러 패턴의 특징
  • 3. 프론트 컨트롤러 패턴의 동작 흐름
  • 4. 프론트 컨트롤러 패턴의 장점
  • 5. 스프링 웹 MVC와 프론트 컨트롤러 패턴
  • 6. 프론트 컨트롤러 패턴의 예제 코드
  • DispatcherServlet - 스프링 MVC의 핵심
  • 1. DispatcherServlet이란?
  • 2. DispatcherServlet의 특징
  • 3. DispatcherServlet의 동작 순서
  • 4. DispatcherServlet 설정
  • 5. DispatcherServlet의 구성 요소
  • 6. DispatcherServlet 예제 코드
  • 7. DispatcherServlet의 장점
  • 1. HandlerMapping
  • 1.1 HandlerMapping이란?
  • 1.2 HandlerMapping의 주요 동작
  • 1.3 HandlerMapping의 우선순위
  • 1.4 HandlerMapping의 역할
  • 2. HandlerAdapter
  • 2.1 HandlerAdapter란?
  • 2.2 HandlerAdapter의 주요 동작
  • 2.3 HandlerAdapter의 역할
  • 3. HandlerMapping과 HandlerAdapter의 연관 관계
  • 4. 예제 코드
  • 5. 주요 장점
  1. 스프링
  2. Spring Boot
  3. 03 스프링 구조

스프링 구조 보충설명

프론트 컨트롤러 패턴 (Front Controller Pattern)

1. 프론트 컨트롤러 패턴이란?

프론트 컨트롤러 패턴은 웹 애플리케이션에서 모든 클라이언트 요청을 단일 진입점(프론트 컨트롤러)을 통해 처리하는 디자인 패턴입니다. 프론트 컨트롤러는 클라이언트 요청을 받아서 적절한 컨트롤러로 요청을 전달하고, 응답을 생성하여 반환하는 역할을 합니다.


2. 프론트 컨트롤러 패턴의 특징

2.1 단일 진입점 (Single Entry Point)

  • 모든 클라이언트 요청은 프론트 컨트롤러를 통해서만 처리됩니다.

  • 단일 서블릿(프론트 컨트롤러 서블릿)이 모든 요청을 받아 적절한 컨트롤러로 요청을 전달합니다.

2.2 요청에 따른 컨트롤러 호출

  • 프론트 컨트롤러는 요청 정보를 기반으로 요청에 맞는 컨트롤러를 찾아 호출합니다.

  • 클라이언트가 요청한 URL이나 HTTP 메서드 정보를 분석하여 컨트롤러를 매핑.

2.3 공통 처리 가능

  • 모든 요청이 프론트 컨트롤러를 거치므로 공통 기능(로깅, 인증, 인가, 예외 처리 등)을 중앙에서 처리할 수 있습니다.

  • 요청과 응답에 대한 공통 로직을 하나의 진입점에서 관리할 수 있어 중복 코드가 줄어듭니다.

2.4 서블릿의 역할 분리

  • 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 직접 구현할 필요가 없습니다.

  • 프론트 컨트롤러가 서블릿 역할을 대신 수행하고, 각 컨트롤러는 요청 처리 로직에만 집중할 수 있습니다.


3. 프론트 컨트롤러 패턴의 동작 흐름

프론트 컨트롤러 패턴의 동작은 다음과 같은 흐름을 따릅니다:

  1. 클라이언트 요청

    • 사용자가 웹 애플리케이션에 요청을 보냅니다. (예: /user/login)

  2. 프론트 컨트롤러 서블릿 요청 처리

    • 프론트 컨트롤러(서블릿)가 모든 요청을 받아 처리합니다.

  3. 컨트롤러 선택 및 호출

    • 프론트 컨트롤러는 요청 URL이나 요청 데이터를 분석하여, 요청에 적합한 컨트롤러를 찾아 호출합니다.

  4. 비즈니스 로직 처리

    • 호출된 컨트롤러는 요청 데이터를 기반으로 비즈니스 로직을 처리하고, 결과를 반환합니다.

  5. 뷰로 이동

    • 프론트 컨트롤러는 컨트롤러의 결과를 기반으로 적절한 뷰(View)를 선택하고 렌더링하여 클라이언트에게 응답을 보냅니다.


4. 프론트 컨트롤러 패턴의 장점

4.1 공통 처리 중앙화

  • 모든 요청이 프론트 컨트롤러를 통해 처리되므로, 로깅, 인증, 인가, 예외 처리 등의 공통 로직을 중앙에서 관리할 수 있습니다.

4.2 코드 중복 감소

  • 공통 로직이 프론트 컨트롤러에 집중되므로, 각 컨트롤러에서 중복 코드가 줄어듭니다.

4.3 확장성 및 유지보수성

  • 컨트롤러 추가 및 변경 시 프론트 컨트롤러만 수정하면 되므로, 애플리케이션의 확장성과 유지보수성이 향상됩니다.

4.4 서블릿 코드 분리

  • 서블릿 코드는 프론트 컨트롤러에만 집중되고, 나머지 컨트롤러는 순수한 비즈니스 로직 처리에만 집중할 수 있습니다.


5. 스프링 웹 MVC와 프론트 컨트롤러 패턴

5.1 스프링의 DispatcherServlet

  • 스프링 웹 MVC는 프론트 컨트롤러 패턴을 기반으로 설계되었습니다.

  • 스프링에서 프론트 컨트롤러 역할을 하는 클래스는 DispatcherServlet입니다.

5.2 DispatcherServlet의 동작 흐름

  1. 클라이언트의 모든 요청은 DispatcherServlet이 처리합니다.

  2. DispatcherServlet은 요청 정보를 기반으로, 요청에 알맞은 **Handler(Controller)**를 찾아 호출합니다.

  3. 컨트롤러가 비즈니스 로직을 처리한 결과를 반환합니다.

  4. DispatcherServlet은 결과를 기반으로 적절한 View를 선택하고 렌더링합니다.

  5. 최종적으로 클라이언트에게 응답을 반환합니다.

5.3 DispatcherServlet 설정 예시

스프링에서 DispatcherServlet은 일반적으로 다음과 같이 설정됩니다:

<!-- web.xml -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

5.4 스프링에서 공통 처리 예시

스프링에서는 **인터셉터(HandlerInterceptor)**를 사용하여 공통 로직을 처리할 수 있습니다.

public class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("Request URL: " + request.getRequestURL());
        return true;
    }
}

6. 프론트 컨트롤러 패턴의 예제 코드

6.1 간단한 프론트 컨트롤러 구현

@WebServlet("/front-controller/*")
public class FrontControllerServlet extends HttpServlet {
    private final Map<String, Controller> controllerMap = new HashMap<>();

    public FrontControllerServlet() {
        controllerMap.put("/front-controller/users", new UserController());
        controllerMap.put("/front-controller/products", new ProductController());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestURI = request.getRequestURI();
        Controller controller = controllerMap.get(requestURI);

        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        controller.process(request, response);
    }
}

6.2 컨트롤러 구현

public interface Controller {
    void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

public class UserController implements Controller {
    @Override
    public void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.getWriter().write("User Controller Response");
    }
}

DispatcherServlet - 스프링 MVC의 핵심

1. DispatcherServlet이란?

  • DispatcherServlet은 스프링 웹 MVC에서 모든 요청과 응답의 중심 역할을 하는 **프론트 컨트롤러(Front Controller)**입니다.

  • 클라이언트의 모든 요청은 DispatcherServlet을 통해 처리되며, 적절한 핸들러(Controller)를 찾아 실행하고, 처리 결과를 View로 전달하여 응답합니다.


2. DispatcherServlet의 특징

2.1 단일 진입점

  • 모든 클라이언트 요청이 DispatcherServlet을 통해 전달되므로 단일 진입점을 제공합니다.

  • 이로 인해 공통 처리 로직(예: 로깅, 인증, 예외 처리 등)을 중앙 집중적으로 관리할 수 있습니다.

2.2 프론트 컨트롤러 패턴 기반

  • DispatcherServlet은 프론트 컨트롤러 패턴을 구현한 대표적인 예입니다.

  • 요청을 받아서, 적절한 컨트롤러(Handler)를 찾아 호출하고, 처리 결과를 적절한 뷰(View)로 매핑하여 클라이언트에게 응답을 반환합니다.


3. DispatcherServlet의 동작 순서

3.1 요청 처리 흐름

  1. 클라이언트 요청 수신

    • 클라이언트가 요청을 보내면, 요청은 먼저 DispatcherServlet으로 전달됩니다.

  2. 핸들러 매핑 조회

    • DispatcherServlet은 HandlerMapping을 통해 요청 URL에 매핑된 핸들러(Controller)를 조회합니다.

    • 등록된 핸들러가 없으면 404 에러를 반환합니다.

  3. 핸들러 실행

    • 적합한 핸들러(Controller)를 찾아서 호출합니다.

    • 컨트롤러는 비즈니스 로직을 처리한 결과를 ModelAndView 객체로 반환합니다.

  4. 뷰 리졸버를 통해 뷰 찾기

    • DispatcherServlet은 ViewResolver를 사용하여 ModelAndView에 담긴 뷰 이름에 해당하는 뷰 객체를 찾습니다.

  5. 뷰 렌더링

    • 찾은 뷰 객체를 사용하여 클라이언트에게 렌더링된 결과를 반환합니다.


3.2 DispatcherServlet 동작 단계의 상세 설명

1) 클라이언트 요청 수신

브라우저 → http://example.com/user/login 요청 → DispatcherServlet이 요청을 받음
  • 모든 요청은 web.xml에 설정된 DispatcherServlet으로 전달됩니다.

  • URL 패턴이 DispatcherServlet에 매핑된 경우 요청은 반드시 DispatcherServlet을 거쳐 처리됩니다.

2) 핸들러 매핑

  • DispatcherServlet은 요청 URL에 해당하는 핸들러를 찾기 위해 HandlerMapping을 사용합니다.

  • 예: /user/login 요청 → UserController의 메서드 호출

3) 핸들러 실행

  • 요청을 처리할 컨트롤러(핸들러)를 실행하여 비즈니스 로직을 수행합니다.

  • 핸들러는 처리 결과를 ModelAndView 객체로 반환합니다.

4) 뷰 리졸버 처리

  • ModelAndView에서 반환된 뷰 이름을 기반으로 ViewResolver가 실제 뷰 파일(예: JSP)을 찾습니다.

  • 예: login 뷰 이름 → /WEB-INF/views/login.jsp

5) 뷰 렌더링 및 응답 반환

  • 뷰 객체가 클라이언트에게 렌더링된 결과를 반환합니다.

  • 예: HTML, JSON, XML 등의 형식으로 응답.


4. DispatcherServlet 설정

web.xml에 설정

DispatcherServlet은 일반적으로 web.xml에 다음과 같이 등록됩니다:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • url-pattern: 모든 요청을 DispatcherServlet이 처리하도록 /로 매핑.


5. DispatcherServlet의 구성 요소

5.1 주요 구성 요소

  1. HandlerMapping

    • URL 요청과 컨트롤러(핸들러)를 매핑하는 역할.

    • 스프링은 기본적으로 다양한 HandlerMapping 구현체를 제공합니다.

  2. HandlerAdapter

    • 핸들러(Controller)와 DispatcherServlet 간의 호환성을 처리.

    • 요청을 적절히 변환하여 컨트롤러를 호출하고 결과를 반환.

  3. ViewResolver

    • 뷰 이름을 실제 뷰 파일로 변환하는 역할.

    • 예: login → /WEB-INF/views/login.jsp

  4. ModelAndView

    • 컨트롤러에서 반환하는 데이터 모델과 뷰 정보를 담는 객체.


6. DispatcherServlet 예제 코드

간단한 컨트롤러와 매핑 예제

@Controller
public class UserController {
    @RequestMapping("/user/login")
    public String login(Model model) {
        model.addAttribute("message", "Welcome to the login page!");
        return "login"; // View 이름 반환
    }
}

ViewResolver 설정

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

7. DispatcherServlet의 장점

7.1 요청 처리 단일화

  • 모든 요청을 단일 진입점으로 처리하여 요청 관리가 효율적.

7.2 공통 처리 용이

  • 인증, 권한 확인, 로깅 등의 공통 로직을 DispatcherServlet에서 처리 가능.

7.3 확장성 및 유지보수성

  • 컨트롤러 추가 및 변경 시 DispatcherServlet 설정만 변경하면 됨.

1. HandlerMapping

1.1 HandlerMapping이란?

  • HandlerMapping은 클라이언트 요청(예: URL 패턴)과 이를 처리할 컨트롤러(Handler)를 매핑하는 역할을 합니다.

  • 클라이언트의 요청이 들어오면, DispatcherServlet이 HandlerMapping을 통해 요청 URL에 매핑된 컨트롤러를 찾아서 반환합니다.


1.2 HandlerMapping의 주요 동작

  1. 요청 URL과 컨트롤러 매핑 조회

    • 클라이언트가 보낸 요청의 URL을 기반으로 어떤 컨트롤러(Handler)가 요청을 처리할지 결정합니다.

    • 예를 들어, /user/login 요청이 들어오면 HandlerMapping은 해당 요청을 처리할 UserController의 특정 메서드로 매핑합니다.

  2. 핸들러 반환

    • 매핑된 컨트롤러(핸들러)를 DispatcherServlet에 반환합니다.

    • 만약 요청 URL과 매핑된 컨트롤러가 없으면 404 에러를 반환합니다.


1.3 HandlerMapping의 우선순위

HandlerMapping은 요청을 매핑할 때 설정된 우선순위를 따릅니다. 스프링에서는 기본적으로 다음과 같은 방식으로 요청을 매핑합니다:

  1. 애노테이션 기반 매핑

    • @RequestMapping 또는 @GetMapping, @PostMapping 등으로 등록된 컨트롤러.

    • 예:

      @Controller
      @RequestMapping("/user")
      public class UserController {
          @GetMapping("/login")
          public String login() {
              return "login";
          }
      }
  2. 스프링 빈 이름 기반 매핑

    • @Component("/mvc/pattern")처럼 직접 URL을 매핑하는 방식.

    • 사용 빈도가 낮음.


1.4 HandlerMapping의 역할

  • DispatcherServlet과 Controller 간의 연결 역할을 합니다.

  • 클라이언트 요청 → HandlerMapping → 매핑된 컨트롤러 반환 → DispatcherServlet이 핸들러 실행.


2. HandlerAdapter

2.1 HandlerAdapter란?

  • HandlerAdapter는 DispatcherServlet이 반환받은 컨트롤러(Handler)를 실행하는 데 필요한 추가 작업을 처리합니다.

  • 반환된 핸들러가 어떤 방식으로 요청을 처리해야 하는지 결정하고, 적절한 메서드를 호출합니다.


2.2 HandlerAdapter의 주요 동작

  1. 컨트롤러 실행

    • HandlerMapping에서 반환된 컨트롤러의 메서드를 호출하여 요청을 처리합니다.

    • 예를 들어, @RequestMapping에 매핑된 메서드를 실행합니다.

  2. 결과 반환

    • 컨트롤러 메서드의 실행 결과(ModelAndView 또는 ResponseEntity)를 DispatcherServlet에 반환합니다.

    • 반환된 결과는 이후 ViewResolver를 통해 클라이언트로 전달됩니다.


2.3 HandlerAdapter의 역할

  • DispatcherServlet과 Handler의 호환성 처리:

    • 다양한 종류의 컨트롤러를 처리할 수 있도록 중간 역할을 수행합니다.

    • 예: @RequestMapping, SimpleControllerHandler, HttpRequestHandler 등 여러 컨트롤러 유형을 지원.


3. HandlerMapping과 HandlerAdapter의 연관 관계

3.1 동작 흐름

  1. DispatcherServlet → HandlerMapping

    • DispatcherServlet은 요청 URL에 매핑된 컨트롤러를 찾기 위해 HandlerMapping을 호출.

    • HandlerMapping은 요청 URL과 매핑된 컨트롤러를 반환.

  2. DispatcherServlet → HandlerAdapter

    • DispatcherServlet은 HandlerMapping에서 반환된 컨트롤러를 실행하기 위해 HandlerAdapter를 호출.

    • HandlerAdapter는 컨트롤러의 메서드를 호출하여 요청을 처리.

  3. HandlerAdapter → DispatcherServlet

    • HandlerAdapter는 처리 결과(ModelAndView 또는 ResponseEntity)를 DispatcherServlet에 반환.

  4. DispatcherServlet → ViewResolver

    • 처리 결과를 바탕으로 ViewResolver를 통해 적절한 뷰를 렌더링.


3.2 관계를 통한 동작 구조

  • HandlerMapping: "누가 이 요청을 처리해야 하는가?"에 대한 답을 제공.

  • HandlerAdapter: "요청을 처리하는 방법은 무엇인가?"를 실행.


4. 예제 코드

4.1 DispatcherServlet 설정

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

4.2 HandlerMapping 예제

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/login")
    public String login() {
        return "login";
    }
}

4.3 HandlerAdapter 처리 예제

HandlerAdapter는 자동으로 @RequestMapping에 매핑된 메서드를 호출합니다:

public class RequestMappingHandlerAdapter implements HandlerAdapter {
    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 요청 처리 및 결과 반환
        return new ModelAndView("viewName");
    }
}

5. 주요 장점

  • 유연성: 다양한 방식으로 요청을 매핑할 수 있고, 다양한 컨트롤러를 처리할 수 있음.

  • 확장성: 새로운 매핑 방식 또는 컨트롤러 유형 추가 시 DispatcherServlet의 변경 없이 HandlerMapping 또는 HandlerAdapter만 확장하면 됨.

  • 결합도 감소: DispatcherServlet과 컨트롤러 간의 강한 결합을 줄이고, HandlerMapping과 HandlerAdapter를 통해 느슨한 결합 유지.

Previous03 스프링 구조Next04 테스트코드 실습

Last updated 4 months ago