Controller

데이터λ₯Ό μ „λ‹¬ν•œ Mapping 정보가 μ €μž₯λ˜λŠ” 클래슀. ( 둜직처리λ₯Ό λ‹΄λ‹Ή )

μ–΄λ–»κ²Œ 처리 할지 μ•Œλ €μ£ΌλŠ” μ—­ν• λ‘œ μΌμ’…μ˜ Modelκ³Ό View의 Proxyμ—­ν• 

jspλ‚˜ ν…œν”Œλ¦Ώμ„ 톡해 결과물을 νŠΉμ • 경둜둜 μ—°κ²° μ‹œμΌœμ£Όκ±°λ‚˜ api와 같이 νŠΉμ • 데이터λ₯Ό μ „λ‹¬ν•΄μ£ΌλŠ” μ—­ν• 

μ–΄λ…Έν…Œμ΄μ…˜

@Controller

ν•΄λ‹Ή 클래슀λ₯Ό controller둜 μΈμ‹ν•˜κ²Œ ν•΄μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜

@RequestMapping

ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μš”μ²­(request)이 λ“€μ–΄μ™”μ„λ•Œ μ–΄λ–€ μš”μ²­(uri)인지 κ΅¬λΆ„ν•˜μ—¬ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜

주둜 클래슀 λ ˆλ²¨μ—μ„œ μ‚¬μš©

속성

  • name : Requestλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ κ°’μœΌλ‘œ μ–΄λ–»κ²Œ 보면 value와 κ°™μ•„ 보일 수 μžˆμœΌλ‚˜, name은 ν°ν‹€λ‘œ μ„ μ–Έν•˜κ³  value둜 μ„ΈλΆ€ 경둜λ₯Ό 지정

    @Controller
    @RequestMapping("store")
    public class ItemController {
    
    @ResponseBody
    @RequestMapping(value = "/item")
        public String getItemName(){
    
        }
    }
  • value / path : uri path을 κ΅¬λΆ„ν•˜μ—¬ μ–΄λ–€ ν•¨μˆ˜λ₯Ό 싀행할지 Mappingμ‹œν‚€λŠ” κ°’

    @RequestMapping(value = "/api/item");
  • method : RequestMethod.GET, RequestMethod.POST와 같이 μš”μ²­ λ©”μ„œλ“œλ₯Ό ꡬ뢄

  • produces : Response의 contentType을 지정할 수 μžˆλ‹€.

    @RequestMapping(value = "/api/item",produces = "application/json; charset=UTF-8");
    @RequestMapping(value = "/api/item",produces = MediaTypes.HAL_JSON_VALUE);
  • params : Request의 μš”μ²­ uri νŒŒλΌλ―Έν„°λ₯Ό λΆ„μ„ν•˜μ—¬ λ³€μˆ˜λ‘œ μ‚¬μš©

    • @PathVariable : uri path둜 λ“€μ–΄μ˜€λŠ” 값을 κ΅¬λΆ„ν•˜μ—¬ λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•¨

        ```java
        @Controller
        @RequestMapping("store")
        public class ItemController {
      
            @ResponseBody
            @RequestMapping(value = "/item/{name}", method = RequestMethod.GET)
            public String getItemName(
                @PathVariable("name") String name){
                    return name;
                }
            }
        ```
        μœ„μ™€ 같이 {name}을 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜μ΄μ§€λ§Œ, `@RequestMapping(value="/{id}")`와 같이 νŠΉμ • 경둜 없이 μ‚¬μš©ν•˜μ§€ 말자.
      • @RequestParam : /store/item?name=pencilκ³Ό 같이 λ“€μ–΄μ˜€λŠ” uri의 query string을 μ΄μš©ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜

          @Controller
          @RequestMapping("store")
          public class ItemController {
        
              @ResponseBody
              @RequestMapping(value = "/item", method = RequestMethod.GET)
              public String getItemName(
                  @RequestParam("name") String name){
                      return name;
                  }
              }
  • consumes : request body에 μ €μž₯ν•  νƒ€μž…μ„ μ œν•œ

        @RequestMapping(value = "/api/item",consumes = "application/json");

GetMapping, PostMapping, DeleteMapping, PutMapping ..

@RequestMapping에 νŠΉμ • method κ³ μ •μ μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.

λ©”μ„œλ“œμ— μ‚¬μš©λ˜μ—ˆλ‹€λ©΄ 특쑍 κ²½λ‘œκ°€ 없어도 클래슀의 RequestMapping을 μ£Όμž…λ°›λŠ”λ‹€.

@Controller
@RequestMapping(value = "/api/events", produces = "application/hal+json; charset=UTF-8")
public class EventController {

    @PostMapping
    public ResponseEntity createEvent(@RequestBody Event event){
        URI createdUri = linkTo(EventController.class).slash("{id}").toUri();
        event.setId(10);
        return ResponseEntity.created(createdUri).body(event);
    }
}

@ResponseBody, @RequestBody

비동기λ₯Ό 처리 ν•˜λŠ” 경우 μ‚¬μš© (Viewλ₯Ό 톡해 좜λ ₯이 λ˜μ§€μ•Šκ³  http body에 데이터λ₯Ό 직접 μ¨μ„œ λ³΄λ‚΄λŠ” 것)

HTTP BODY에 μ§μ ‘λ°˜ν™˜. ν…œν”Œλ¦Ώμ—”μ§„μ΄ μ•„λ‹Œ λ°”λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜.

viewResolverκ°€ μ•„λ‹Œ HttpMessageConverterκ°€ λ™μž‘ν•˜λ©°, String이면 StringConverterκ°€ 객체이면 JsonConverterκ°€ λ™μž‘ν•˜μ—¬ defaultλŠ” 객체λ₯Ό jsonν˜•μ‹μœΌλ‘œλ§Œλ“€μ–΄μ„œ 응닡.

ν΄λΌμ΄μ–ΈνŠΈμ˜ HTTP Accept헀더와 μ„œλ²„μ˜ 컨트둀러 λ°˜ν™˜ νƒ€μž… 정보 λ‘˜μ„ μ‘°ν•©ν•˜μ—¬ λ°˜ν™˜λ°©μ‹ μžλ™μœΌλ‘œ κ²°μ •

λ©”μ„œλ“œμ˜ λ°˜ν™˜ 값이 HTTP Response/Request body에 직접 직렬화 λ˜μ—ˆμŒμ„ Spring에 μ•Œλ¦°λ‹€.

HttpMessageConverterκ°€ μ‘΄μž¬ν•˜μ—¬ νŠΉμ • ν˜•νƒœ(json,xml..)둜 λ“€μ–΄μ˜¨ μš”μ²­ 값을 μžλ°” 객체둜 λ³€ν™˜ν•˜κ³  응닡을 νŠΉμ • ν˜•νƒœλ‘œ 보내기 μœ„ν•΄ μ‚¬μš©λœλ‹€.

HttpMessageConverter

Springμ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 기본적으둜 @EnableWebMvcλ₯Ό μ‚¬μš©ν•΄μ„œ WebMvcConfigurer을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

  • ByteArrayHttpMessageConverter – λ°”μ΄νŠΈ λ°°μ—΄ λ³€ν™˜

  • StringHttpMessageConverter – λ¬Έμžμ—΄ λ³€ν™˜

  • ResourceHttpMessageConverter – λͺ¨λ“  μœ ν˜•μ˜ μ˜₯ν…Ÿ μŠ€νŠΈλ¦Όμ— λŒ€ν•΄ org.springframework.- core.io.Resource λ₯Ό λ³€ν™˜ ν•©λ‹ˆλ‹€.

  • SourceHttpMessageConverter – javax.xml.transform.Sourceλ₯Ό λ³€ν™˜ν•©λ‹ˆλ‹€.

  • FormHttpMessageConverter – 양식 데이터λ₯Ό MultiValueMap <String, String> 둜 /μ—μ„œ λ³€ν™˜ν•©λ‹ˆλ‹€ .

  • Jaxb2RootElementHttpMessageConverter – Java 객체λ₯Ό XML둜 /λ‘œλΆ€ν„° λ³€ν™˜ν•©λ‹ˆλ‹€ (JAXB2κ°€ 클래슀 κ²½λ‘œμ—μžˆλŠ” κ²½μš°μ—λ§Œ 좔가됨).

  • MappingJackson2HttpMessageConverter – JSON λ³€ν™˜ (Jackson2κ°€ 클래슀 κ²½λ‘œμ—μžˆλŠ” κ²½μš°μ—λ§Œ 좔가됨)

  • MappingJacksonHttpMessageConverter – JSON λ³€ν™˜ (Jackson이 클래슀 κ²½λ‘œμ—μžˆλŠ” κ²½μš°μ—λ§Œ 좔가됨)

  • AtomFeedHttpMessageConverter – Atom ν”Όλ“œλ₯Ό λ³€ν™˜ν•©λ‹ˆλ‹€ (Rome이 클래슀 κ²½λ‘œμ—μžˆλŠ” κ²½μš°μ—λ§Œ 좔가됨).

  • RssChannelHttpMessageConverter – RSS ν”Όλ“œλ₯Ό λ³€ν™˜ν•©λ‹ˆλ‹€ (Rome이 클래슀 κ²½λ‘œμ—μžˆλŠ” κ²½μš°μ—λ§Œ 좔가됨).

μŠ€ν”„λ§ λΆ€νŠΈλŠ” Jackson2ObjectMapperBuilderλ₯Ό JacksonAutoConfigurationν΄λž˜μŠ€μ—μ„œ μžλ™μœΌλ‘œ μ„€μ •ν•˜κΈ° λ•Œλ¬Έμ— 별닀λ₯Έ μ„€μ • 없이 ObjectMapperλ₯Ό μ΄μš©ν•΄ JSONν˜•νƒœλ₯Ό λ³€ν™˜ν•  μˆ˜μžˆλ‹€.

spring-boot-start-web에 jackson-databindκ°€ μžλ™μœΌλ‘œ μ˜μ‘΄μ„±μ΄ μž‘νžŒκ²ƒμ„ λ³Ό 수 μžˆλ‹€.

@RestContoller

@ResponseBodyλ₯Ό λͺ¨λ“  λ©”μ†Œλ“œμ— μ μš©ν•œ 것과 λ™μΌν•œ 효과

클래슀

ResponseEntity

Spring framworkλŠ” HttpEntityλΌλŠ” 클래슀λ₯Ό μ œκ³΅ν•˜λŠ”λ° μ΄λŠ” response/request의 HttpHeader와 HttpBodyλ₯Ό ν¬ν•¨ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.

HttpEntityλ₯Ό 상속받아 Response에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄을 λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.

status, header, body 뢀뢄을 μˆ˜μ •/μ‚½μž…ν•˜μ—¬ 응닡헀더λ₯Ό 보낼 수 있게 ν•΄μ€€λ‹€.

λ©”μ„œλ“œ

  • build() : build λ‚΄ parameter둜 아무것도 μž…λ ₯을 μ•ˆν•  μ‹œ null인 body의 res λ°˜ν™˜ν•œλ‹€.

    parameter둜 bodyλ₯Ό 받을 수 μžˆλ‹€.


Reference

https://www.baeldung.com/spring-httpmessageconverter-rest

Last updated