์ด์ผ๊ธฐ - ์๋ฐ ์ง์์ ์ถ์ด ๊ฒจ์ธ๊ณผ ์คํ๋ง์ ํ์
2000๋ ๋ ์ด๋ฐ, ์๋ฐ ์ง์์ ํ์ค ๊ธฐ์ ์ Enterprise Java Beans ์๋ค. ์ด๋ก ์ด ์ข์ ์ข ํฉ ์ ๋ฌผ ์ธํธ์์ง๋ง, ์๋นํ ๋น์ธ๊ณ ๋ณต์กํ๋ฉฐ ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ๋ค. ๊ทธ๋ฌ๋ค๋ณด๋, ์์ํ Plain Old Java Object ๋ก ๋์๊ฐ์๋ ์๊ฒฌ์ด ๋์ค๊ธฐ ์์ํ๋ค. ๊ทธ๋ ๊ฒ ๋ฑ์ฅํ ๊ฒ์ด, EJB ๋ฅผ ๋์ฒดํ Spring ๊ณผ EJB ์ํฐํฐ๋ฅผ ๋์ฒดํ JPA ์ด๋ค.
์คํ๋ง ์ญ์ฌ
2002๋ ๋ก๋ ์กด์จ์ด๋ผ๋ ์ฌ๋์ด EJB ์ ๋ฌธ์ ์ ์ ์ง์ ํ๋ ์ฑ ์ ์ถํํ๋ค. ์ด ์ฑ ์ BeanFactory, ApplicationContext, POJO, IoC, DI ๋ฑ๋ฑ ์ง๊ธ์ ์คํ๋ง ํต์ฌ ๊ฐ๋ ๊ณผ ๊ธฐ๋ฐ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์๋ค. ์คํ๋ง์ ์ข์ ๋์ , ์ค์ ์ด ๋๋ฌด ํ๋ค์๋๋ฐ, ์ด๋ฅผ ๋ณด์ํ์ฌ ๋์จ ๊ฒ์ด ์คํ๋ง ๋ถํธ์ด๋ค.
์คํ๋ง์ด๋?
์คํ๋ง ํ๋ ์์ํฌ
ํต์ฌ ๊ธฐ์ - ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ ์น ๊ธฐ์ - ์คํ๋ง MVC, ์คํ๋ง WebFlux ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ - ํธ๋์ญ์ , JDBC, ORM ๊ธฐ์ ํตํฉ - ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ค๋ง
์คํ๋ง ๋ถํธ
์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๊ฒ์ด ์คํ๋ง ๋ถํธ์ด๋ค.
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
- Tomcat ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋๋ค.
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ์ ์ ๊ณตํ๋ค.
- ์คํ๋ง๊ณผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํด์ค๋ค.
- ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์ ์ ์ง์ํ๋ค.
์คํ๋ง์ด๋ผ๋ ๋จ์ด?
์คํ๋ง์ด๋ผ๋ ๋จ์ด๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋๋ค.
- ์คํ๋ง DI ์ปจํ ์ด๋ ๊ธฐ์
- ์คํ๋ง ํ๋ ์์ํฌ
- ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ
์คํ๋ง์ ์ ๋ง๋ค์์๊น?
์คํ๋ง์ ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ๋ค. ์๋ฐ ์ธ์ด์ ๊ฐ์ฅ ํฐ ํน์ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ผ๋ ๊ฒ์ด๋ค. ์คํ๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ์ด๋ค. ์ฆ, ์คํ๋ง์ ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ๋ผ๋ ๊ฒ์ด๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ฐ์ฒด ์งํฅ์ ํน์ง
- ์ถ์ํ
- ์บก์ํ
- ์์
- ๋คํ์ฑ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํ๋ ฅ์ ํ ์ ์๊ธฐ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ ์ฉ์ดํ๋ค๋ ์ฅ์ ์ด ์๋ค. ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ๋๊ทํฌ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ ์ฉ์ดํ๋ค?
๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝํ๋ฏ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ด๋ค. ์ฆ, ๋คํ์ฑ์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ์ค์ํ ํต์ฌ์ด๋ค.
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๋ฉด ์ธ์์ด ๋จ์ํด์ง๊ณ , ์ ์ฐํด์ง๋ฉฐ ๋ณ๊ฒฝ๋ ํธ๋ฆฌํด์ง๋ค. ์ด๋ฅผ ํตํ ์ฅ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- ํด๋ผ์ด์ธํธ๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์๋ฉด ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์๋ฐ ์ธ์ด์ ๋คํ์ฑ์ ํ์ฉํ์ฌ ์ด๋ฌํ ์ด์ ์ ํ๋ก๊ทธ๋๋ฐ ์์๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ์ญํ = ์ธํฐํ์ด์ค
- ๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์ญํ ์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ด๋ค.
์๋ฐ ์ธ์ด์ ๋คํ์ฑ
์ค๋ฒ๋ผ์ด๋ฉ์ ๋ ์ฌ๋ ค๋ณด์. ๋คํ์ฑ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
๋คํ์ฑ์ ๋ณธ์ง
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค. ๋คํ์ฑ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ํ๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ์์ ์์ํด์ผ ํ๋ค. ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ด ๋คํ์ฑ์ ๋ณธ์ง์ธ ๊ฒ์ด๋ค.
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ์ ๋ฆฌ
์ค์ธ๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ด๋ผ๋ ํธ๋ฆฌํ ์ปจ์ ์ ๋คํ์ฑ์ ํตํด ๊ฐ์ฒด ์ธ์์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด๋ ์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค๋ ์ฅ์ ์ ๊ฐ์ ธ๋ค ์ฃผ๊ณ , ์ด๋ ๊ณง ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ๋ฅผ ์๋ฏธํ๊ธฐ๋ ํ๋ค. ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด ํต์ฌ์ด๊ธฐ์, ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ํ๊ณ
์ญํ (์ธํฐํ์ด์ค) ์์ฒด๊ฐ ๋ณํ๋ฉด, ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ค. ์ฆ, ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ ๊ฒ์ด๋ค.
์คํ๋ง๊ณผ ๊ฐ์ฒด ์งํฅ
๋คํ์ฑ์ด ๊ฐ์ฅ ์ค์ํ๋ค! ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค๋ค. ์คํ๋ง์์ ์ด์ผ๊ธฐํ๋ IoC, DI ๋ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ์ง์ํ๋ค. ์คํ๋ง์ ์ฌ์ฉํ๋ฉด ๋ง์น ๋ ๊ณ ๋ธ๋ญ์ ์กฐ๋ฆฝํ๋ฏ์ด ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น(SOLID)
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
๋ค์ ์คํ๋ง์ผ๋ก
์คํ๋ง ์ด์ผ๊ธฐ์ ์ ์๊พธ ๊ฐ์ฒด ์งํฅ ์ด์ผ๊ธฐ๊ฐ ๋์ค๋๊ฑฐ์ง? ์์ํ๊ฒ ์๋ฐ๋ก OCP, DIP ์์น๋ค์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์ ํํ๋ DI ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP, DIP ๋ฅผ ๊ฐ๋ฅํ๋๋ก ์ง์ํ๋ค.
- DI - ์์กด์ฑ ์ฃผ์
- DI ์ปจํ ์ด๋ ์ ๊ณต ์ด๋ ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ์์ด ๊ธฐ๋ฅ ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ์ฆ, ์ฝ๊ฒ ๋ถํ์ ๊ต์ฒดํ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ค๋ค๋ ๊ฒ์ด๋ค.
์ ๋ฆฌ
๋ชจ๋ ์ค๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ์. ์ฆ, ์ด์์ ์ผ๋ก๋ ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ์๋ ์๋ฏธ๋ค. ํ์ง๋ง, ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ฉด ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ , ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํฉํฐ๋งํด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด
์น์ ๊ฐ๋ฐํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ
- ์ ์ ์ปจํ ์ธ
- MVC์ ํ ํ๋ฆฟ ์์ง
- API
์ ์ ์ปจํ ์ธ
resources/static
๊ฒฝ๋ก์ ์ ์ html ์ปจํ
์ธ ๋ฅผ ์ ์ฅํ๋ค. resources/static/hello-static.html
์ดํ http://localhost:8080/hello-static.html
์ ์ ์ ์ ์ฅํ ์ปจํ
์ธ ์ ์ ๊ทผํ ์ ์๋ค.
MVC์ ํ ํ๋ฆฟ ์์ง
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
Controller
์ Mapping
๋ ๊ฒฝ๋ก๋ฅผ ํตํด ํด๋น ์์ฒญ์ ์ํํ๋ค.
model
์ ์์ฒญ ์ ์ ๋ฌ ๋ฐ์ ์ธ์ RequestParam
์ ์ถ๊ฐํ์ฌ hello-template
์ ์ ์ฉํ ์ ์๋ค.
API
@ResponseBody
์ฌ์ฉ ์viewResolver
๋์ ,HttpMessageConverter
๊ฐ ๋์ํ๋ค.
@ResponseBody ๋ฌธ์ ๋ฐํ
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
@ResponseBody
๋ฅผ ์ฌ์ฉํ์ฌ HTTP Body ์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํํ๋ค.StringHttpMessageConverter
๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋์ํ๋ค.
@ResponseBody ๊ฐ์ฒด ๋ฐํ
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
@ResponseBody
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐํ ์, ๊ฐ์ฒด๊ฐ JSON ์ผ๋ก ๋ณํ๋๋ค.MappingJackson2HttpMessageConverter
๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋์ํ๋ค.