- ์ด๋ ํ ๋ชฉ์ ์ ์ฝ๊ฒ ๋ฌ์ฑํ ์ ์๋๋ก ํด๋น ๋ชฉ์ ๊ณผ ๊ด๋ จ๋ ์ฝ๋์ ๋ผ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๊ฒ
- ๋ด๊ฐ ํ๋ ์์ํฌ ์์ ์ํ๋ ์ฝ๋๋ฅผ ์ฑ์๋ฃ์ผ๋ฉด ์คํ ํ๋ฆ์ ํ๋ ์์ํฌ๊ฐ ์ฃผ๋ํ๋ค
- ์ฆ ํ๋ ์์ํฌ๊ฐ ์ฝ๋๋ฅผ ํธ์ถ โ ์ ์ด ์ญ์ (IoC)
- ์๋ฅผ ๋ค์ด ์น์ ๋ง๋ค๊ธฐ ์ํด Spring boot๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ URL์ด ์ด๋ค ํจ์์ ์ฐ๊ฒฐ๋๋์ง๋ง ์ ํ๋ค๋ฉด ๋๋จธ์ง์ ํ๋ฆ์ ๋ชจ๋ ํ๋ ์์ํฌ๊ฐ ์์์ ์ฒ๋ฆฌํ๋ค
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค (Application Programming Interface)
- 2๊ฐ ์ด์์ ์ํํธ์จ์ด ์ปจํฌ๋ํธ(๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ์ํํ๋ ์ํํธ์จ์ด ๋ถํ) ์ฌ์ด์์ ์ํธ์์ฉํ ์ ์๋๋ก ์ ์๋ ์ธํฐํ์ด์ค
- ํ๋์ ์ํํธ์จ์ด ์์ ์กด์ฌํ๋ ์ฌ๋ฌ ์ปจํฌ๋ํธ ์ฌ์ด์์ ์ํธ์์ฉ์ด ์ผ์ด๋ ์๋ ์๊ณ (ํจ์ ํธ์ถ), ํ๋์ ์ปดํจํฐ ์์ ์ฌ๋ฌ ์ํํธ์จ์ด ์ปจํฌ๋ํธ ์ฌ์ด์์ ์ํธ์์ฉ์ด ์ผ์ด๋ ์๋ ์๊ณ ์๋ก ๋ค๋ฅธ ์ปดํจํฐ์ ์ปจํฌ๋ํธ ์ฌ์ด์์ ์ํธ์์ฉ์ด ์ผ์ด๋ ์๋ ์๋ค
- ๊ทธ๋ฌ๋ API๋ผ๋ ๋ง์ ์ฃผ๋ก ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฉ๋ฆฌ ๋จ์ด์ง ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๊ณผ ์ํตํ๋ Web API ํธํ์ ์๋ฏธํ๋ค
- ์ํํธ์จ์ด ์ดํ๋ฆฌ์ผ์ด์ ๋ค์ด ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํต์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ง ๊ท์น
- ์คํ๋ง ๋ถํธ์ ๊ฒฝ์ฐ @PostMapping(), @RequestBody, return ๋ฑ์ ์ฌ์ฉํด ํต์ API๋ฅผ ๊ตฌํํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ฐ ์ด๋ ธํ ์ด์ ๋ค๋ก๋ง api๋ฅผ ๋ง๋ค ์ ์๋ ์ด์ ๋ ์ด์ธ ๋ณต์กํ ์ฒ๋ฆฌ๋ค์ ๋ชจ๋ ์คํ๋ง๋ถํธ์์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค
- ๊ฐ๋ฐ์๊ฐ @PostMapping ์ด๋ ธํ ์ด์ ์ ๋ถ์์ ๋ ์คํ๋ง ๋ถํธ๊ฐ ๋ค์์ ํด์ฃผ๋ ์ผ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค
- ๋ด์ฅ ์น ์๋ฒ ์คํ: ํฐ์บฃ(Tomcat) ๊ฐ์ ์น ์๋ฒ๋ฅผ ์๋์ผ๋ก ์คํ์์ผ์ ์ธํฐ๋ท ์์ฒญ์ ๋ฐ์ ์ค๋น๋ฅผ ํ๋ค
- ์์ฒญ ๋ถ์ (๋์คํจ์ฒ ์๋ธ๋ฆฟ): ๋ค์ด์จ HTTP ์์ฒญ์ URL("/hello")๊ณผ ๋ฉ์๋(POST)๋ฅผ ๋ณด๊ณ , ์ด๋ค ์ฝ๋(@PostMapping์ด ๋ถ์ ๋ฉ์๋)์๊ฒ ์ผ์ ์์ผ์ผ ํ ์ง ์ ํํ ์ฐพ์ ์ฐ๊ฒฐํด์ค๋ค
- ๋ฐ์ดํฐ ๋ณํ (JSON โ DTO): @RequestBody๋ฅผ ๋ณด๋ฉด, ์์ฒญ ๋ฉ์์ง์ ๋ด๊ฒจ ์จ JSON ํ์์ ํ ์คํธ๋ฅผ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์๋ฐ ๊ฐ์ฒด(DTO)๋ก ์๋์ผ๋ก ๋ณํํ๋ค โ ์ญ์ง๋ ฌํ(Deserialization)
- ์๋ต ๋ฐ์ดํฐ ๋ณํ (๊ฐ์ฒด โ JSON): ๊ฐ๋ฐ์๊ฐ ๋ฉ์๋์์ ๊ฐ์ฒด(DTO)๋ฅผ returnํ๋ฉด ์ด๊ฒ์ ๋ค์ JSON ํ์์ ํ ์คํธ๋ก ์๋์ผ๋ก ๋ณํํด์ ์๋ต ๋ฉ์์ง์ ๋ด์ ๋ณด๋ธ๋ค โ ์ง๋ ฌํ(Serialization)
์ฆ, ์คํ๋ง๋ถํธ์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๊ฐ์ฅ ์ค์ํ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ๊ณ ๋ฐ๋ณต์ ์ธ ๋คํธ์ํฌ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ๋ณํ ์์ ์ ์คํ๋ง๋ถํธ์๊ฒ ์ผ์ํ๋ค
- ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ํ์ํ ํจ์, ํด๋์ค, ๊ฐ์ฒด๋ค์ ๋ชจ์๋ ๋๊ตฌ๋ค
- ๊ฐ๋ฐ์๋ ํ์ํ ๋ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ง์ ํธ์ถํ์ฌ ์ฌ์ฉํ ์ ์๋ค
- ์ ์ด๊ถ์ด ํญ์ ๊ฐ๋ฐ์์๊ฒ ์๋ค
- ์ ์ด ์ญ์
- ์ ์ด ์ญ์ ์ ์คํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋ = ์์กด์ฑ ์ฃผ์ (DI, Dependency Injection))
- ์์กด์ฑ ์ฃผ์
- ๊ฐ์ฒด๊ฐ ํ์๋ก ํ๋ ๊ฒ(์์กด์ฑ)์ ์ง์ ๋ง๋๋ ๋์ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ
- ์์กด์ฑ์ด๋ ํ ๊ฐ์ฒด๊ฐ ๋์ํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ธ ์์ด์ผ ํจ์ ์๋ฏธํ๋ค
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ํด์๋ ์๋ ์ธ ๊ฐ์ง์ ์กฐ๊ฑด์ด ํ์ํ๋ค
1. ์ฝ๋์๋ ๋ฐํ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์๋๋ค. ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์์ด์ผ ํ๋ค
- ์๋ฅผ ๋ค์ด '์ปคํผ ๋จธ์ ' ํด๋์ค๋ฅผ ์ํด '์๋'๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ ํ ๊ฒฝ์ฐ
- '์๋'๋ผ๋ ์ธํฐํ์ด์ค ์๋ '์๋'๋ฅผ ์์๋ฐ๋ ์ฌ๋ฌ ์๋ ํด๋์ค(์ํฐ์คํผ์ ์๋, ์ผ๋ ์๋ ๋ฑ๋ฑ)๋ฅผ ์์ฑํ๋ค
- ์ปคํผ ๋จธ์ ํด๋์ค๋ ์ธํฐํ์ด์ค '์๋'๋ฅผ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ์ฌ์ฉํ๋ค
public class CoffeeMachine {
// ์ธํฐํ์ด์ค ์์ ์ฑ์์ง๋ ๊ฐ์ฒด๋ ์ธ๋ถ์์ ๋ง๋ค์ด์ ธ ์ฃผ์
๋จ(์์กด์ฑ ์ฃผ์
)
private CoffeeBean coffeeBean;
// ์์ฑ์๋ฅผ ํตํด ์ธ๋ถ์์ ์ฃผ์
๋ฐ์
public CoffeeMachine(CoffeeBean coffeeBean) {
this.coffeeBean = coffeeBean;
}
// coffeeBean์ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๊ฒฝ์ฐ coffeeBean ์ข
๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋จ
// ๊ทธ๋ฌ๋ CoffeeMachine์ ์ธํฐํ์ด์ค ๊ฐ์ฒด ์์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฌ ์ง ์ ์ ์๊ณ ์ ํ์๋ ์์
public void brew() {
coffeeBean.brew();
}
}- ์์ ์ปคํผ ๋จธ์ ์์ ์ด๋ค ์๋๋ฅผ ์ฌ์ฉํ ์ง๋ ์ปจํ ์ด๋(์ 3์)๊ฐ ๊ฒฐ์ ํ๋ค
- ์คํ๋ง ๋ถํธ๊ฐ ์คํ๋ ๋ ์ปจํ ์ด๋๋ @Component, @Service ๋ฑ์ ์คํ๋ง Bean ๊ด๋ จ ์ด๋ ธํ ์ด์ ๋ค์ด ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํ ๋ค ํ์ํ ๋ถํ๋ค์ ๋ฏธ๋ฆฌ ๋ค ๋ง๋ค์ด๋๋ค
- ์์์ ์ปจํ ์ด๋๊ฐ ์์ฑํ ๋ถํ๋ค์ CoffeeMachine ํด๋์ค์ ์ธ๋ถ(์ปจํ ์ด๋)๋ก ๋ถํฐ ์ฃผ์ ๋๋ค
- ์ฃผ์ ์ ์ํ ์ด๋ ธํ ์ด์ ์ @Autowired
- ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ์์๋ ๋ํ์ ์ผ๋ก 3๊ฐ์ง๊ฐ ์๋ค
- ์์ฑ์ ์ฃผ์ : ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์์ฑ์๋ฅผ ํตํด ์ฃผ์ . ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๋ค (์์ฑ์๊ฐ ํ๋์ธ ๊ฒฝ์ฐ @Autowired ์๋ต ๊ฐ๋ฅ/๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ์)
- ์์ ์ ์ฃผ์ : ์ธํฐ์ ๊ฐ์ ๋ฉ์๋์ @Autowired๋ฅผ ๋ถ์ฌ ์ฃผ์
- ํ๋ ์ฃผ์ : ๋ณ์ ์์ฒด์ @Autowired๋ฅผ ๋ฐ๋ก ๋ถ์ฌ์ ์ฃผ์
- ์ด๋ฅผ ํตํด CoffeeMachine์ CoffeeBean๋ผ๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ธฐ์ ์ํ๋ค๋ฉด ๊ตฌ์ฒด์ ์ธ ์๋ ํด๋์ค๋ฅผ ์ผ๋ง๋ ์ง ๋ง๋ค์ด๋ผ ์ ์ด๋ค
์ฆ, ์๋๋ผ๋ฉด CoffeeMachine ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ์ํ๋ ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ ์ ์ด ์ญ์ ์ผ๋ก ์ธํด CoffeeMachine๋ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์ ์ด๊ถ์ ๊ฐ์ง ์ปจํ ์ด๋๊ฐ ์ปคํผ ์๋๋ฅผ ์์ฑํ๊ณ CoffeeMachine ๋ด๋ก ์ฃผ์ ํด์ค๋ค
์ด์ฒ๋ผ ๊ฐ ๊ฐ์ฒด๋ผ์ง์ ์์กด์ฑ์ด ์กด์ฌํ ๋ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์ผ๋ฉด ์์กด๊ด๊ณ๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์์ด ๊ฐ๋ฐ์์ ๋ถ๋ด์ด ์ค์ด๋ ๋ค
- ์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์๋ฒ ์ธก(์คํ๋ง๋ถํธ ์ดํ๋ฆฌ์ผ์ด์ ์ธก) ํ๋ก๊ทธ๋จ
- ๊ธฐ์กด์ ์๋ฒ๋ ์ ์ ์ธ ์๋ฃ๋ง์ ์ฃผ๊ณ ๋ฐ์๋ค
- ๊ทธ๋ฌ๋ ์น์ ๋ค์ํ ๊ธฐ๋ฅ์ด ์๊ตฌ๋๋ฉด์ ์ฌ์ฉ์์ ์๊ตฌ์ ๋ง์ถ ๋์ ์ธ ํ์ด์ง๋ฅผ ๋ง๋ค ํ์๊ฐ ์๊ฒผ๋ค
- ์ด๋ฅผ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ด ์๋ธ๋ฆฟ์ด๋ฉฐ ์๋ฐ์์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค
- ํด๋ผ์ด์ธํธ์๊ฒ์ ์์ฒญ(HTTP Request)๊ฐ ๋ ์์จ๋ค
- ์๋ธ๋ฆฟ ๋งค๋์ ๋ ํด๋น ์์ฒญ์ web.xml ํ์ผ์ ๋ณด๊ณ ๋ด๋น ์๋ธ๋ฆฟ์ ํ์ธํ ๋ค HttpServletRequest๋ฅผ ๋ด๋น ์๋ธ๋ฆฟ์๊ฒ ๋๊ฒจ์ค๋ค
- ๋ด๋น ์๋ธ๋ฆฟ์ ์๋น์ค ๋ฉ์๋๋ฅผ ํธ์ถํด ๋ก์ง์ ์คํํ๋ค
- ์๋ธ๋ฆฟ์ ์์ฑ๋ ๊ฒฐ๊ณผ๋ HttpServletResponse์ ๋ด์ ์๋ธ๋ฆฟ ๋งค๋์ ์๊ฒ ์ ๋ฌํ๋ค
- ์ฌ์ฉ์ด ๋๋ HttpServletRequest์ HttpServletResponse๋ฅผ ์ญ์ ํ๋ค
- ํด๋ผ์ด์ธํธ์๊ฒ์ ์์ฒญ(HTTP Request)๊ฐ ๋ ์์จ๋ค
- DispatcherServlet๊ฐ ์์ฒญ์ ๋ฐ์ URL์ ๋ณด๊ณ ๋ด๋น ์ปจํธ๋กค๋ฌ์๊ฒ ํด๋น ์์ฒญ์ ๋๊ธด๋ค
- ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ ํ์งํ ๋ฆฌ๋ฅผ ํตํด ๋ก์ง์ด ์คํ๋๋ค
- ์์ฑ๋ ๊ฒฐ๊ณผ๋ View ํน์ JSON์ผ๋ก ์ฒ๋ฆฌ๋๋ค
- DispatcherServlet์ ํด๋น ๊ฒฐ๊ณผ๋ฅผ HTTP Response๋ก ์ ๋ฌํ๋ค
- ์คํ๋ง ๋์ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ URL ์์ฒญ๋ง๋ค ๋ด๋น ์๋ธ๋ฆฟ์ ์ง์ ํ ํ์ ์์ด DispatcherServlet์ด๋ผ๋ ํ๋์ ์ฐฝ๊ตฌ๊ฐ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ์๊ฒ ๋ถ๋ฐฐํ๋ค
- ๊ฐ๋ฐ์๋ HttpServletRequest, Response ๊ฐ์ฒด๋ฅผ ์ง์ ๋ค๋ฃจ๋ฉฐ ์์ฒญ๊ณผ ์๋ต์ ์ ๊ณผ์ ์ ์ฝ๋๋ก ๊ตฌํํด์ผ ํ ํ์๊ฐ ์๋ค
- web.xml ํ์ผ์ ์ด๋ค URL์ ์ด๋ค ์๋ธ๋ฆฟ์ด ์ฒ๋ฆฌํ ์ง ์ผ์ผ์ด ๋ฑ๋กํ ํ์ ์์ด @GetMapping, @PostMapping ๊ฐ์ ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฐ๋จํ๊ฒ URL์ ๋งคํํ ์ ์๋ค
- ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋ ์ญํ
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์์ฑ, ์ด๊ธฐํ, ํธ์ถ, ์ข ๋ฃํ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค
- ๋ํ์ ์ธ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํฐ์บฃ์ด ์๋ค
- ํฐ์บฃ์ ์ค์ ๋ก ์น ์๋ฒ์ ํต์ ํ๋ฉฐ Java Server Page์ ์๋ธ๋ฆฟ์ด ์๋ํ๋ ํ๊ฒฝ์ ์ ๊ณตํด์ค๋ค
- ์๋ ๋คํธ์ํฌ๋ฅผ ํตํ ์ํต์ ์ํด์๋ Socket์ ๋ง๋ค๊ณ , listen(), accept(), connect() ๋ฑ์ผ๋ก ๊ตฌํํด์ผ ํ๋ค
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด๋ฐ ๊ธฐ๋ฅ์ API๋ก ์ ๊ณตํ์ฌ ๊ฐํธํํ์๋ค
- ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ์๋ฐ์ ๊ฐ์ฒด
- ์คํ๋ง์ ๋น์ ํตํด ๊ฐ์ ๋ฅผ ์ธ์คํด์คํ ํ ํ ๊ฐ์ฒด ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ค
- ์คํ๋ง์์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ๊ธฐ๋ฅ๋ค์ ๊ด๋ฆฌํ๋ ์กด์ฌ๊ฐ ํ์ํ๋ฐ ์ด๋ฅผ ๋ด๋นํ๋ ๊ฒ์ด "์คํ๋ง ์ปจํ ์ด๋"์ด๋ค
- ์คํ๋ง์ ์น์์ ํ์ํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ํ ๋ ๋ง๋ค์ด ์๊ธฐ๋ค๋ผ๋ฆฌ ์์์ ์ฐ๊ฒฐํด์ค๋ค
- ์คํ๋ง ๋น์ ๋ฒ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฑฐ์ ๋ชจ๋ ๊ฐ์ฒด์ด๋ค
- ๊ทธ ๋ฒ์๋ ํด๋์ค ๋ด๋ถ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ถํฐ Controller ๊ณ์ธต ์ ์ฒด, Service ๊ณ์ธต ์ ์ฒด, Repository ๊ณ์ธต ์ ์ฒด๋ก ๋ค์ํ๋ค
- ์ด๋ฅผ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ ์ ์๋ค
- @Component โ @Autowired
- ์คํ๋ง์์๋ new ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ @Autowired ์ด๋ ธํ ์ด์ ์ ํตํด ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํ๋ค
- @Controller, @Service, @Repository ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ๋ ํด๋น ์ด๋ ธํ ์ด์ ๋ค ์์ ๋ช ์์ ์ผ๋ก @Component ์ด๋ ธํ ์ด์ ์ด ๋ค์ด์๋ค
- ์ฆ @Component ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ์ง ์๋๋ผ๋ ์คํ๋ง์ @Controller, @Service, @Repository ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ค์ ์ค์บํ๋ฉฐ Bean์ผ๋ก ๋ฑ๋กํ๋ค
- @Configuration โ @Bean
- @Configuration ์ด๋ ธํ ์ด์ ์ ํตํด ๊ฐ๋ฐ์๊ฐ Bean์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ง์ ๊ด๋ฆฌํ ์ ์๋ค
- ๊ด๋ฆฌ๋ฅผ ์ํ ํด๋์ค์ @Configuration ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ณ ์ธํ๋ ๋ฉ์๋์ @Bean ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ํ๋ ๋น์ ์์ฑ, ์๋ฉธ์ ์ค์ ์ ๊ฒฐ์ ํ ์ ์๋ค
- ํด๋น ๋ฐฉ๋ฒ์ ์ฅ์ ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ ์ ์๋ค๋ ๊ฒ์ด๋ค (์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค์ ์ฝ๋์ @Component๋ฅผ ๋ถ์ผ ์๋ ์์)
์ฆ, IoC(์ ์ด ์ญ์ ) ์ปจํ ์ด๋๋ ์์ ๋ชจ๋ ๊ณผ์ ์ ๊ฑฐ์ณ POJO(Plain Old Java Object, ์์ ์๋ฐ ๊ฐ์ฒด) ๊ธฐ๋ฐ์ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค!
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋จ์ ๋ ์ ์ฐํ๊ณ ์ ์ง/๋ณด์ํ๊ธฐ ํธํ๊ฒ ๋ง๋ค๊ธฐ ์ํ 5๊ฐ์ง ์ค๊ณ ์์น
- S : ๋จ์ผ ์ฑ ์ ์์น. ํ๋์ ํด๋์ค๋ ๋จ ํ๋์ ์ฑ ์๋ง์ ๊ฐ์ ธ์ผ ํ๋ค. ํ๋์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ ๋ ํ๋์ ํด๋์ค๋ง์ ์์ ํ ์ ์๋๋ก ํ์
- O : ๊ฐ๋ฐฉ-ํ์ ์์น. ํ์ฅ์๋ ์ด๋ ค ์๊ณ ์์ ์๋ ๋ซํ ์์ด์ผ ํ๋ค. ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ด์ผ ํ๋ค.
- L : ๋ฆฌ์ค์ฝํ ์นํ ์์น. ํ์ ํ์ ์ ์ธ์ ๋ ์์ ํ์ ์ผ๋ก ๋์ฒดํ ์ ์์ด์ผ ํ๋ค. ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ญํ ์ ๋์ฒดํ์ ๋, ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๋์์ ๊นจ๋จ๋ฆฌ์ง ์์์ผ ํ๋ค (์์์ ์ธ์ ๋ ๋ถ๋ชจ์ ์๋๋๋ก ๋์ํ ๊ฒ)
- I : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น. ์ธํฐํ์ด์ค๋ ์ต์ํ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ฉฐ ๊ตฌ์ฒดํ ์, ๋ถํ์ํ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์๋ ์ ๋๋ค.
- D : ์์กด๊ด๊ณ ์ญ์ ์์น. ์ธ์ ๋ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๊ตํํ ์ ์๋๋ก ์ธ๋ถ์ ์ธ ๊ตฌํ ํด๋์ค์ ์์กดํ๋ ๋์ ์ถ์ํ(์ธํฐํ์ด์ค)์ ์์กดํด์ผ ํ๋ค
์์กด๊ด๊ณ ์ญ์ ์์น๊ณผ ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ๋ด์ฉ์ ์ด์ด์ง๋ ๋ด์ฉ - ์์กด๊ด๊ณ ์ญ์ ์์น(DIP)์ด ์ ๋๋ก ๋์ํ๊ธฐ ์ํ ์ ์ ์กฐ๊ฑด์ด ๋ฐ๋ก ๋ฆฌ์ค์ฝํ ์นํ ์์น(LSP)์ด๋ค
- AOP(๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ ์ํํธ์จ์ด์ 'ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง'๊ณผ ์ฌ๋ฌ ๊ณณ์ ํฉ์ด์ ธ ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋๋ '๊ณตํต ๊ธฐ๋ฅ'์ ๋ถ๋ฆฌํ๋ ๊ฐ๋ฐ ๋ฐฉ์
- ์คํ๋ง์์๋ ์ฃผ๋ก ๋ก๊ทธ ๊ธฐ๋ก, ํธ๋์ญ์ ์ฒ๋ฆฌ, ๋ณด์ ๊ฒ์ฌ ๊ฐ์ ๊ณตํต ๊ธฐ๋ฅ์ AOP๋ก ๊ตฌํํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊น๋ํ๊ฒ ์ ์งํ๋ค