๐Ÿ ๊ธฐํƒ€/์ฝ”๋“œํ”„๋ ˆ์†Œ ์ฒดํ—˜๋‹จ_BE

[Spring Boot] ์ปจํŠธ๋กค๋Ÿฌ์™€ REST API

Dhey 2022. 1. 29. 03:35
๋ฐ˜์‘ํ˜•
Spring Boot

Spring Framework๋ฅผ ๋ณด๋‹ค ์†์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ 

 

- Spring Framework๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

- ์„ค์ •, ์˜์กด์„ฑ ๊ด€๋ฆฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง, ์„œ๋ฒ„์˜ ์‹คํ–‰ ๋“ฑ์„ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

* Spring Boot์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  - ์„ค์ • ๊ฐ„ํŽธํ™”๋ฅผ ์œ„ํ•œ Auto Configuration

  - ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Starter Project

  - ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„์†Œํ™”๋ฅผ ์œ„ํ•œ Embedded WAS

  - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ Actuator

 

 


 

* SW ์•„ํ‚คํ…์ณ๋ž€?

  : SW์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์œผ๋กœ SW๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฃผ์š” ์š”์†Œ๋“ค๊ณผ ์š”์†Œ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ ๊ฒƒ

 

 

๊ทธ ์ค‘ ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ธ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ณ ํŒจํ„ด์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

 

๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ณ ํŒจํ„ด์€ SW๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋Š” 3~4๊ฐœ์˜ ๊ณ„์ธต์œผ๋กœ ๊ตฌ๋ถ„ํ•œ ํŒจํ„ด์ด๋‹ค.

  - Presentation Layer

  - Application Layer

  - business Layer

  - Data Access Layer

๋˜ํ•œ ์ด ํŒจํ„ด์€ ๊ณ„์ธต ๊ฐ„์— ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ํ˜‘๋ ฅํ•˜์—ฌ ์ „์ฒด ์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

 

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด

Spring Boot Application๊ณผ DB์™€์˜ ๊ตฌ์กฐ

Client์—์„œ ์š”์ฒญํ•˜๋ฉด ๊ทธ ์š”์ฒญ์„ ์ฒ˜์Œ ๋ฐ›๋Š” ๊ณ„์ธต์€ Presentation Layer์ด๋‹ค.

→ ๊ทธ๋ฆฌ๊ณ  Application Layer๋กœ, ๋˜ Data Access Layer๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•œ ํ›„ Data Access Layer๋Š” DB์— ์ ‘๊ทผํ•œ๋‹ค.

 ๊ทธ ๋‹ค์Œ DB์—์„œ Database๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ Database๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ Data Access Layer → Application Layer → Presentation Layer๋กœ ์ „๋‹ฌํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ Client์—๊ฒŒ ์ „๋‹ฌ ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

Spring Boot์—์„œ๋Š” Presentation Layer๋Š” Controller, Application Layer๋Š” Service, Data Access Layer๋Š” Repository๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์‚ฌ์šฉ ๋œ๋‹ค.

 

๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ์ฑ…์ž„๊ณผ ์—ญํ• 

 

  


 

Spring Controller

 - ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ณ์˜ Presentation Layer์— ํ•ด๋‹นํ•œ๋‹ค.

 - Client์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ , Application Layer ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋ฉฐ, Client์— ์ตœ์ข… ์‘๋‹ต์„ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

 

 

Spring Controller๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๊ฐœ์˜ ๊ธฐ๋ณธ Annotation์ด ์‚ฌ์šฉ ๋œ๋‹ค.

  1. @Controller,   2. @RestController

    → Controller ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํด๋ž˜์Šค ์ƒ๋‹จ์— ๋ช…์‹œํ•œ๋‹ค.

  3. @RequestMapping

    → ํŠน์ • Request๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์†Œ๋“œ ์ƒ๋‹จ์— ๋ช…์‹œํ•œ๋‹ค.

Annotation์ด ๋ถ€์ฐฉ ๋œ ์ฝ”๋“œ๋“ค์€ Spring Famework์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ, Spring Framework์— ์˜ํ•ด์„œ ํŠน์ •ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

* Annotataion์ด๋ž€?
  → Java ์†Œ์Šค์ฝ”๋“œ์— ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, @๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ, ๋ฉค๋ฒ„๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์— ๋ถ€์ฐฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  · Annotation์˜ 3๊ฐ€์ง€ ์œ ํ˜•

    - ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    - SW ํˆด์— ์˜ํ•ด ์‚ฌ์šฉ๋˜์–ด ์ฝ”๋“œ ์ƒ์„ฑ์ด๋‚˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
    - run-time ์‹œ ํŠน์ • ๋™์ž‘์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

* Spring Framework๋ž€?
  → ์•ฝ์†๋œ Annotation์„ ์ธ์‹ํ•˜์—ฌ ํŠน์ •์ ์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

 

โ€ป @Controller  VS  @RestController

  · ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ํ•˜๋Š” ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ๋™์ž‘์€ ์œ ์‚ฌํ•˜๋‹ค.

     But, ์‘๋‹ตํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

      - Controller: view๋ฅผ ์‘๋‹ต(html ํŒŒ์ผ ๋“ฑ)

      - RestController: data๋ฅผ ์‘๋‹ต(๋ฌธ์ž์—ด, Json, xml ๋“ฑ)

์™ผ) @RestController / ์˜ค) @Controller

@RestController๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์‘๋‹ต๋ฐ›๊ณ , 

@Controller์—์„œ ๋ฌธ์ž์—ด "hello"๋Š” htmlํŒŒ์ผ(view)์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•˜์—ฌ hello.html์ด๋ผ๋Š” ๋ฌธ์„œ๊ฐ€ ์‘๋‹ต๋˜์—ˆ๋‹ค

 

 

โ€ป @RequestMapping

  · @RequestMapping์ด ๋ถ™์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋Š” Client์˜ ํŠน์ • ์š”์ฒญ์ด ์™”์„ ๋•Œ Spring Framework์— ์˜ํ•ด ํ˜ธ์ถœ ๋œ๋‹ค.

 

 

๊ทธ๋Ÿผ RequestMapping์ด ๋ถ™์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ผ ๋•Œ๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ๊นŒ?

 

Spring Controller์˜ ๋ฉ”์†Œ๋“œ๋“ค์€ URI์— ๋”ฐ๋ผ ํ˜ธ์ถœ์ด ๊ฒฐ์ •๋œ๋‹ค. 

(URI(Uniform Resource Identifier)๋Š” URL๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ํŠน์ •ํ•œ ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„ ๋˜๋Š” ์ฃผ์†Œ๋ฅผ ๋งํ•œ๋‹ค.)

๊ธฐ๋ณธ ๋„๋ฉ”์ธ์— ์ด์–ด์ง€๋Š” '/path' ๋“ค์— ์˜ํ•ด ๊ฒฐ์ •์ด ๋œ๋‹ค. (ex. http://localhose:8080/user)

RequestMapping Annotation์— URI Path ์ •๋ณด๋ฅผ ๋ช…์‹œํ•œ๋‹ค. → ex. @RequestMapping(value = "/user")

 

๋”ฐ๋ผ์„œ

๊ธฐ๋ณธ ๋„๋ฉ”์ธ์— ์ด์–ด์ง€๋Š” /๋’ค์— path ์ •๋ณด์— ์˜ํ•ด ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ Spring Framework๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค.

 

 

* URI (Uniform Resource Identifier)
  URI๋Š” ์š”์ฒญํ•˜๋Š” ์ž์›์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ด๋ฆ„์„ ์ •ํ•œ๋‹ค.
   - www.codepresso-blog.com/user   → user์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„
   - www.codepresso-blog.com/posts  →  ๊ธ€ ๋ชฉ๋ก ๋“ฑ์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„ ๋“ฑ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ด๋ฆ„์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

  ๋˜ํ•œ ๊ณ„์ธต ๊ด€๊ณ„๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ' / '๋กœ ๊ณ„์ธต์„ ๊ตฌ๋ถ„ํ•œ๋‹ค.
   - www.codepresso-blog.com/user/paid 
   - www.codepresso-blog.com/user/enterprise ๋“ฑ  

  Naming ๊ทœ์•ฝ
   - ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ช…์‚ฌ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋‚Ÿ.
   - ๋‘ ๋‹จ์–ด ์ด์ƒ ์—ฐ๊ฒฐ ๋  ๊ฒฝ์šฐ ' - '๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
   - ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.

 

 

โ€ป HTTP API vs REST API

  - HTTP API

    : HTTP(s)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›๊ฒฉ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ API

  - REST API (REpresentational State Transfer API)

    : Roy Fielding์ด ์ €์ˆ ํ•œ ๋…ผ๋ฌธ์— ์†Œ๊ฐœ๋œ ๊ฐœ๋…์œผ๋กœ, ์›น ์ƒ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ

 

   @RestController Annotation์€ REST API, HTTP API๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๊ณ , ํด๋ž˜์Šค ๋‚ด์— @RequestMapping์ด ๋ถ™์€ ๊ฐœ๋ณ„ ๋ฉ”์†Œ๋“œ๋“ค์ด ํ•˜๋‚˜์˜ REST API, HTTP API์ด๋‹ค.

 

 


 

" Request ํŒŒ๋ผ๋ฏธํ„ฐ "

 

  Client๊ฐ€ Server์— ์š”์ฒญ(Request)์„ ํ•  ๋•Œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ

    Spring Framework๋Š” Request ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ (@Request Mapping์ด ๋ถ™์€)๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ €์žฅํ•œ๋‹ค

 

 

RequestํŒŒ๋ผ๋ฏธํ„ฐ๋Š” 2๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ๋‹ค.

1. Query String

  - URI์™€ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

    ( URI์— ์ด์–ด์ง€๋Š” '?' ๋’ค์— key1=value1&key2=value2&··· ํ˜•ํƒœ๋กœ ์ž‘์„ฑ ๋จ)

  - key๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„, value๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’

    (ex. https://www.google.com/search ?q=codepresso&sourceid=chrome&ie=UTF-8)

  - ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— @RequestParam Annotation์„ ์‚ฌ์šฉํ•œ๋‹ค.

  - name ์š”์†Œ๋Š” Query String์— key์— ๋งคํ•‘๋œ๋‹ค.

 

 

  * @RequestParam์˜ ์š”์†Œ

    - name: Query string์˜ key์ด๋‹ค. key์™€ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์„ ๊ฒฝ์šฐ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    - required: ํ•„์ˆ˜ ์—ฌ๋ถ€

    - defaultValue: ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์„ธํŒ…๋˜๋Š” ๊ธฐ๋ณธ ๊ฐ’

 

 

2. Path Parameter

  - URI์˜ ์ผ๋ถ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

    (domain/user/1 ,   domain/user/3/post/27  →  ํŒŒ๋ž€์ˆซ์ž๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’)

    ( ex. http://brunch.co.kr/@thinkabout/199

         → @~๋Š” user์˜ ๊ณ„์ •, 199๋Š” ๊ณ„์ •์˜ ๊ธ€ id๋กœ thinkabout user์˜ 199๋ฒˆ ๊ธ€์„ ์š”์ฒญํ•œ๋‹ค๋Š” ์˜๋ฏธ )

{ }๋กœ Path ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œํ•จ

  - @RequestMapping value URI์— { }๋กœ Path Param์ž„์„ ํ‘œ์‹œํ•œ๋‹ค.

  - ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— @PathVariable Annotation์„ ์‚ฌ์šฉํ•œ๋‹ค.

  - ์„ ํƒ์  ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ์—๋Š” Path Param์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  - ์œ„ ์˜ˆ์ œ๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด 

     http://localhost:8080/user/admin/id/100  →  ์ถœ๋ ฅ๊ฐ’: You requested admin-100 user

 

โ€ป Path Parameter vs Query String ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?
  - ์ผ๋ฐ˜์ ์ธ ์ถ”์ฒœ ์‚ฌํ•ญ
    (Path Param: ํŠน์ • ์ž์›์„ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, Query String: ์ž์›์— ๋Œ€ํ•œ ์ •๋ ฌ์ด๋‚˜ ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ)
      → ex. https://codepresso.kr/courses/spring?order=latest
  - ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๋Š” Path Param์œผ๋กœ, ์„ ํƒ์  ๋ฐ์ดํ„ฐ๋Š” Query String์„ ์‚ฌ์šฉํ•˜๋ผ
    (Path Param์ด ํฌํ•จ ๋œ URI๋Š” Client๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๋น„์šฉ์ด ๋†’์ง€๋งŒ,
     Query String์€ ์ƒ๋Œ€์ ์œผ๋กœ ํŽธํ•˜๊ฒŒ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค)

 

 

โ‰ซ Tip
- spring initializr

    : Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•˜๋Š” ์‚ฌ์ดํŠธ

 

 


 

์ฝ”๋“œํ”„๋ ˆ์†Œ Java ์›น ๊ฐœ๋ฐœ ์ฒดํ—˜๋‹จ ํ™œ๋™ ์ค‘ 'Spring Boot ์›น ๊ฐœ๋ฐœ ์ž…๋ฌธ' ์ด๋Ÿฌ๋‹ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :)
์ฝ”๋“œํ”„๋ ˆ์†Œ URL: https://www.codepresso.kr/

 

ํ”„๋ฆฌ๋ฏธ์—„ IT ๊ต์œก ์„œ๋น„์Šค - ์ฝ”๋“œํ”„๋ ˆ์†Œ

 

www.codepresso.kr

๋ฐ˜์‘ํ˜•