[스프링 MVC] 스프링 웹 개발 기초

hyelim·2023년 5월 7일
0

Spring

목록 보기
1/6
post-thumbnail
post-custom-banner

개발하다가 각종 개념이 혼돈이 와 정리한다
이번 기회에 명확하게 정리하고 개발하자

📌 @Controller - View

  • 전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용했다

    웹 계층에 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 있는데 이를 스프링 웹 MVC(spring-web-mvc) 또는 스프링 MVC라고 한다

  • 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환한다.

  • 컨트롤러에서 리턴 값으로 문자를 반환하면 viewResolver가 화면을 찾아서 처리한다
    스프링부트 템플릿엔진 기본 viewName 맵핑

    스프링부트에서 지원하는 템플릿 엔진으로는 Thymeleaf, Freemarker, Mustache, JSP 등이 존재

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
  3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후에 ViewName을 반환한다.
  5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

Controller가 반환환 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링한다

📌 @ResponseBody

Spring MVC의 컨트롤러에서도 Data를 반환해야 하는 경우가 있다.
Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용한다.
이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있다

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
  3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후에 객체를 반환한다.
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

이처럼 @RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작한다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.

단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고,
객체인 경우에는MappingJackson2HttpMessageConverter가 사용된다

이처럼 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 된다

즉, Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다

🏷️ ResponseBody vs RequestBody

ResponseBody vs RequestBody
ResponseBody: 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
RequestBody: HTTP 요청의 body내용을 자바 객체로 매핑하는 역할, 주로 RequestMapping의 POST 메소드나 PostMapping과 주로 쓰임

package com.example.board.controller;

import com.example.board.beans.vo.ReplyVO;
import com.example.board.services.ReplyService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;

@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/replies/*")
public class ReplyController {

   private final ReplyService replyService;


   @PostMapping(value="/new", consumes="application/json", produces = "text/plain; charset= utf-8")
    public ResponseEntity<String> create(@RequestBody ReplyVO replyVO) throws UnsupportedEncodingException{

       int replyCount = replyService.register(replyVO);
       log.info("ReplyVO : "+  replyVO);
       log.info("REPLY INSERT COUNT  : "+ replyCount);

       return replyCount==1?
               new ResponseEntity<>(new String("댓글등록 완료".getBytes(),"utf-8"), HttpStatus.OK) :
               new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
   }

}

🏷️ @PathVariable

주로 RequestMapping의 GET 메소드와 GetMapping 메서드와 함께 쓰임

매핑의 URL에 { } 로 들어가는 패스 변수(path variable)를 받는다

🏷️ @RequestParam

URL Query Parameter를 처리할 때 사용되며, 예를 들어 ?id=123과 같은 쿼리 문자열의 값을 읽어오는 데 사용됨

📌 @Controller + @ResponseBody = @RestController

요즘은 @Controller+ ( @GetMapping or @PostMapping)의 형태를 주로 사용

  • Spring MVC에서 @Controller와 @ResponseBody를 합친 것
    RESTful 웹 서비스를 구현할 때 사용

  • @RestController는 Spring MVC Controller에 @ResponseBody가 추가된 것

  • 당연하게도 RestController의 주 용도는 Json 형태로 객체 데이터를 반환하는 것


1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 객체를 반환한다.
5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

  • RestController 사용전
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class FirstController {
    
        @ResponseBody // View 페이지가 아닌 응답값 그대로 반환하기 위해 사용
        @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
        public String helloWorld() {
            return "hello world";
        }
    
    }
  • RestController 사용 후
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class SecondController {
    
        @RequestMapping(value = "/hellospring", method = RequestMethod.GET)
        public String helloSpring() {
            return "Hello Spring";
        }
    
    }

📌 @RequestMapping

Spring MVC에서 클라이언트 요청을 처리할 메서드에 매핑되는 URL 패턴을 정의하는 어노테이션
@Controller나 @RestController 어노테이션과 함께 사용되며, 요청에 대한 처리를 담당하는 메서드와 URL 패턴을 매핑

이 annotation은 클래스와 메서드 수준에서 모두 사용할 수 있다.
그러나 RequestMapping 은 클래스 레벨에서 주로 사용한다.
대부분의 경우 메소드 레벨에서 애플리케이션은 HTTP 메소드 특정 변형 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 또는 @PatchMapping 중 하나를 사용하는 것을 선호.

참조

https://mangkyu.tistory.com/49
https://imucoding.tistory.com/217

profile
기록용
post-custom-banner

0개의 댓글