Home > Archive > Spring & Spring Boots > πŸƒ[Spring] API

πŸƒ[Spring] API
Spring Framework

API

@ResponseBody 문자 λ°˜ν™˜

@Controller
public class HelloController {
    
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
}
  • @ResponseBodyλ₯Ό μ‚¬μš©ν•˜λ©΄ λ·° 리쑸버('viewResolver')λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
    • λŒ€μ‹  HTTP의 BODY에 문자 λ‚΄μš©μ„ 직접 λ°˜ν™˜ν•©λ‹ˆλ‹€(HTML BODY TAGλ₯Ό λ§ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.)

μ‹€ν–‰
http://localhost:8080/hello-string?name=spring

@ResponseBody 객체 λ°˜ν™˜

@Controller
public class HelloController {
    
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
    
    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
  • @ResponseBodyλ₯Ό μ‚¬μš©ν•˜μš”, 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ 객체가 JSON으둜 λ³€ν™˜λ©λ‹ˆλ‹€.

μ‹€ν–‰

  • http://localhost:8080/hello-api?name=spring

@ResponseBody μ‚¬μš© 원리

  1. μ›Ή λΈŒλΌμš°μ €μ—μ„œ localhost:8080/hello-api 둜 접속을 μ‹œλ„ν•©λ‹ˆλ‹€.
  2. ν†°μΌ“ λ‚΄μž₯ μ„œλ²„μ—μ„œ β€œhello-api κ°€ 왔어” ν•˜κ³  μŠ€ν”„λ§μ— λ˜μ§‘λ‹ˆλ‹€.
  3. μŠ€ν”„λ§μ€ β€œhello-api κ°€ μžˆλ„€?! μ–΄? 근데 @RespinseBody μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆλ‹€!!” ν•˜κ³  μΈμ‹ν•©λ‹ˆλ‹€.
    • 이런 μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆμ§€ μ•Šμ•˜λ‹€λ©΄ viewResolverμ—κ²Œ λ˜μ§‘λ‹ˆλ‹€. -> β€œλ‚˜μ—κ²Œ λ§žλŠ” ν…œν”Œλ¦Ώμ„ μ°Ύμ•„ λŒλ €μ€˜β€
    • @ResponsBodyκ°€ μžˆλ‹€λ©΄ HTTP 응닡에 κ·ΈλŒ€λ‘œ λ„˜κ²¨μ•Όκ² λ‹€ ν•˜κ³  λ™μž‘ν•©λ‹ˆλ‹€.
      • μ—¬κΈ°μ„œ λ¬Έμžκ°€ 였면 λ°”λ‘œ 문자λ₯Ό λŒλ €μ€λ‹ˆλ‹€.
      • ν•˜μ§€λ§Œ 객체가 였면 κΈ°λ³Έ λ””ν΄νŠΈμΈ JSON λ°©μ‹μœΌλ‘œ 데이터λ₯Ό λ§Œλ“€μ–΄μ„œ HTTP 응닡에 λ°˜ν™˜ν•©λ‹ˆλ‹€. -> κΈ°λ³Έ μ •μ±…
  4. @ResponseBody return: hello(name: spring)은 객체λ₯Ό λ„˜κ²¨μ€λ‹ˆλ‹€. 그러면 β€œHttpMessageConverterβ€œ κ°€ λ™μž‘ν•©λ‹ˆλ‹€.
  5. λ§Œμ•½ λ°˜ν™˜ν•˜λŠ” 아이가 λ‹¨μˆœ 문자일 경우 β€œStringConverterβ€œ κ°€ λ™μž‘ν•©λ‹ˆλ‹€.
  6. 그게 μ•„λ‹ˆκ³  λ°˜ν™˜ν•˜λŠ” 아이가 객체일 경우 β€œJsonConverterβ€œ κ°€ λ™μž‘ν•©λ‹ˆλ‹€.
  7. κ²°κ΅­ JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•œ 것을 μš”μ²­ν•œ μ›Ή λΈŒλΌμš°μ €μ—κ²Œ λ³΄λ‚΄μ€λ‹ˆλ‹€.

정리

  • @ResponseBodyλ₯Ό μ‚¬μš©
    • HTTP의 BODY에 문자 λ‚΄μš©μ„ 직접 λ°˜ν™˜
    • viewResolver λŒ€μ‹ μ— httpMessageConverterκ°€ λ™μž‘
    • κΈ°λ³Έ 문자처리: StringHttpMessageConverter
    • κΈ°λ³Έ 객체처리: MappingJackson2HttpMessageConverter
    • byte 처리 λ“±λ“± 기타 μ—¬λŸ¬ HttpMessageConverterκ°€ 기본으둜 λ“±λ‘λ˜μ–΄ 있음

μ°Έκ³ : ν΄λΌμ΄μ–ΈνŠΈ HTTP Accept 헀더와 μ„œλ²„μ˜ 컨트둀러 λ°˜ν™˜ νƒ€μž… 정보 듀을 μ‘°ν•©ν•΄μ„œ HttpMessageConverterκ°€ μ„ νƒλ©λ‹ˆλ‹€.