Spring Framework ๊ธฐ๋ณธ, ํน์ง, ์ฌ์ฉํ๋ ์ด์
๐กFramework vs Library
Java Collection Framework์ ์์ฃผ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ๋ฐ ์ฒ๋ฆฌํ๊ธฐ ์ฝ๋๋ก ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํด๋์ค์ ์งํฉ์ด๋ค.
์ฆ, Framework๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํ ์ด๋ ํ ํ์ด๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
Framework๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑ ๊ฐ๋ฅํ๋ฉฐ, ์ ํด์ง ๊ท์ฝ์ด ์์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง, ์์ ๋กญ๊ณ ์ ์ฐํ ๊ฐ๋ฐ์ด ์ด๋ ต๊ณ , ์ฌ์ฉํ๊ณ ์ ํ๋ Framework์ ๋ํ ํ์ต์ด ์ ํ๋์ด์ผ ํ๋ค๋ ๋จ์ ๋ ์๋ค.
Library๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉ๋๋ ์ผ๋ จ์ ๋ฐ์ดํฐ ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ๋งํ๋ค.
์ฆ, ๊ฐ๋ฐ์ ํ์ํ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋์ ์งํฉ์ฒด๋ก์, ๊ฐ๋ฐ์๊ฐ ํ์ํ ๋๋ง๋ค ์ ํ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ์ฃผ๋๊ถ์ด ๊ฐ๋ฐ์์๊ฒ ์๋ ๊ฒ.
๊ทธ๋ฌ๋ Framework๋ ์ฝ๋ ์์๋ ์ง์ ์ ์ผ๋ก ๋ณด์ด์ง ์๋ ์๋นํ ๋ง์ ์ผ๋ค์ ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ฉ์๋ ๋ด์ ์ฝ๋๋ฅผ ์์ฑํด๋๋ฉด, Framework์์ ์์์ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ๋ง๋ค์ด๋ธ๋ค.
์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ์ฃผ๋๊ถ์ด Framework์๊ฒ ์๋ ๊ฒ(IOC)
๐กSpring Framework๋ง์ ์ฅ์ ์?
- POJO(Plan Old Java Object) ๊ธฐ๋ฐ์ ๊ตฌ์ฑ
- DI(Dependency Injection) ์ง์
- AOP(Aspect Oriented Programming) ์ง์
- Java ์ธ์ด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ป๋ ์ฅ์ ๋ค
Java๋ ์ ์ ํ์ ์ธ์ด๋ก์ ๋ณ์์ ํ์ , ๋ฉ์๋์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ด ์ด๋ค ํ์ ์ ๊ฐ์ ธ์ผ ํ๋์ง๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ฌ๋์ด ํจ๊ป ์์ ํ ๋, ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋ ํน์ ์ด์ ์ ๋ด๊ฐ ์์ฑํ๋ ์ฝ๋๋ฅผ ์์ , ๋ณด์์ด ์ฉ์ดํจ. ๋, ์น ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋๋ฐ ์์ด์ ๋ฐํ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์ง ๊ฐ๋ฅํ๋ค.
๋, Spring Framework๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์ ์ฉ ์ํฐํ๋ผ์ด์ฆ ์์คํ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๋์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ Framework์ ๊ธฐ๋ณธ ๋ชฉ์ ๊ทธ ์ด์์ ๋ฌ์ฑ ๊ฐ๋ฅ. ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น์ ์ ๋ง๋ ์ฌ์ฌ์ฉ๊ณผ ํ์ฅ์ด ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์คํฌ์ ํฅ์ํ ์ ์์ผ๋ฉฐ, ๋ณด๋ค ๋์ ์ฑ๋ฅ๊ณผ ์๋น์ค์ ์์ ์ฑ์ด ํ์ํ ๋ณต์กํ ๊ธฐ์ ์ฉ ์ํฐํ๋ผ์ด์ฆ ์์คํ ์ ์ ๋๋ก ๊ตฌ์ถํ๊ธฐ ์ํ ๋ฅ๋ ฅ์ ๊ธฐ๋ฅผ ์ ์์.
๐กSpring ์ด์ ์๋...
- JSP๋ฅผ ์ด์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ : ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ View ํ์ด์ง์ชฝ ์ฝ๋์ ์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ์ชฝ ์ฝ๋๊ฐ ์์ฌ์๋ ํํ์ ๊ฐ๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ต์ ์ ๋ฐฉ์.
- ์๋ธ๋ฆฟ(Servlet)์ ์ด์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ :JSP ๋ฐฉ์ ์ญ์ ๋ด๋ถ์ ์ผ๋ก Servlet ๋ฐฉ์์ ์ฌ์ฉ. Spring์ ์ฌ์ฉํ ์น ์์ฒญ์ ์ฒ๋ฆฌํ ๋์๋ ๋ด๋ถ์ ์ผ๋ก๋ Servlet์ ์ฌ์ฉํจ. (Servlet์ ์ํ java ์ฝ๋๊ฐ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์์ ๋ถ๋ฆฌ๋์ด ๋ณ๋์ Java ํด๋์ค๋ก ๊ด๋ฆฌ๋จ) ์๋ธ๋ฆฟ ๋ฐฉ์์ ์ฝ๋์์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ค๋ ์์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฝ๋๋ก ์์ฑํด์ผ ํ๊ณ , ์บ๋ฆญํฐ์ ๋ ์ง์ ํด์ผ ํจ.
- Spring MVC : Spring MVC ์ค์ ํ์ผ web.xml์ ๋ณต์กํ ์ค์ ๊ณผ์ ..
- Spring Boot : Spring MVC ๊ธฐ๋ฐ์ ์ฝ๋๋ฅผ Spring Boot ๊ธฐ๋ฐ์์ ๊ฐ์ . ๋ณต์กํ ์ค์ ์์ ๋ง์ ๋ Spring ์ด ๋์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์์.
cf.
Java ์๋ธ๋ฆฟ
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ Servlet ํด๋์ค์ ๊ตฌํ ๊ท์น์ ์งํจ ์๋ฐ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ .(์น ์์ฒญ์ ๋ํด ๋์ ์ธ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
์ฌ์ฉ์๊ฐ URL์ ์ ๋ ฅํ๋ฉด HTTP Request๊ฐ Servlet Container๋ก ์ ์ก๋๊ณ , ์์ฒญ์ ์ ์ก๋ฐ์ Servlet Container๋ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์์ฑํจ. web.xml์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ด ์ด๋ ์๋ธ๋ฆฟ์ ๋ํ ์์ฒญ์ธ์ง๋ฅผ ์ฐพ๊ณ , ํด๋น ์๋ธ๋ฆฟ์์ service ๋ฉ์๋๋ฅผ ํธ์ถํ ํ ํด๋ผ์ด์ธํธ์ GET, POST ์ฌ๋ถ์ ๋ฐ๋ผ doGet(), doPost() ๋กค ํธ์ถํจ. doGet(), doPost() ๋ฉ์๋๋ ๋์ ํ์ด์ง๋ฅผ ์์ฑํ ํ HttpServletResponse ๊ฐ์ฒด์ ์๋ต์ ๋ณด๋. ์๋ต์ด ๋๋๋ฉด HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋จ.
์๋ธ๋ฆฟ ๋ผ์ดํ ์ฌ์ดํด์ ์ํ 3๊ฐ์ง ํ์ ๋ฉ์๋ : init() (์๋ธ๋ฆฟ ์์ฑ) -> service() (์ฒ๋ฆฌ ์งํ) -> destroy() (์๋ธ๋ฆฟ ์ญ์ )
์๋ธ๋ฆฟ ์ปจํ ์ด๋
์๋ธ๋ฆฟ์ด ๋์ํ๋ ํ๊ฒฝ์ ์ ๊ณต. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ ์๋ตํ ์ ์๋๋ก ์น ์๋ฒ์ ์์ผ์ผ๋ก ํต์ .
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ญํ
1. ์น ์๋ฒ์ ํต์
2. ์๋ธ๋ฆฟ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
3. ๋ฉํฐ์ฐ๋ ๋ ์ง์ ๋ฐ ๊ด๋ฆฌ
4. ์ ์ธ์ ์ธ ๋ณด์ ๊ด๋ฆฌ
๋์ ๋ฐฉ์
1. ์น ์๋ฒ๊ฐ HTTP ์์ฒญ์ ๋ฐ๋๋ค.
2. ์น์๋ฒ๋ ์์ฒญ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ก ์ ๋ฌํจ.
3. ์๋ธ๋ฆฟ์ด ์ปจํ ์ด๋์ ์๋ค๋ฉด,
JSP(Java Server Page) : Java ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์๋ HTML ์ฝ๋๋ก, HTML ์์์ ์๋ฐ์ฝ๋๋ <% ์์ค์ฝ๋ %> ๋๋ <%= ์์ค์ฝ๋ =%>ํํ๋ก ๋ค์ด๊ฐ. ์๋ธ๋ฆฟ ๊ท์น์ด ๊ฝค ๋ณต์กํ๊ธฐ ๋๋ฌธ์ JSP๊ฐ ๋์ค๊ฒ ๋์๊ณ , JSP๋ WAS์ ์ํด์ ์๋ธ๋ฆฟ ํด๋์ค๋ก ๋ณํ๋์ด ์ฌ์ฉ๋์ด ์ง.
๐กSpring Framework์ ํน์ง
- POJO(Plain Old Java Object)
- IoC(Inversion Of Control)
- AOP(Aspect Object Programming)
- PSA(Portable Service Abstraction)
๐กPOJO(Plain Old Java Object) ํ๋ก๊ทธ๋๋ฐ
POJO๋ฅผ ์ด์ฉํด์ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋จ์ํ ์์ ์๋ฐ ๊ฐ์ฒด๋ง์ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํด์, POJO ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ค์ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๊ท์น์ ์ง์ผ์ผ ํ๋ค.
- Java๋ Java ์คํ
(์ฌ์)์ ์ ์๋ ๊ฒ ์ด์ธ์๋ ๋ค๋ฅธ ๊ธฐ์ ์ด๋ ๊ท์ฝ์ ์ฝ๋งค์ด์ง ์์์ผ ํจ.
- ํน์ ๊ธฐ์ ์ ์์ํด ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ๋์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋์ด ๋ค๋ฅธ ๊ธฐ์ ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด ํน์ ๊ธฐ์ ์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ถ๋ถ์ ์ ๋ถ ๋ค ์ผ์ผ์ด ์ ๊ฑฐํ๊ฑฐ๋ ์์ ํด์ผ ํจ.
- Java๋ ํด๋์ค๊ฐ ๋ค์ค ์์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, extends ํค์๋๋ฅผ ์ฌ์ฉํด์ ํ ๋ฒ ์์์ ํ๊ฒ ๋๋ฉด ์์ ํด๋์ค๋ฅผ ์์๋ฐ์์ ํ์ ํด๋์ค๋ฅผ ํ์ฅํ๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ ๊ธฐ๋ฒ์ ์ ์ฉํ๊ธฐ ์ด๋ ค์์ง๊ฒ ๋จ.
- ํน์ ํ๊ฒฝ์ ์ข
์์ ์ด์ง ์์์ผ ํจ.
- ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ์ํค๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋(Servlet Container)์ธ ์ํ์น ํฐ์บฃ์ ์๋ก ๋ค์ด๋ณด์.
์์ Java๋ก ์์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ด์์ Tomcat์ด ์ง์ํ๋ API๋ฅผ ์ง์ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ ๋, ์์คํ ์ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋์ด์ Tomcat์ Zetty๋ผ๋ ๋ค๋ฅธ Servlet Container๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ฌ์ฉํ๊ณ ์๋ Tomcat API ์ฝ๋๋ค์ ๋ชจ๋ ๊ฑท์ด๋ด๊ณ Zetty๋ก ์์ ํ๋์ง ์ต์ฝ์ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ถ๋ฅผ ๋ฏ์ด ๊ณ ์ณ์ผ๋ ์ง๋ ๋ชจ๋ฅด๋ ์ํฉ์ ์ง๋ฉดํ ์๋ ์์
- ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ์ํค๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋(Servlet Container)์ธ ์ํ์น ํฐ์บฃ์ ์๋ก ๋ค์ด๋ณด์.
POJO ํ๋ก๊ทธ๋๋ฐ์ด ํ์ํ ์ด์
- ํน์ ํ๊ฒฝ์ด๋ ๊ธฐ์ ์ ์ข ์์ ์ด์ง ์์ผ๋ฉด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ ์ ์ฐํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ์ ์์ค ๋ ๋ฒจ์ ๊ธฐ์ ๊ณผ ํ๊ฒฝ์ ์ข ์์ ์ธ ์ฝ๋๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ ๊ฑฐํจ์ผ๋ก์จ ์ฝ๋๊ฐ ๊น๋ํด์ง.
- ์ฝ๋๊ฐ ๊น๋ํด์ง๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ํ๊ธฐ๋ ์๋์ ์ผ๋ก ์ฌ์.
- ํน์ ๊ธฐ์ ์ด๋ ํ๊ฒฝ์ ์ข ์์ ์ด์ง ์์ ํ ์คํธ ์ญ์ ๋จ์ํด์ง.
- ๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ๋ฅผ ์ ํ์์ด ์ ์ฉ ๊ฐ๋ฅ.(๊ฐ์ฅ ์ค์ํ ์ด์ )
POJO์ Spring์ ๊ด๊ณ
Spring์ POJO ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํ๋ Framework.
๊ทธ๋ฆฌ๊ณ ์ต๋ํ ๋ค๋ฅธ ํ๊ฒฝ์ด๋ ๊ธฐ์ ์ ์ข ์์ ์ด์ง ์๋๋ก ํ๊ธฐ ์ํ POJO ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์ Spring์์๋ ์ธ ๊ฐ์ง ๊ธฐ์ ์ง์ํ๋ค. (IoC/DI, AOP, PSA)
์ ๋ฆฌ)
- POJO๋ ์์ํ Java ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
- POJO ํ๋ก๊ทธ๋๋ฐ์ด๋ ์์ Java ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ธฐ์ ์ด๋ ํ๊ฒฝ์ ์ข ์๋์ง ์๋๋ก ํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
- POJO ํ๋ก๊ทธ๋๋ฐ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด์๋ ํน์ ๊ธฐ์ ์ ๋ํ ์ง์๋ณด๋ค๋ JDK๊ณผ API์ ๋ํ ์ง์๊ณผ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฌ๊ณ ๋ฐฉ์๊ณผ ์ค๊ณ๋ฅผ ์ํ ํ๋ จ์ด ์ฐ์ ์๋์ด์ผ ํ๋ค.
- Spring Framework๋ POJO ํ๋ก๊ทธ๋๋ฐ์ ์งํฅํ๊ธฐ ์ํด IoC/DI, AOP, PSA๋ผ๋ ๊ธฐ์ ์ ์ ๊ณตํ๋ค.
cf.
๊ฐ์ฒด ์งํฅ ๊ธฐ๋ณธ ์์น, SOLID
- SRP(Single Responsibility Principle) ๋จ์ผ ์ฑ ์์ ์์น : ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ํ๋์ ์ฑ ์์ ์ํํ๋๋ฐ ์ง์คํด์ผ ํ๋ค๋ ์์น.
- OCP(Open Close Principle) ๊ฐ๋ฐฉ ํ์์ ์์น : ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ์์น. ๋ณํ๋ ๊ฒ๊ณผ ๋ณํ์ง ์๋ ๊ฒ์ ์ ๊ตฌ๋ถํ๋ฉด OCP๋ฅผ ์งํค๊ธฐ ์ฉ์ด. ๋ณํ์ง ์๋ ๊ฒ์ ๋ณํ๋ ๊ฒ์ ๊ตฌํ์ ์์กดํ์ง ์๊ณ , ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋์จํ๊ฒ ์์กดํ๊ฒ ๋ง๋ฌ.
- LSP(The Liskov Substitution Principle) ๋ฆฌ์ค์ฝํ ์นํ์ ์์น : subclass์ ๊ฐ์ฒด๋ superclass์ ์ฐธ์กฐ๋ณ์์ ๋์
ํด์ superclass์ ์ญํ ์ ์ํํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค๋ ์์น.(OCP ์์น์ ๊ธฐ๋ฐ์ด ๋จ)
- ์๋ธ ํ์ ์ ์ธ์ ๋ ๊ธฐ๋ฐ ํ์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํ๋ค๋ ์๋ฏธ๋ก, ์์ ํด๋์ค๋ ์ต์ํ ์์ ์ ๋ถ๋ชจ ํด๋์ค์์ ๊ฐ๋ฅํ ํ์๋ ์ํ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ค๋ ์๋ฏธ.(๋คํ์ฑ์ ์๋ฆฌ)
- ISP(Interface Segregation Principle) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ์ ์์น : ์ธํฐํ์ด์ค์ ๋จ์ผ ์ฑ ์์ ์ํ ์์น. ์ฆ, ์ผ๋ฐ์ ์ธ ํ๋์ ์ธํฐํ์ด์ฌ ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๋ก ์ชผ๊ฐ๋ ๊ฒ์ด ๋ซ๋ค๋ ๊ฒ.
- DIP(Dependency Inversion Principle) ์์กด์ฑ ์ญ์ ์ ์์น : ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ์ง ์๊ณ , ์ถ์ํ(์ผ๋ฐํ) ๋ ํด๋์ค์ ์์กดํ๋ ๊ฒ์ ์๋ฏธ. ๊ตฌ์ฒด ํด๋์ค๊ฐ ์ถ์ ํด๋์ค์ ์์กดํ๋ฏ๋ก ์์กด ๊ด๊ณ๊ฐ ์ญ์ ๋ ํํ.
IoC(Inversion of Control)
์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ์ ์ฃผ๋๊ถ์ Spring์ด ๊ฐ์ง.
์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์น์์ ์คํํ๊ธฐ ์ํ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ชจ์ต. Java ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ main() ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ด ์ข ๋ฃ๋จ. ํ์ง๋ง ์น์์ ๋์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ญ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ๊ฐ ์ธ๋ถ์์ ์ ์ํด ์ฌ์ฉํ๋ ์๋น์ค์ด๊ธฐ ๋๋ฌธ์, ์ข ๋ฃ๋๋ฉด ์๋จ. ๊ทธ๋ฐ๋ฐ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์๋ ์๋ธ๋ฆฟ ์ฌ์(Specification)์ ๋ง๊ฒ ์์ฑ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ง ์กด์ฌํ์ง ๋ณ๋์ main ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์์. (main ๋ฉ์๋ ์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ ์ง์ ์ ์ํธ๋ฆฌ ํฌ์ธํธ๋ผ๊ณ ํจ) main() ๋ฉ์๋์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ ์ง์ ์ ์ํธ๋ฆฌ ํฌ์ธํธ๋ผ๊ณ ๋ถ๋ฆ. main() ๋ฉ์๋๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๊น? ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด์ ์ปจํ ์ด๋ ๋ก์ง์ด ์๋ธ๋ฆฟ์ ์ง์ ์คํ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ main() ๋ฉ์๋๊ฐ ํ์ ์์.
์ด ๊ฒฝ์ฐ์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์๋ธ๋ฆฟ์ ์ ์ดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ๋๊ถ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์์. ๋ฐ๋ก ์๋ธ๋ฆฟ๊ณผ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ IoC์ด ๊ฐ๋ ์ด ์ ์ฉ๋จ.
DI(Dependency Injection)
IoC๋ ์๋ฒ ์ปจํ ์ด๋ ๊ธฐ์ . ๋์์ธ ํจํด, ๊ฐ์ฒด ์งํฅ ์ค๊ณ ๋ฑ์ ์ ์ฉํ๊ฒ ๋๋ ๊ฐ๋ ์ธ๋ฐ ๋ฐํด DI(Dependency Injection)์ IoC ๊ฐ๋ ์ ์กฐ๊ธ ๊ตฌ์ฒดํ์ํจ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์.
์์กด์ฑ ์ฃผ์ ์ ํ๋๋ผ๋ ์์กด์ฑ ์ฃผ์ ์ ํํ์ ๋ณด๊ธฐ ์ํด์๋ ํด๋์ค๋ค ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ํผํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ๋์จํ ๊ฒฐํฉ(Loose Coupling)์ด ํ์ํจ. -> ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ.
AOP(Aspect Oriented Programming)
๊ด์ฌ ์งํฅ ํ๋ก๊ทธ๋จ์ด. ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ์งํฅํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๊ธฐ๋ฅ ์ค์์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ๊ณตํต ๊ธฐ๋ฅ์ ๋ํ ๊ด์ฌ๊ณผ ๊ด๋ จ๋จ.
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ค์ด ์๊ธฐ ๋ง๋ จ์ธ๋ฐ, ์ด๋ฌํ ๊ณตํต ๊ธฐ๋ฅ๋ค์ ๋ํ ๊ด์ฌ์ฌ๋ฅผ ๋ฐ๋ก ๊ณตํต ๊ด์ฌ ์ฌํญ(Cross-cutting Concern)์ด๋ผ๊ณ ํ๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ๋งํ๋ ๋น์ฆ๋์ค ๋ก์ง. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํ ํต์ฌ ๋ก์ง์ ๋ํ ๊ด์ฌ์ฌ๋ฅผ ํต์ฌ ๊ด์ฌ ์ฌํญ(Core Concern)์ด๋ผ๊ณ ํจ.
๊ณตํต ๊ด์ฌ ์ฌํญ๋ค์ ํต์ฌ ๋ก์ง์ ์ ๋ฐ์ ์ผ๋ก ๋๋ฃจ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ์ฝ๋์ ์ค๋ณต์ ๋ง๊ณ , ๊ฐ๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋ก์ง์์ ๊ณตํต ๊ธฐ๋ฅ ๋ก์ง๋ค(๋ก๊น , ๋ณด์, ํธ๋์ญ์ ๋ฑ)์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด AOP๋ผ ํ ์ ์๊ฒ ๋ค.
PSA(Portable Service Abstraction)
๊ธฐ๋ณธ์ ์ผ๋ก ์ถ์ํ๋ ์ด๋ค ํด๋์ค์ ๋ณธ์ง์ ์ธ ํน์ฑ๋ง์ ์ถ์ถํ์ฌ ์ผ๋ฐํํ๋ ๊ฒ์ ๋งํ๋ค.
์๋น์ค์ ์ ์ฉํ๋ ์ผ๊ด๋ ์๋น์ค ์ถ์ํ์ธ PSA๋, ์๋น์ค์ ๊ธฐ๋ฅ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์ผ๊ด๋๊ฒ ์ ์งํจ์ผ๋ก์จ(์ธํฐํ์ด์ค์ค๋ฅผ ํตํ ๋์จํ ๊ฒฐํฉ์ผ๋ก) ๊ธฐ์ ์์ฒด๋ฅผ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋งํ๋ค.
PSA๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ตฌ ์ฌํญ์ ๋ฐ์ ๊ฐ๋ฅํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ํคํ ์ฒ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ํคํ ์ฒ ์ ํ ์ค ๊ณ์ธตํ ์ํคํ ์ฒ(N-ํฐ์ด)์ ๋ํด ์์๋ณด์.
N-๊ณ์ธต ์ํคํ ์ฒ๋ ํ๋ ์ ํ ์ด์ , ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ๋ ผ๋ฆฌ์ , ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋ ํด๋ผ์ด์ธํธ - ์๋ฒ ์ํคํ ์ฒ ๊ฐ๋ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ API ๊ณ์ธต, ์๋น์ค ๊ณ์ธต, ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ผ๋ก ๋๋๋ค.
- API ๊ณ์ธต : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์๋ค์ด๋ ๊ณ์ธต
- ์๋น์ค ๊ณ์ธต : API ๊ณ์ธต์์ ์ ๋ฌ ๋ฐ์ ์์ฒญ์ ์ ๋ฌด ๋๋ฉ์ธ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๋น์ฆ๋์ค์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ณ์ธต. ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋ก์ง์ด ํฌํจ๋์ด ์์
- ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต : ๋น์ฆ๋์ค ๊ณ์ธต์์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ ์ฅํ๊ธฐ ์ํ ๊ณ์ธต
์ํคํ ์ฒ๋ก ๋ณด๋ Spring Framework ๋ชจ๋ ๊ตฌ์ฑ
์ ๊ทธ๋ฆผ์ Spring Framework์์ ์ง์ํ๋ ๋ชจ๋๋ค์ ์ํคํ ์ฒ๋ก ํํํ ๊ฒ.
๋ชจ๋์ด๋? ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ฅ๋ค์ ๋ชฉ์ ์ ๋ง๊ฒ ๊ทธ๋ฃนํํ์ฌ ๋ฌถ์ด๋์ ๊ฒ์ ๋งํจ. ์ด๋ฌํ ๋ชจ๋๋ค์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ์ ๊ณต๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
Spring Boot๋ฅผ ์ฌ์ฉํ๋ ์ด์
- XML ๊ธฐ๋ฐ์ ๋ณต์กํ ์ค๊ณ ๋ฐฉ์์ด ํ์ ์์ด์ง.
- ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๊ด๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ ์๋ ๊ตฌ์ฑ
- ํ๋ก๋์ ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฌ์ด ๋น๋
- ๋ด์ฅ๋ WAS๋ฅผ ํตํ ์์ฌ์ด ๋ฐฐํฌ