
์คํ๋ง์ ์ญ์ฌ

์คํ๋ง์ ์ญ์ฌ - ์ ์ค์ ์์
· 2002๋ ๋ก๋ ์กด์จ ์ฑ ์ถ๊ฐ
· EJB์ ๋ฌธ์ ์ ์ง์
· EJB ์์ด๋ ์ถฉ๋ถํ ๊ณ ํ์ง์ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์์ ๋ณด์ฌ์ค.
· 30,000๋ผ์ธ ์ด์์ ๊ธฐ๋ฐ ๊ธฐ์ ์ ์์ ์ฝ๋๋ก ์ ๋ณด์
· ์ฌ๊ธฐ์ ์ง๊ธ์ ์คํ๋ง ํต์ฌ ๊ฐ๋ ๊ณผ ๊ธฐ๋ฐ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์์
· BeanFactory, ApplicationContext, POJO, ์ ์ด์ ์ญ์ , ์์กด๊ด๊ณ ์ฃผ์
· ์ฑ ์ด ์ ๋ช ํด์ง๊ณ , ๊ฐ๋ฐ์๋ค์ด ์ฑ ์ ์์ ์ฝ๋๋ฅผ ํ๋ก์ ํธ์ ์ฌ์ฉ
· ์ฑ ์ถ๊ฐ ์งํ Juergen Hoeller(์ ๊ฒ ํ ๋ฌ), Yann Caroff(์ ์นด๋กํ)๊ฐ ๋ก๋ ์กด์จ์๊ฒ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์ ์
· ์คํ๋ง์ ํต์ฌ ์ฝ๋์ ์๋น์๋ ์ ๊ฒ ํ ๋ฌ๊ฐ ์ง๊ธ๋ ๊ฐ๋ฐ
· ์คํ๋ง ์ด๋ฆ์ ์ ํต์ ์ธ J2EE(EJB)๋ผ๋ ๊ฒจ์ธ์ ๋์ด ์๋ก์ด ์์(๋ด)์ด๋ผ๋ ๋ป์ผ๋ก ์ง์
์คํ๋ง์ ์ญ์ฌ - ๋ฆด๋ฆฌ์ฆ
2003๋ ์คํ๋ง ํ๋ ์์ํฌ 1.0 ์ถ์ - XML
2006๋ ์คํ๋ง ํ๋ ์์ํฌ 1.0 ์ถ์ - XML ํธ์ ๊ธฐ๋ฅ ์ง์
2009๋ ์คํ๋ง ํ๋ ์์ํฌ 1.0 ์ถ์ - ์๋ฐ ์ฝ๋๋ก ์ค์
2013๋ ์คํ๋ง ํ๋ ์์ํฌ 1.0 ์ถ์ - ์๋ฐ8
2014๋ ์คํ๋ง ๋ถํธ 1.0 ์ถ์
2017๋ ์คํ๋ง ํ๋ ์์ํฌ 5.0, ์คํ๋ง ๋ถํธ 2.0 ์ถ์ - ๋ฆฌ์ํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์ง์
2020๋ ์คํ๋ง ํ๋ ์์ํฌ 5.2x, ์คํ๋ง ๋ถํธ 2.3.x
์คํ๋ง์ด๋?
์คํ๋ง์ ์ด๋ค ํน์ ํ ํ๋๊ฐ ์๋ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ์ ๋ค์ ๋ชจ์์ด๋ผ๊ณ ํ ์ ์๋ค.

spring.io ํ์ด์ง์ projects๋ฅผ ํ์ธํ๋ฉด ๋ ๋ง์ ํ๋ก์ ํธ๋ค์ ํ์ธํ ์ ์๋ค.
Spring makes Java simple.
Level up your Java code and explore what Spring can do for you.
spring.io
์ฌ๊ธฐ์ ํต์ฌ์ธ ๊ธฐ์ ์ด Spring Framework์ด๋ฉฐ, ๋ชจ๋ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ฃผ๋๊ฒ Spring Boot์ด๋ค.
์คํ๋ง ํ๋ ์์ํฌ
ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ญ์ , JDBC, ORM ์ง์, XML ์ง์
๊ธฐ์ ํตํฉ: ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ ์ ๊ทผ, ์ค์ผ์ค๋ง
ํ ์คํธ: ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
์ธ์ด: ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด์ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ
์คํ๋ง ๋ถํธ
· ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์, ์ต๊ทผ์๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
· ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑ
· Tomcat ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋จ
· ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ ์ ๊ณต
· ์คํ๋ง๊ณผ 3rd parth(์ธ๋ถ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑ
· ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต
· ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์
์คํ๋ง์ด๋ผ๋ ๋จ์ด๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋๋ค.
์คํ๋ง DI ์ปจํ ์ด๋ ๊ธฐ์ , ์คํ๋ง ํ๋ ์์ํฌ ์ด๋ ๊ฒ ์ฌ์ฉ๋ ์๋ ์์ง๋ง,
๋๋ถ๋ถ ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ๋ก ์ฌ์ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ๋ง์ ํต์ฌ ๊ฐ๋ , ์ปจ์ ์ ๋ฌด์ ์ผ์ง๋ฅผ ์๊ฐํด์ผ ํ๋ค.
์คํ๋ง์ ๊ฐ๋ ๊ณผ ์ปจ์ ์ ๋ชจ๋ฅด๊ณ ๊ธฐ์ ์ ๋ฐฐ์ด๋ค๋ ๊ฑด API ์ฌ์ฉ๋ฒ๋ง ์์งํ๋ ๊ฒ์ด๋ค.
์คํ๋ง ํต์ฌ
· ์คํ๋ง์ ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ
· ์๋ฐ ์ธ์ด์ ๊ฐ์ฅ ํฐ ํน์ง - ๊ฐ์ฒด ์งํฅ ์ธ์ด
· ์คํ๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ
· ์คํ๋ง์ ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ
์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
· ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์,
์ฆ "๊ฐ์ฒด"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๋ค.
๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.(ํ๋ ฅ)
· ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค๋ ๊ฑด ๋ง์น ๋ ๊ณ ๋ธ๋ญ์ ์กฐ๋ฆฝํ๋ฏ์ด, ํค๋ณด๋, ๋ง์ฐ์ค ๊ฐ์ ๋ผ์ฐ๋ฏ์ด,
์ปดํจํฐ ๋ถํ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๊ฐ์ฒด์งํฅ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ ๋ฐฉ๋ฒ์ด๋ค. ์ด๊ฒ์ ๊ฐ์ฒด์งํฅ์ ํต์ฌ์ธ ๋คํ์ฑ์ด๋ค.
๋คํ์ฑ์ ์ค์ธ๊ณ๋ก ๋น์ ๋ฅผ ํ๋ฉด ์ด์ ์๊ฐ ์๊ณ ์๋์ฐจ๊ฐ ์๋ ์ํฉ์์ ์๋์ฐจ ๊ธฐ์ข ์ ์ด๋ค ๊ฒ์ผ๋ก ๋ฐ๊พธ๋
์๋์ฐจ๋ผ๋ ์ญํ ์ ํ๋๋ฐ์ ์์ด์ ์ด์ ์๋ ๋ชจ๋ ์ด์ ์ด ๊ฐ๋ฅํ๋ค. ๋ํ ๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๋ฎค์ง์ปฌ์ ์ฐ๋๋ค๋
๊ฐ์ ์ ํ๋ฉด, ๋ก๋ฏธ์ค ์ญํ ์ ๋๊ฐ ํ๋ ์ค๋ฆฌ์ฃ ์ญํ ์ ๋๊ฐํ๋ ๊ณต์ฐ์ ์ด๋ฃจ๋ ๋ฐ ์์ด์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ค๋ฆฌ์ฃ์ ๋ก๋ฏธ์ค๊ฐ ๋๊ฐ ๋๋์ง ์ํฅ์ ๋ฐ์ง ์์ผ๋ฉด ๋ฐ๋์ ์ํฉ ๋ํ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ด๋ ๊ฒ ์๋์ฐจ๋ผ๋ ์ญํ , ๋ก๋ฏธ์ค๋ผ๋ ์ญํ ์ฒ๋ผ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋คํ์ฑ์ ํต์ฌ์ด๋ค.
์๋ฐ ์ธ์ด์์์ ๋คํ์ฑ์ ์ญํ ์ ์ธํฐํ์ด์ค์ด๊ณ , ๊ตฌํ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด์ด๋ค.
๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋์๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํด์ผ ํ๋ค.
๊ฐ์ฒด ์ค๊ณ ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋คํ์ฑ์ ๋ณธ์ง
· ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
· ๋คํ์ฑ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ํ๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ์์ ์์ํด์ผ ํ๋ค.
· ํด๋ผ์ด์ธํธ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ์ ๋ฆฌ
· ์ค์ธ๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ด๋ผ๋ ํธ๋ฆฌํ ์ปจ์ ์ ๋คํ์ฑ์ ํตํด ๊ฐ์ฒด ์ธ์์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์
· ์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ด
· ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ
· ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
· ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ํ๊ณ
· ์ญํ (์ธํฐํ์ด์ค) ์์ฒด๊ฐ ๋ณํ๋ฉด, ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ค.
→ ์๋์ฐจ๋ฅผ ๋นํ๊ธฐ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด?
→ ๋๋ณธ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด?
→ USB ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด?
· ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์
๊ฐ์ฒด์งํฅ์ ๊ฝ์ ๋คํ์ฑ์ด๋ผ๊ณ ๋งํ ์ ์๋ค. ์คํ๋ง์ ์ด๋ฌํ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
์คํ๋ง์์ ์ด์ผ๊ธฐํ๋ ์ ์ด์ ์ญ์ (IoC), ์์กด๊ด๊ณ ์ฃผ์ (DI)์ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ
๋ค๋ฃฐ ์ ์๋๋ก ์ง์ํ๋ค. ์คํ๋ง์ ๋ง์น ๋ ๊ณ ๋ธ๋ญ ์กฐ๋ฆฝํ๋ฏ์ด ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
SOLID
ํด๋ฆฐ ์ฝ๋๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ๋ฆฌ
SRP: ๋จ์ผ ์ฑ ์ ์์น (single responsibility principle)
OCP: ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed principle)
LSP: ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov substitution principle)
ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface segregation principle)
DIP: ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
SRP ๋จ์ผ ์ฑ ์ ์์น - Single responsibility principle
ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
์ฌ๊ธฐ์ ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ๋ชจํธํ๋ค. ํด ์ ์๊ณ , ์์ ์ ์๋ค. ๋ํ ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
๊ฐ์ฅ ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด UI ๋ณ๊ฒฝ, ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌํ ๊ฒ์ด ์๋ค.
OCP ๊ฐ๋ฐฉ-ํ์ ์์น - Open/closed principle
์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
๊ธฐ๋ฅ์ ํ์ฅํ๋๋ฐ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋๋ฐ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ์๋นํ ์์ํ๋ค.
๋คํ์ฑ์ ์๊ฐํด๋ณด์. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์
๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ค. ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ๋ฅผ ์๊ฐํด์ผ ํ๋ค.
์ด๋ ๊ฒ OCP ์์น์ ์งํค๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ง๋ง, ๋ฌธ์ ์ ์ด ์๋ค.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๋ค.
private MemberRepository memberRepository = new MemoryMemberRepository(); → ๊ธฐ์กด ์ฝ๋
private MemberRepository memberRepository = new JdbcMemberRepository(); → ๋ณ๊ฒฝ ์ฝ๋
๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ถ๋ช ๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง OCP์์น์ ์งํฌ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น - Liskov substitution principle
ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ์ ์์ด์ผ ํ๋ค.
๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น,
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ์ด์ผ๊ธฐ์ด๋ค.
์๋ฅผ ๋ค๋ฉด ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP์๋ฐ, ๋๋ฆฌ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผ ํ๋ค.
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น - Interface segregation principle
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
· ์๋์ฐจ ์ธํฐํ์ด์ค → ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
· ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ → ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๋ฉฐ, ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
DIP ์์กด๊ด๊ณ ์ญ์ ์์น - Dependency inversion principle
ํ๋ก๊ทธ๋๋จธ๋ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค." ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.
์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป์ด๋ค.
์์์ ์ด์ผ๊ธฐํ ์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง๋ค.
๊ทธ๋ฐ๋ฐ OCP์์ ์ค๋ช ํ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
์ฌ๊ธฐ์ ์์กด์ด๋ผ๋ ํํ์ ์๊ณ ์์ผ๋ฉด ์์กดํ๋ค๋ผ๊ณ ํํํ๋ค.
๊ทผ๋ฐ OCP์ ์์ ์ธ MemberService ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๊ณ ์๋ค.
MemberRepository m = new MemoryMemberRepository(); ์ด๊ฒ์ DIP ์๋ฐ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ญ๊ฐ ๋ ํ์ํ๋ค.
์ ๋ฆฌ
· ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ
· ๋คํ์ฑ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๋ค.
· ๋คํ์ฑ ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
· ๋คํ์ฑ ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๋ค.
· ๋ญ๊ฐ ๋ ํ์ํ๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์คํ๋ง ์ด์ผ๊ธฐ์ ์ ๊ฐ์ฒด ์งํฅ ์ด์ผ๊ธฐ๊ฐ ๋์ค๋๊ฐ?
· ์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP,DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์
→ DI(Dependency Injection):์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
→ DI ์ปจํ ์ด๋ ์ ๊ณต
· ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ ํ์ฅ
· ์ฝ๊ฒ ๋ถํ์ ๊ต์ฒดํ๋ฏ์ด ๊ฐ๋ฐ
์๋ ์ด๋ค ๊ฐ๋ฐ์๊ฐ ์ข์ ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ์ ํ๋ ค๊ณ OCP, DIP ์์น์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ณด๋, ๋๋ฌด ํ ์ผ์ด ๋ง์๋ค.
๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฌ๋ค. ๊ทธ๋์ ํ๋ ์์ํฌ๋ก ๋ง๋ค์ด๋ฒ๋ ธ๋ค.
์์ํ๊ฒ ์๋ฐ๋ก OCP, DIP ์์น๋ค์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.( DI ์ปจํ ์ด๋ )
DI ๊ฐ๋ ์ ๋ง๋ก ์ค๋ช ํ๊ธฐ๋ ํ๋ค๋ค. ์ฝ๋๋ก ์ง ๋ด์ผ์ง ํ์์ฑ์ ์๊ฒ ๋๋ค.
์ ๋ฆฌ
๋ชจ๋ ์ค๊ณ์๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ผ ํ๋ค.
์๋์ฐจ, ๊ณต์ฐ์ ์์์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ ๊ณต์ฐ์ ์ค๊ณํ๋ฏ์ด ๋ฐฐ์ญ๋ง ๋ง๋ค์ด๋๊ณ ,
๋ฐฐ์ฐ๋ ์ธ์ ๋ ์ง ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ค.
์ด์์ ์ผ๋ก๋ ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ๋๊ฒ ์ข๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ฉด ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ ,
ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํฉํฐ๋งํด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ถ์ฒ: [์ธํ๋ฐ] ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ