์ „์ฒด ๊ธ€

https://school.programmers.co.kr/learn/courses/30/lessons/1835 ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”. programmers.co.kr ๋ฌธ์ œ ๋ฌธ์ œ ์„ค๋ช… ๊ฐ€์„์„ ๋งž์•„ ์นด์นด์˜คํ”„๋ Œ์ฆˆ๋Š” ๋‹จ์ฒด๋กœ ์†Œํ’์„ ๋– ๋‚ฌ๋‹ค. ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ณ  ๋งˆ์ง€๋ง‰์— ๋‹จ์ฒด์‚ฌ์ง„์„ ์ฐ๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ ์•ž์— ์ผ๋ ฌ๋กœ ๋‚˜๋ž€ํžˆ ์„ฐ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฐ์น˜๊ฐ€ ๋ชจ๋‘ ๋‹ฌ๋ผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์„ค์ง€ ์ •ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ๋„ค์˜ค๋Š” ํ”„๋กœ๋„์™€ ๋‚˜๋ž€ํžˆ ์„œ๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ , ํŠœ๋ธŒ๊ฐ€ ๋ฟœ์€ ๋ถˆ์„ ๋งž์€ ์ ์ด ์žˆ๋˜ ๋ผ์ด์–ธ์€ ํŠœ๋ธŒ์—๊ฒŒ์„œ ์ ์–ด๋„ ์„ธ ์นธ ์ด์ƒ ๋–จ์–ด์ ธ์„œ ์„œ๊ธฐ๋ฅผ ์›ํ–ˆ๋‹ค. ์‚ฌ์ง„์„ ์ฐ๊ณ  ๋‚˜์„œ ๋Œ์•„์˜ค..
REST API ๋Œ€์ค‘์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ณ  ์ž์›์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ REST ๋ž€ ? "Representational State Transfer"์˜ ์•ฝ์ž๋กœ, ์›”๋“œ ์™€์ด๋“œ ์›น(WWW)๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹ ์ฃผ๊ณ  ๋ฐ›๋Š” ์ž์›(Resource)์— ์ด๋ฆ„์„ ๊ทœ์ •ํ•˜๊ณ  URI์— ๋ช…์‹œํ•ด HTTP ๋ฉ”์„œ๋“œ (GET, POST, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธ REST API ๋ž€ ? API : Application Programming Interface, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜๋ฏธ - API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ - โœ… ์ฆ‰, REST API๋Š”..
์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹  ์–ด๋–ค ํฌํ„ธ ์‚ฌ์ดํŠธ๋ฅผ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ๊ฐ€์ •. ์ฆ‰, ๋ธ”๋กœ๊ทธ, ์นดํŽ˜, ๋ฉ”์ผ ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ†ตํ•ฉ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ๋งˆ๋‹ค '์‚ฌ์ดํŠธ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.' ํŒป๋ง์„ ๊ฑธ๊ณ  ์ž‘์—…ํ•ด์•ผํ•จ ๊ทธ๋งŒํผ ๊ฐœ๋ฐœ์— ๋ณด์ˆ˜์ ์ธ ์ž…์žฅ์„ ์ทจํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ณ , ์„œ๋น„์Šค ์ž์ฒด์˜ ๊ทœ๋ชจ๋„ ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋™ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๋„ ๊ธธ์–ด์ง → ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MSA; Microservice Architecture) → ์„œ๋น„์Šค ๊ทœ๋ชจ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•œ ์•„ํ‚คํ…์ณ ์•ž์„  ์˜ˆ๋กœ ๋“  ํฌํ„ธ ์‚ฌ์ดํŠธ์— ์ ์šฉํ•œ๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๊ณ  ๋ธ”๋กœ๊ทธ ํ”„๋กœ์ ํŠธ, ์นดํŽ˜ ํ”„๋กœ์ ํŠธ, ๋ฉ”์ผ ํ”„๋กœ์ ํŠธ ..
๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (AOP; Aspect-Oriented Programming) ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฌถ์–ด ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธ โ€ผ๏ธ ์—ฌ๊ธฐ์„œ ๊ด€์ (aspect)์ด๋ž€ ?? → ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ทธ ๊ธฐ๋Šฅ์„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ๊ฐ๊ฐ์„ ํ•˜๋‚˜์˜ ๊ด€์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๋ชฉ์  ๊ธฐ๋Šฅ์„ ๋งํ•จ ์˜ˆ) ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ƒํ’ˆ ์ •๋ณด ๋“ฑ๋ก ์š”์ฒญ์„ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ , ๊ทธ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด โถ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ , โท ์ €์žฅ๋œ ์ƒํ’ˆ ์ •๋ณด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ : ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ƒํ™ฉ์ด ์ƒ๊น€. ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ..
์˜์กด์„ฑ ์ฃผ์ž… (DI; Dependency Injection) ์ œ์–ด์˜ ์—ญ์ „ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธ ์Šคํ”„๋ง์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ• ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ํ•„๋“œ ๊ฐ์ฒด ์„ ์–ธ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์Šคํ”„๋ง์—์„œ๋Š” @Autowired๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Œ 1. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… @RestController public class DIController{ MyService myService; @Autowired public DIController(MyService myService){ this.myService = myService; } @GetMappi..
์ œ์–ด์˜ ์—ญ์ „ IoC ( Inversion of Control ) ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ ์‚ฌ์šฉ @RestController public class NoDIController{ private MyService service = new MyServiceImpl(); @GetMapping("/no-di/hello") public String getHello(){ return service.getHello(); } }์ฆ‰, ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•œ ํ›„ ๊ฐ์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ตฌ์กฐ ํ•˜์ง€๋งŒ, ์ œ์–ด์˜ ์—ญ์ „(IoC)์„ ํŠน์ง•์œผ๋กœ ํ•˜๋Š” ์Šคํ”„๋ง์€ ๊ธฐ์กด ์ž๋ฐ” ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ Io..
๊ฐ์ฒด ์ง€ํ–ฅ ํŠน์ง• ์ถ”์ƒํ™” ์บก์Šํ™” ์ƒ์† ๋‹คํ˜•์„ฑ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ น์–ด ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋‹จ์œ„, ์ฆ‰ "๊ฐ์ฒด"๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ. ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ (ํ˜‘๋ ฅ) ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋จ. ์œ ์—ฐํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ์šฉ์ด ? ๋ ˆ๊ณ  ๋ธ”๋Ÿญ ์กฐ๋ฆฝํ•˜๋“ฏ์ด ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ์ปดํ“จํ„ฐ ๋ถ€ํ’ˆ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋‹คํ˜•์„ฑ ๋‹คํ˜•์„ฑ์˜ ์‹ค์„ธ๊ณ„ ๋น„์œ  ์‹ค์„ธ๊ณ„์™€ ๊ฐ์ฒด ์ง€ํ–ฅ์„ 1:1๋กœ ๋งค์นญ X ๊ทธ๋ž˜๋„ ์‹ค์„ธ๊ณ„์˜ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์ข‹์Œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„..
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ•ต์‹ฌ ๊ธฐ์ˆ  : ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ, AOP, ์ด๋ฒคํŠธ, ๊ธฐํƒ€ ์›น ๊ธฐ์ˆ  : ์Šคํ”„๋ง MVC, ์Šคํ”„๋ง WebFlux ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ  : ํŠธ๋žœ์žญ์…˜, JDBC, ORM ์ง€์›, XML ์ง€์› ๊ธฐ์ˆ  ํ†ตํ•ฉ : ์บ์‹œ, ์ด๋ฉ”์ผ, ์›๊ฒฉ์ ‘๊ทผ, ์Šค์ผ€์ค„๋ง ํ…Œ์ŠคํŠธ : ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์› ์–ธ์–ด : ์ฝ”ํŠธ๋ฆฐ, ๊ทธ๋ฃจ๋น„ ์ตœ๊ทผ์—๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ์ˆ ๋“ค์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํ”„๋ง์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›, ์ตœ๊ทผ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑ Tomcat ๊ฐ™์€ ์›น ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋จ ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ ์ œ๊ณต ์Šคํ”„๋ง๊ณผ 3rd parth(์™ธ๋ถ€) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ๊ตฌ์„ฑ ๋ฉ”ํŠธ๋ฆญ, ์ƒ..
KIMHYEYUN
๐Ÿ’