내배캠 TIL 25일차

오병택·2025년 3월 24일

내배캠

목록 보기
47/73

학습 요약

Spring 입문 강의, Schedule

Schedule lv0


아래 사진은 짤린 부분만 따로 올린 것입니다.

오늘은 0단계인 erd와 api를 만드는 것까지만 했습니다.

Spring MVC 1강

Spring MVC 구조

  • DispatcherServlet : Spring의 프론트 컨트롤러
  • View : 인터페이스로 구성되어 있다, 확장성을 가지고 있다.

실행순서

  1. Client로 부터 HTTP 요청(Request)을 받음
  2. Handler 조회
    • Handler Mapping을 통해 요청 URL에 Mapping된 Handler(Controller)를 조회
  3. Handler를 처리할 Adapter 조회
  4. Handler Adapter 실행(handle)
    • 알맞은 어댑터가 존재한다면 Handler Adapter에게 요청을 위임
  5. Handler 실행(호출)
    • Handler Adapter가 실제 Handler(Controller)를 호출하여 실행 및 결과 반환
  6. Model And View 반환(return)
    • Handler Adapter는 Handler가 반환 하는 정보를 ModelAndView 객체로 변환하여 반환
  7. viewResolver 호출(알맞은 View 요청)
    • View Resolver를 찾고 실행
  8. View 반환
    • View Resolver는 View의 논리 이름을 물리 이름으로 전환하는 역할을 수행하고 Rendering 역할을 담당하는 View 객체를 반환
  9. View Rendering

요약

  • DispatcherServlet
    1. 클라이언트 HTTP Request를 알맞게 파싱하고 클라이언트에게 알맞은 응답을 반환
    2. 핸들러 목록 정보를 알고 있음
    3. 핸들러 어댑터 목록 정보를 알고 있음
  • HandlerAdapter
    1. 자신이 처리할 수 있는 Handler인지 확인할 수 있는 기능(Method)이 필요
    2. 프론트 컨트롤러에서 요청을 위임받았을 때 핸들러에게 요청을 지시하는 기능이 필요
    3. return 시 Handler로부터 전달받은 결과를 알맞은 응답으로 변환
  • Handler
    1. 요청에 대한 로직을 수행하는 기능이 필요

Dispatcher Servlet

Spring MVC의 핵심 기능

Spring MVC의 주요 Interface

  1. HandlerMapping
  2. HandlerAdapter
  3. ViewResolver
  4. View

Spring MVC는 DispatcherServlet 코드의 변경 없이 기능변경 및 확장이 가능
기능들이 대부분 Interface로 만들어져 있기 때문


Spring MVC 2강

Controller Interface

Controller Interface를 implements 하여 구현하게 되면 개발자가 원하는 Controller(Handler)를 사용할 수 있음

  • 구현 예시
    package com.example.springbasicmvc.controller;
    
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    // Spring Bean 이름을 URL로 설정
    @Component("/example-controller")
    public class ExampleController implements Controller {
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("example-controller가 호출 되었습니다.");
            return null;
        }
    }
    • http://localhost:8080/example-controller 로 HTTP 요청을 하게 되면 응답결과가 반환
    • @Component
      • Spring Bean에 등록하는 역할을 수행
        • Spring Bean은 애플리케이션의 구성 요소를 정의하는 객체
        • 마치 Servlet이 Servlet Container에 등록되는 것과 같음

ExampleController 호출 방식

Handler Mapping, Handler Adapter가 해당 컨트롤러(핸들러)가 호출되도록 만들어줌

  1. Handler Mapping
  • 핸들러 매핑에서 ExampleController를 찾을 수 있어야 함
    → Spring Bean의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑 필요
  1. Handler Adapter
  • Handler Mapping을 통해 찾은 핸들러를 실행할 수 있는 Handler Adapter가 필요

    → Controller Interface를 실행할 수 있는 Handler Adapter를 찾고 실행

Spring Boot를 사용하면 이미 구현되어 있음

Spring Boot의 Handler Mapping, Handler Adapter

HandlerMapping, HandlerAdapter 모두 우선순위대로 조회

  • HandlerMapping

    • 우선순위 순서
    1. RequestMappingHandlerMapping
      • Annotation 기반 Controller의 @RequestMapping에 사용
    2. BeanNameUrlHandlerMapping
      • Spring Bean Name으로 HandlerMapping
  • HandlerAdapter

    • 우선순위 순서
    1. RequestMappingHandlerAdapter
      • Annotation 기반 Controller의 @RequestMapping에서 사용
    2. HttpRequestHandlerAdapter
      • HttpRequestHandler 처리
    3. SimpleControllerHandlerAdapter
      • Controller Interface 처리

❕ @RequestMapping 은 가장 높은 우선순위의 HandlerMapping인 RequestMappingHandlerMapping 과 가장 높은 우선순위의 HandlerAdapter인 RequestMappingHandlerAdapter 두가지를 사용하며 현대에 사용하는 Annotation 기반의 컨트롤러를 지원


Spring MVC 3강

View Resolver

반환된 ModelAndView 객체를 알맞은 View로 전달하기 위해 DispatcherServlet에서 ViewResolver를 호출하여 View 정보를 설정하는 역할을 수행

구현예시

package com.example.springbasicmvc.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// Spring Bean 이름을 URL로 설정
@Component("/view-controller")
public class ViewController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        System.out.println("view-controller가 호출 되었습니다.");

        // "test"는 논리적인 ViewName이다. ViewResolver가 물리적인 이름으로 변환해야 한다.
        return new ModelAndView("test");
    }
}

Template Engine JSP

  • webapp/WEB-INF/form.JSP
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>블로그 포스트 작성 페이지</title>
    </head>
    <body>
    <h1>블로그 글쓰기</h1>
    <form action="save" method="post">
      title: <input type="text" name="title" placeholder="제목" />
      content: <input type="text" name="content" placeholder="내용" />
      <button type="submit">저장</button>
    </form>
    
    </body>
    </html>
  • ViewResolver
    • application.properties 설정
    • 설정을 기반으로 Spring Boot가 InternalResourceViewResolver 를 만든다.
      spirng.mvc.view.prefix=/WEB-INF/views/
      spirng.mvc.view.suffix=.jsp
  • localhost:8080/view-controller 호출

Spring Boot의 ViewResolver

Spring Boot를 사용하면 자동 등록되는 ViewResolver가 있음

우선순위 순서

아래 두 가지 이외에도 많은 ViewResolver가 존재

  1. BeanNameViewResolver
    Bean Name으로 View를 찾아 반환
  2. InternalResourceViewResolver
    application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하여 ViewResolver 등록
// 아래 코드를 자동으로 해주는것과 마찬가지이다.
@Bean
InternalResourceViewResolver internalResourceViewResolver() {
	return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
}

느낀 점

오늘 드디어 Spring 입문 강의를 6주차까지 들었다. 와 마지막 실습 부분이 새로운 문법들이 또 나와서 익히느라 스트레스 좀 받았다.. 그리고 과제를 들어갔다. 대충 이해했다고 생각했는데 혼자 만들어보려고 하니 계속 막혔다. 내일은 실습 부분을 참고해서 하는 것으로 작전 변경해야 겠다. 괜히 혼자 해보려다가 머리만 아프네.. /(ㄒoㄒ)/~~

profile
걱정하지 말고 일단 해봐!

0개의 댓글