์ด์ ๊ธ ๋ณด๋ฌ๊ฐ๊ธฐ
https://sectumsempra.tistory.com/119
์ด๋ฒ ๊ธ์์๋ 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์ด๋ค.
๊ทธ๋ผ ์์กด์ฑ ์ฃผ์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ๋ณด๋๋ก ํ์.
- Spring์ ์ํด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ฒ๋ Annotation์ ์ค์ ํ๋ค.
- ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๋งด๋ฒ ๋ณ์์ ์์ฑ์์ ์ถ๊ฐํ๋ค
- ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
RequestMapping
์ด์ @RequestMapping์ ๋ํด ์์๋ณด๋๋ก ํ์. Spring Controller์ ์๋ ๋ฉ์๋๋ค์ URI์ ๋ฐ๋ผ ํธ์ถ์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ RequestMapping Annotaion์ URI Path ์ ๋ณด๋ฅผ ๋ช ์ํด์ผํ๋ค.
//http://localhost:9000/user
@RequestMapping(value = "/user")
๋น์ฐํ ํ ๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ 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...์ ํํ๋ก ์์ฑ๋๋ค. ์ฌ์ฉ ์์๋ ์๋์ ๊ฐ๋ค.
์์์ ์ฌ์ฉ๋ @RequestParam์ ์์๋ค์ ์๋ 3๊ฐ์ง๊ฐ ์๋ค.
name : query string์ key, key์ ๋ณ์๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ ์๋ต ๊ฐ๋ฅ
required : ํ์ ์ฌ๋ถ (true/false)
defaultValue : ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๊ฐ
2 . PathVariable
URI์ ์ผ๋ถ๋ก ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฌ์ฉํ๋ค. ์ฌ์ฉ ์์๋ ์๋์ ๊ฐ๋ค. ๋ค๋ง ์ ํ์ ๋ฐ์ดํฐ(์ฃผ์ด์ง ์๋, ์ฃผ์ด์ง์ง ์์ ์๋ ์๋ ๋ฐ์ดํฐ)์ ๊ฒฝ์ฐ์๋ ์ฃผ๋ก Query String์ผ๋ก ์ฒ๋ฆฌํ๋ค.
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/
๋๊ธ