Spring - Spring MVC, Controller

김상엽·2024년 1월 19일
0

Spring

목록 보기
3/26
post-thumbnail

TIL

MVC 디자인 패턴이란?

  • Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나이다.

Model

  • 데이터와 비즈니스 로직을 담당한다.
  • 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행한다.

View

  • 사용자 인터페이스를 담당한다.
  • 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현한다.

Controller

  • Model과 View 사이의 상호작용을 조정하고 제어한다.
  • 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다.

Spring MVC란?

스프링 프레임워크의 모듈 중에는 웹 계층을 담당하는 몇 가지 모듈이 있다.
웹 계층에 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 있는데 이를 스프링 웹 MVC(spring-web-mvc) 또는 스프링 MVC라고 한다.
Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어 있으며 이 모델은 유연하고 다양한 워크 플로우를 지원한다.

Servlet(서블릿)이란?

Servlet(서블릿)은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말한다.

사용자가 (HTTP)API 요청했을 때 서버의 서블릿이 동작하는 과정

  1. 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청을 한다.
  2. 요청을 받은 Servlet 컨테이너HttpServletRequest, HttpServletResponse 객체를 생성한다.
    • 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체이다.
  3. 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾는다.
  4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드를 호출한다.
  5. 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환한다.
  6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸한다.

Front Controller

모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다. 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리하고 있다.

1. Client(브라우저)에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석한다.
2. DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달해 준다.

  • 예시
    • GET /api/helloHelloControllerhello() 함수
    • GET /user/loginUserControllerlogin() 함수
    • GET /user/signupUserControllersignup() 함수
    • POST /user/signupUserControllerregisterUser() 함수
  • Handler mapping 에는 API path 와 Controller 메서드가 매칭되어 있다.

    @RestController
    public class HelloController {
        @GetMapping("/api/hello")
        public String hello() {
            return "Hello World!";
        }
    }
  • API path 즉, URL을 Controller에 작성하는 방법은 @Controller가 달려있는 클래스를 생성한 뒤 @GetMapping처럼 요청한 HTTP Method 와 일치하는 annotation을 추가한 메서드를 구현한다.

    • URL은 @GetMapping("/api/hello") 이처럼 해당 annotation의 속성값으로 전달해주면 된다.
    • 해당 메서드명은 URL을 매핑하는데 영향을 미치지 않음으로 자유롭게 정해도 상관 없다.
  1. ControllerDispathcerServlet
    • 해당 Controller는 요청에 대한 처리를 완료 후 처리에 대한 결과 즉, 데이터('Model')와 'View' 정보를 전달한다.
  2. DispatcherServletClient
    • ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달한다.

Controller annotation

  • @Controller : 해당 클래스가 Controller의 역할을 수행할 수 있도록 등록
@Controller
public class HelloController {
    @GetMapping("/api/hello")
    @ResponseBody
    public String hello() {
        return "Hello World!";
    }
}
  • @GET : GET HTTP Method에 매핑되는 annotation
  • @POST : POST HTTP Method에 매핑되는 annotation
  • @PUT : PUT HTTP Method에 매핑되는 annotation
  • @DELETE : DELETE HTTP Method에 매핑되는 annotation
  • @RequestMapping : 중복되는 URL를 단축시켜줄 수 있다
@Controller
@RequestMapping("/api")
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello World!";
    }

오늘의 회고

드디어 Spring의 개인과제도 공개되었다
난이도가 그렇게 어려워 보이진 않았다
다음주 월요일까지는 강의를 최대한 들어보고 화요일에 만들어보는쪽으로 해야겠다
Postman이나 Chrome으로 테스트 해보는게 너무 재밌다

profile
개발하는 기록자

0개의 댓글