๋Œ€์™ธํ™œ๋™/CodePresso

์ฝ”๋“œํ”„๋ ˆ์†Œ ์ฒดํ—˜๋‹จ 6-2 : Spring Boot ์›น ๊ฐœ๋ฐœ ์ž…๋ฌธ

kite707 2022. 2. 4.

์ด์ „ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

https://sectumsempra.tistory.com/119

 

์ฝ”๋“œํ”„๋ ˆ์†Œ ์ฒดํ—˜๋‹จ 6-1 : Spring Boot ์›น ๊ฐœ๋ฐœ ์ž…๋ฌธ

์ด๋ฒˆ ๊ฐ•์˜์—์„œ๋Š” ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ๊ธฐ์ดˆ์ ์ธ ์ง€์‹๊ณผ Spring Boot์˜ ๊ฐ„๋‹จํ•œ ์ด๋ก ๊ณผ ์‹ค์Šต์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ๋‚ด์šฉ์ด ๋งŽ์•„ 2๊ฐœ์˜ ๊ธ€์— ๋‚˜๋ˆ ์„œ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. IP์™€ Port์˜ ๊ฐœ๋… ์ผ๋ฐ˜์ ์œผ๋กœ Client, ์ฆ‰

sectumsempra.tistory.com

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring Bean๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ์ „ ๊ธ€์—์„œ ๋‹ค๋ฃฌ Spring Controller์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ž‘์„ฑํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ API ๋ฌธ์„œ์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

Spring Bean๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…

ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ(ํด๋ž˜์Šค, ํŒจํ‚ค์ง€ ๋“ฑ)์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜์กด์„ฑ(Dependency)๋ผ๊ณ  ํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜์— new๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์™ธ๋ถ€์—์„œ ๋Œ€์‹  ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ™œ์šฉํ•  ํด๋ž˜์Šคํƒ€์ž…์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋งŒ ์„ ์–ธํ•˜๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ฆ‰ new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ง์ ‘ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ Spring Framework๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ’ก Spring Framework๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠน์ • ์กฐ๊ฑด

1. ํด๋ž˜์Šค ์ƒ๋‹จ์˜ Annotation(@Controller, @RestController, @Service ๋“ฑ)
2. @Configuration ํด๋ž˜์Šค์˜ @Bean Annotation
3. XML์„ค์ •

์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•  ๋Œ€์ƒ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์„ Component Scan์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

Spring Framework๊ฐ€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ผ์–ด๋‚˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ 2๊ฐ€์ง€์˜ ๊ฐœ๋…์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. Spring IoC์ปจํ…Œ์ด๋„ˆ์™€ Spring Bean ์ด๋‹ค. ๋จผ์ € Spring IoC(Inversion of Control)์€ Spring Framework์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์†Œ์Šค์ฝ”๋“œ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. Spring framework๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์„ค์ •ํŒŒ์ผ, ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋Œ€์‹  ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š”๋ฐ spring ioc์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ž‘์—…์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Spring Bean์€ Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋˜์–ด ๊ด€๋ฆฌ๋˜๋Š” Java ๊ฐ์ฒด์ด๋‹ค. ์•ž์—์„œ๋„ new ํ‚ค์›Œ๋“œ ์—†์ด PostService๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฐ์ฒด๊ฐ€ Spring Bean์ด๋‹ค.

 

๊ทธ๋Ÿผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ๋ณด๋„๋ก ํ•˜์ž.

  1. Spring์— ์˜ํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ๋” Annotation์„ ์„ค์ •ํ•œ๋‹ค.
  2. ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋งด๋ฒ„ ๋ณ€์ˆ˜์™€ ์ƒ์„ฑ์ž์— ์ถ”๊ฐ€ํ•œ๋‹ค
  3. ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

RequestMapping

์ด์ œ @RequestMapping์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. Spring Controller์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋“ค์€ URI์— ๋”ฐ๋ผ ํ˜ธ์ถœ์ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— RequestMapping Annotaion์— URI Path ์ •๋ณด๋ฅผ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.

//http://localhost:9000/user
@RequestMapping(value = "/user")

http://localhost:9000/hello ๋กœ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ

http://localhost:9000/bye ๋กœ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ

 

๋‹น์—ฐํžˆ ํ•œ ๊ฐœ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ URI๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค. ์ค‘๋ณต๋  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ ํŠน์ • Controller ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— Path๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ path๋กœ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.

http://localhost:9000/user/paid
http://localhost:9000/user/enterprise
http://localhost:9000/user/administrator

 

์ด์ œ Request ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋ณดํ†ต ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ ๊ทธ๋ƒฅ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์„œ๋ฒ„์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. (๋กœ๊ทธ์ธ์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ID,PW ๋“ฑ) ์ด๊ฒƒ๋“ค์€ Query String ํ˜น์€ Path Variable๋กœ ์„œ๋ฒ„์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1 . Query String

URI ๋’ค์— ์ด์–ด์ง€๋Š” ?๋’ค์— key1=value1&key2=value2...์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋œ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

http://localhost:8080/post?category=it&id=10

์œ„์—์„œ ์‚ฌ์šฉ๋œ @RequestParam์˜ ์š”์†Œ๋“ค์€ ์•„๋ž˜ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

name : query string์˜ key, key์™€ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์„ ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅ
required : ํ•„์ˆ˜ ์—ฌ๋ถ€ (true/false)
defaultValue : ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ฐ’

 

2 . PathVariable

URI์˜ ์ผ๋ถ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ์„ ํƒ์  ๋ฐ์ดํ„ฐ(์ฃผ์–ด์งˆ ์ˆ˜๋„, ์ฃผ์–ด์ง€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ)์˜ ๊ฒฝ์šฐ์—๋Š” ์ฃผ๋กœ Query String์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

http://localhost:9000/user/admin/id/3

 

Request Body

์œ„์˜ Request ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์กฐ๊ธˆ ๋‹ค๋ฅธ Request Data์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์œ„์˜ Query String, Path Variable๋กœ๋Š” ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์–ด๋ ต๋‹ค. (๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ api๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ธ€ ๋‚ด์šฉ์„ ์œ„ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด๋‚ผ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ) ์ด์— Request Body๋ผ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“  api๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๋Š” Postman์œผ๋กœ ํ•˜๋Š”๋ฐ, Postman์—์„œ JSON๋ฐ์ดํ„ฐ๋ฅผ Request Body๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด ์ „๋‹ฌ๋ฐ›์€ JSON๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด์— ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ @RequestBody๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

REST API ๋ฌธ์„œ

API๋ž€ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์†์ด๋‹ค. ์ด๋Ÿฌํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…์„ธํ•œ ๋ฌธ์„œ๋ฅผ API ๋ฌธ์„œ๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ REST API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ REST API๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”๋ฐ ํ•„์ˆ˜๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋‚ด์šฉ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • REST API ์„ค๋ช…
  • URI
  • HTTP Method
  • Request ํŒŒ๋ผ๋ฏธํ„ฐ
  • Response ๋ฐ์ดํ„ฐ
  • ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ ์ฝ”๋“œ ๋ฐ ๋Œ€์‘ ๋ฐฉ๋ฒ•
  • ํ˜ธ์ถœ ์˜ˆ์‹œ

์•„๋ž˜๋Š” ์นด์นด์˜คํ†ก API ๋ฌธ์„œ์ด๋‹ค.

์•„๋ž˜๋Š” ๊ฐ•์˜์—์„œ ์ œ๊ณต๋œ ๋…ธ์…˜์œผ๋กœ ์ž‘์„ฑํ•œ REST API๋ฌธ์„œ์ด๋‹ค.

์ „์ฒด์ ์ธ ํ‹€์€ ๋น„์Šทํ•˜๋‹ˆ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ตฌ์„ฑํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ Java ์›น ๊ฐœ๋ฐœ ์ฒดํ—˜๋‹จ ํ™œ๋™์œผ๋กœ ์ œ๊ณต๋ฐ›์€ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ์—์„œ "Spring Boot ์›น ๊ฐœ๋ฐœ ์ž…๋ฌธ" ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๋งํฌ : https://www.codepresso.kr/ 

๋Œ“๊ธ€