Spring/스프링 기본

MVC 어노테이션 정리

공대키메라 2022. 1. 19. 01:09

필자는 최근에 spring 강의를 뒤져가며 공부를 다시 하고 있다. 

그전에는 그냥 사용하기에 급급했기에 비슷한 어노테이션이 나오게 되면 차이점을 잘 몰랐다. 

그렇기에 이렇게 정리를 하고자 한다. 

1. @Controller vs @RestController

@Controller 는 Spring MVC (Model - View - Controller)패턴에서 View(화면)을 반환할 때 사용하는 어노테이션이다 .

반환시에 논리적인 view 를 해당 위치에 있는 view template을 찾아 화면을 구성해준다. 

 

 

@RestController 는 Spring MVC 패턴에서 화면이 아닌 데이터를 반환하고 싶을 때 사용한다. 

사실 RestController도 결국 열어보면 @Controller + @ResponseBody가 혼합된 어노테이션이다

어노테이션은 여러개의 어노테이션을 조합해서 만들수도 있다. 

 

참고 : https://velog.io/@woo00oo/RestController-vs-Controller

 

2. @ResponseBody vs @RequestBody

그대로 두 개를 읽어보면 응답바디 vs 요청바디다.

 

응답 내용을 위한 annotation vs 요청 내용을 위한 annotation이다 .

 

@ResponseBody는 자바 객체를 Http 요청의 body내용으로 매핑해주는 역할을 한다. 


@RestController는 결국 @Controller + @ResponseBody라고 바로 위에서 설명했는데 

결국 @ResponseBody가 데이터틀 반환할 때 사용하는 annotation인 것이다. 

 

@RequestBody 는 요청받은 내용을 자바의 객체로 담아주는 역할을 한다. 

 

 

필자가 혼자 공부하면서 만든 코드를 보면 @RequestBody를 선언하고 class를 바로 선언해서 parameter를 받아온다. 

 

객체 형식으로 데이터를 front에서 전송하면 이 controller부분에서 알맞은 형태로 parameter 성분 명을 잘 매치시켜서 우리가 원하는 형식으로 넘겨준다.

 

3. @RequestMapping - @Get, @Put, @Post, @Delete, @PatchMapping 

 

@RequestMapping url로 요청한 특정 메서드와 매핑하기 위해 사용하는 annotation이다. 

 

@RequestMapping은 메소드 레벨, 클래스 레벨에서 둘 다 사용이 가능하다.

 

공통되는 url mapping 주소는 클래스 레벨에서 @RequestMapping을 선언해서 처리할 수도 있다.

 

@RequestMapping은 아무것도 선언하지 않고 그냥 ""안에 값을 작성한다면 그것이 url pattern이 된다. 

 

여러 기능이 있는데 이중에 몇개만 보려고 한다. 

  • produces : Response의 Content-Type을 제어할 수 있다. 그러니까 어떤 값으로 반환하고 싶은지 설정이 가능하다.
  • consumes : Request의  Content-Type을 제어할 수 있다. 그러니까 어떤 값으로 받고 싶은지 설정이 가능하다. 
  • method : 어떤 형식으로 클라이언트의 요청을 처리할지 설정 가능.
  • name :  스프링에 서블릿 클래스와 url 패턴 이름을 할당할 때 사용. 
  • value : url pattern을 정의할 때 사용 (value = "/test") 라면 개발 서버에서 localhost:8080/test로 접근!

@GetMapping, @PostMapping, @PutMapping 등등의 것들은 결국 열어보면 다음과 같다. 

내부에는 RequestMapping으로 되어있고 method도 설정을 해준것이다. 다만 이러한 과정이 번거로울 수 있으니 간단히 쓸 수 있도록 편의를 제공하는 것이다. 

 

참고 

- https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=writer0713&logNo=221422059349&parentCategoryNo=&categoryNo=83&viewDate=&isShowPopularPosts=false&from=postView 

- https://bigfat.tistory.com/103 

- https://stackoverflow.com/questions/36008125/springboot-requestmappingname-home-requestmappingvalue-home

 

4. @PathVariable, @RequestParam

 

@PathVariable은 URL 경로에 변수를 넣어주는 역할을 한다. 

 

예시 

@GetMapping("/{itemId}/edit")
public String editForm(@PathVariable Long itemId, Model model){
    Item item = itemRepository.findById(itemId);
    model.addAttribute("item", item);
    return "basic/editForm";
}

혹은

@GetMapping("/{itemId}/edit")
public String editForm(@PathVariable("받은 변수 이름") Long itemId, Model model){
    Item item = itemRepository.findById(itemId);
    model.addAttribute("item", item);
    return "basic/editForm";
}

 

응답으로 넘어오는 parameter명을 설정해서 원하는 변수명으로 받아올 수도 있고, 파라미터 명과 설정 변수명이 동일하면 이름을 따로 세팅해줄 필요 없이 알아서 값을 잘 넣어준다. 

 

@RequestParam은 사용자가 요청시 전달하는 값을 1대1 매핑할 때 사용되는 어노테이션이다. 

 

예시 

@PostMapping("/add")
public String addItemV1(@RequestParam String itemName,
                   @RequestParam int price,
                   @RequestParam Integer quantity,
                   Model model){

    Item item = new Item();
    item.setItemName(itemName);
    item.setPrice(price);
    item.setQuantity(quantity);

    itemRepository.save(item);

    model.addAttribute("item", item);
    return "basic/item";
}

 

참고

1) https://galid1.tistory.com/769

 

 

5. @ModelAttribute VS @RequestBody

 

위에서 @RequestBody에 대해서 소개를 했는데 이 기능이 @ModelAttribute와 흡사하다. 

 

어떤 차이점이 있는지 정확히 모르겠어서 찾다가 아주 잘 설명된 블로그의 내용을 발췌했다.

 

@RequestBody 는 클라이언트가 보내는 HTTP요청 본문을 Java 오브젝트로 변환한다.

@RequestBody를 사용하면 요청 본문의 JSON, XML, Text 등의 데이터가 적합한 HttpMessageConverter를 통해 파싱되어 Java 객체로 변환 된다.@RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 setter 메서드가 필요없다.다만 직렬화를 위해 기본 생성자는 필수다.또한 데이터 바인딩을 위한 필드명을 알아내기 위해 getter나 setter 중 1가지는 정의되어 있어야 한다.


@ModelAttribute 애너테이션의 역할은 클라이언트가 보내는 HTTP 파라미터들을 특정 Java Object에 바인딩(맵핑) 하는 것입니다. /modelattribute?name=req&age=1 같은 Query String 형태 혹은 요청 본문에 삽입되는 Form 형태의 데이터를 처리합니다.

@ModelAttribute를 사용하면 HTTP 파라미터 데이터를 Java 객체에 맵핑한다.따라서 객체의 필드에 접근해 데이터를 바인딩할 수 있는 생성자 혹은 setter 메서드가 필요하다.Query String 및 Form 형식이 아닌 데이터는 처리할 수 없다.

 

참고

: https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/

 

6. Spring 내 Model 객체

https://nancording.tistory.com/90

 

 

 

'Spring > 스프링 기본' 카테고리의 다른 글

Glory of Rest 란 뭘까? + HATEOS 적용기  (0) 2022.02.16
Spring Web Socket 적용하기  (2) 2022.02.04
Spring VS Spring boot  (3) 2022.02.03
@Json~~~ 관련 annotation 정리  (0) 2022.02.03
Bean이란?  (2) 2022.01.28