3. ๐ŸŒ API ๋ฐฉ์‹

์œคํ•œ์˜ยท2025๋…„ 4์›” 4์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
4/6
post-thumbnail

API ๋ฐฉ์‹


โš™๏ธ ๋™์ž‘๋ฐฉ์‹

Image

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ์ธํ”„๋Ÿฐ ๊ฐ•์˜(์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ )

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ request๋ฅผ ๋ณด๋ƒ„
  2. ํ†ฐ์ผ“ ์„œ๋ฒ„๊ฐ€ Controller์— ํ•ด๋‹น URL์ด ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ๋งคํ•‘๋œ ๋ฉ”์„œ๋“œ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด ์žˆ์œผ๋ฉด
    โ†’ ViewResolver๊ฐ€ ์•„๋‹Œ HttpMessageConverter๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
  4. ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š”๋ฐ,
    • ๋ฌธ์ž ํ˜•ํƒœ์ด๋ฉด
      • StringConverter๊ฐ€ ์ฒ˜๋ฆฌ (StringHttpMessageConverter)
      • ๋ฌธ์ž ํ˜•ํƒœ ๊ทธ๋Œ€๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜
    • ๊ฐ์ฒด ํ˜•ํƒœ์ด๋ฉด
      • JsonConverter๊ฐ€ ์ฒ˜๋ฆฌ (MappingJackson2HttpMessageConverter)
      • ๊ฐ์ฒด โ†’ JSON ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜


ResponseBody ์‚ฌ์šฉ

  • Http Response Body์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
  • ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹ (ViewResolver ๋Œ€์‹ ์— HttpMessageConverter๊ฐ€ ๋™์ž‘)
  • ๊ธฐ๋ณธ ๋ฌธ์ž์ฒ˜๋ฆฌ: StringHttpMessageConverter
  • ๊ธฐ๋ณธ ๊ฐ์ฒด์ฒ˜๋ฆฌ: MappingJacson2HttpMessageConverter
  • byte ์ฒ˜๋ฆฌ ๋“ฑ๋“ฑ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ HttpMessageConverter๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ

๐Ÿ“ฆ ๊ธฐ๋ณธ ๋™์ž‘ํ•˜๋Š” HttpMessageConverters

ํƒ€์ž…Converter
StringStringHttpMessageConverter
Object (ex. DTO)MappingJackson2HttpMessageConverter
๊ธฐํƒ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋“ฑํ•„์š” ์‹œ ์ถ”๊ฐ€ ๋“ฑ๋ก ๊ฐ€๋Šฅ (ByteArrayHttpMessageConverter ๋“ฑ)


๐Ÿ› ๏ธ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  1. Controller์— ์ฝ”๋“œ ์ถ”๊ฐ€(HelloController.java)
/* 1. API ๋ฐฉ์‹ (๋ฐ˜ํ™˜ ํ˜•์‹์ด ๋ฌธ์ž์ผ ๋•Œ) */
@GetMapping("hello-string")
@ResponseBody       // HTML์ด ์•„๋‹Œ HTTP์—์„œ Head/Body์˜ ๊ทธ body ๋ถ€๋ถ„์— ๋‚ด๊ฐ€ ์ง์ ‘ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ฒ ๋‹ค~ ๋ผ๋Š” ์˜๋ฏธ
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}

/* 2. API ๋ฐฉ์‹ (๋ฐ˜ํ™˜ ํ˜•์‹์ด JSON์ผ ๋•Œ) */
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

static public class Hello {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ํ›„, ๋ฐ˜ํ™˜ ํ˜•์‹์ด ๋ฌธ์ž์ผ ๋•Œ๋ฅผ ๋จผ์ € ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž๋ฉด http://localhost:8080/hello-string?name=์›ํ•˜๋Š”์ด๋ฆ„ ํ˜ธ์ถœ

  2. ๊ฒฐ๊ณผํ™•์ธ
    Image

  3. ๋ฐ˜ํ™˜ ํ˜•์‹์ด ๊ฐ์ฒด์ผ ๋•Œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด, http://localhost:8080/hello-api?name=์›ํ•˜๋Š”์ด๋ฆ„ ํ˜ธ์ถœ

  4. ๊ฒฐ๊ณผํ™•์ธ
    Image


โŒ ํ…Œ์ŠคํŠธ ์ค‘ ๋ฐœ์ƒํ–ˆ๋˜ ์˜ค๋ฅ˜

Spring ๊ฐ•์˜์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ ( class ์•ž์— public ์—†์ด )

/* hello.hello_spring.controller.HelloController.java */

static class Hello {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

hello ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๋ถ€๋ถ„์—์„œ ์‹คํ–‰์€ ๋˜์ง€๋งŒ

Class 'Hello' is exposed outside its defined visibility scope์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’ก ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š”

Spring์ด ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ํด๋ž˜์Šค์˜ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

Spring์—์„œ @ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด(Hello)๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ,

์ด ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š”๊ฒŒ ์œ„์—์„œ ๋งํ•œ Jackson์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.


Jackson์€ ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ,
1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
2. ํ•„๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” Getter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
3. ํด๋ž˜์Šค๊ฐ€ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๊ณ , ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ธ์ง€ ํ™•์ธ์„ ํ•œ๋‹ค.


Spring์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ JSON ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. xmlํ˜•ํƒœ๋„ ์žˆ์ง€๋งŒ




๐Ÿ’ญ ๊ฐ™์ด ๊ณต๋ถ€ํ•ด ๋ณผ ๊ฐœ๋…

โœ… JSON์ด๋ž€?

Java Script Object Notation์˜ ์•ฝ์ž์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ตํ™˜ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ‘œ์ค€์ด๋‹ค.

๊ธฐ๋ณธ ํ˜•ํƒœ

{ key : value }

JSON์˜ ํ˜•ํƒœ๋Š” ํ‚ค(key), ๊ฐ’(value)์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์กฐ์ด๋‹ค. ์ฐธ๊ณ 


โœ… ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ๋ž€?

Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ , ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ฐธ๊ณ 

์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ๋Š”

  • ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ Getter, Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ต์นญํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

  • Spring์—์„œ๋Š” ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํ•„๋“œ์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

  • ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ์˜ ์—ญํ• ๋กœ๋Š”

    • ์บก์Аํ™”
    • ์ ‘๊ทผ ์ œ์–ด
    • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

โœ… JsonConverter? MappingJackson2HttpMessageConverter?๋Š” ๊ฐ™์€ ๊ฒƒ์ผ๊นŒ?

  • JsonConverter๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋… ๋˜๋Š” ์•ฝ์นญ์ด๊ณ ,
  • MappingJackson2HttpMessageConverter๋Š” Spring์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • StringConverter์™€ StringHttpMessageConverter๋„ ๊ฐ™์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€