- JPA๋ ๋ฌด์์ธ๊ฐ?
JPA๋ ORM ๊ธฐ๋ฐ์ ์๋ฐ API์ ๋๋ค JPA๋ ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๋ณด๋จ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ์์ ์ ๋์ฑ ์ง์คํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋๊ณ DB ์คํค๋ง ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์์ผ๋ฉฐ ๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ด๋๋ฐ ๋์์ ์ค๋๋ค.
โ๏ธ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋์์ ์ฃผ๋๊ฐ ?
์ํฐํฐ ๋งคํ์ด๋ JPQL, ์บ์ฑ ๋ฑ์ ๋์์ ์ฃผ๊ณ ์์ต๋๋ค.
- Spring IoC(Inversion of Control)์ DI(Dependency Injection)์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. ์ด๋ค์ด ์ ์ค์ํ๋ฉฐ ์ด๋ค ์ฅ์ ์ ์ ๊ณตํ๋์? โญ๏ธ ์ ์ฌ์ฉํ๋๊ฐ? โญ๏ธ
์ฝ๋ ๊ฐ์ํ๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ๋๊ณ ์์กด์ฑ์ ์ฝ๊ฒ ํ ์คํธ ํ ์ ์๊ฒ ๋์ด ๋จ์ ํ ์คํธ๊ฐ ์ฌ์์ง๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ด ํ์ฅ์ฑ๊ณผ ๊ฐ์ฒด๊ฐ์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ฑ๊ฒจ ์ ์ง๋ณด์์ ํ์ฅ์์ ์ข์ต๋๋ค.
Ioc๋ ์ ์ด์ ์ญ์ ์ ๋ปํ๋๋ฐ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์๋ ํ๋ ์์ํฌ๊ฐ ๊ด๋ฆฌํ๋ ์ํํธ์จ์ด ๋์์ธ ์์น์ ๋๋ค.
DI๋ Ioc๊ฐ ๊ตฌํํ๋ ์ค์ ์ ์ธ ๋ฐฉ๋ฒ์ด๋ฉฐ, ๊ฐ์ฒด๊ฐ ํ์๋กค ํ๋ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
DI๋ ์ ์ , ๋์ ์์กด๊ด๊ณ๊ฐ ์๋๋ฐ ์ ์ ์ import๋ง ๋ณด๊ณ ํด๋์ค์ ๊ด๊ณ๋ฅผ ํ๋จ์ด ๊ฐ๋ฅํ๊ณ ๋์ ์ ์ฝ๋๊ฐ ์คํํ๊ธฐ ์ ๊น์ง ์์กด ๊ด๊ณ๋ฅผ ์์ ์์ต๋๋ค.
Ioc๊ฐ ๋ ๋์ ๊ฐ๋ ์ด๊ณ DI๋ ๋ ์ธ๋ถ์ ์ธ ๊ฐ๋ ์ ๋๋ค.
์ค์์ฑ๊ณผ ์ฅ์ ์ ๋ฎ์ ๊ฒฐํฉ๋, ํ ์คํธ ์ฉ์ด์ฑ, ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ, ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์์ต๋๋ค.
- Spring Bean์ด๋ ๋ฌด์์ด๋ฉฐ, Bean์ ์๋ช ์ฃผ๊ธฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. Bean์ ์ค์ฝํ ์ข ๋ฅ์ ๊ฐ๊ฐ์ ํน์ง๋ ์ธ๊ธํด์ฃผ์ธ์. ์คํ๋ง ํน์ง์ IoC ์ ์ด์ ์ญ์ ์ด ์์ต๋๋ค. Bean ์ด์ ์๋ ์ฌ์ฉ์๊ฐ ์ง์ new ์ฐ์ฐ์ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ์ต๋๋ค IoC๊ฐ ์ ์ฉ๋๊ณ ์ด๋ฐ ๊ฐ์ฒด ์์ฑ๊ณผ ์ฌ์ฉ์์ ์ ์ด๊ถ์ ์คํ๋ง์๊ฒ ๋๊ฒจ์ ์ฌ์ฉ์๋ ์ง์ new ๋ฅผ ์ด์ฉํด ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์๋ ์คํ๋ง์ ์ํด ๊ด๋ฆฌ ๋ฐ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ Bean์ด๋ผ ํฉ๋๋ค.
๋น์ ์๋ช ์ฃผ๊ธฐ๋ ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ > ์คํ๋ง ๋น ์์ฑ > ์์กด ๊ด๊ณ ์ฃผ์ > ์ด๊ธฐํ ์ฝ๋ฐฑ > ์ฌ์ฉ > ์๋ฉธ์ ์ฝ๋ฐฑ > ์คํ๋ง ์ข ๋ฃ ์ผ๋ก ๋๊ณ ์์ต๋๋ค.
์ค์ฝํ ์ข ๋ฅ์ ํน์ง์ผ๋ก Singleton ๊ธฐ๋ณธ์ค์ฝํ์ด๋ฉฐ ์คํ๋ง ์ปจํ ์ด๋๋น ํ๋์ ์ธ์คํด์ค๋ง ์์ฑํ๋ค์ด๋ฉฐ ๋ชจ๋ ์์ฒญ์ด ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํฉ๋๋ค.
prototype
์์ฒญํ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉฐ, ๋
๋ฆฝ์ ์ธ ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค
request HTTP ์์ฒญ๋น ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์น์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ฉ๋๋ค
session HTTP ์ธ์ ๋น ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉฐ ์น์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
application servletContext ๋น ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉฐ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
websocket ์น์์ผ ์ธ์ ๋น ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- Spring AOP(Aspect-Oriented Programming)๋ ๋ฌด์์ธ๊ฐ์? AOP์ ์ฃผ์ ๊ฐ๋ (Aspect, Advice, Pointcut, Join Point)์ ๋ํด ์ค๋ช ํ๊ณ , ์ด๋ค ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ์๋ฅผ ๋ค์ด์ฃผ์ธ์.
AOP๋ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ์ด๋ค ๋ก์ง์ ๊ธฐ์ค์ผ๋ก ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ ์ผ๋ก ๋๋์ด ๋ณด๊ณ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํํ๊ฒ ๋ค๋ ๊ฒ ์ ๋๋ค.
AOP ์ฃผ์ ๊ฐ๋ ์ Aspect ์ฌ๋ฌ ํด๋์ค์ ๊ฑธ์ณ ์๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํ ํ๋ ๊ฒ์ ๋๋ค Advice ์กฐ์ธํฌ์ดํธ์์ Aspect๊ฐ ์ทจํ ๋์์ ๋๋ค Pointcut ์ค์ ๋ก aspect๋ฅผ ์ ์ฉํ ์กฐ์ธํฌ์ธํธ๋ฅผ ์ ๋ณํ๋ ํํ์์ ๋๋ค. Join Point ํ๋ก๊ทธ๋จ ์คํ ์ค aspect ๋ฅผ ์ ์ฉํ๋ ์ง์ ์ ๋๋ค.
AOP๋ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ๋๋๋ฐ ๋ก๊น , ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ณด์ ๋ฐ ์ธ์ฆ์ด ์๋๋ฐ ๋ก๊น ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ๋ก๊น ์ ์ ์ฉํ๊ณ , ํธ๋์ญ์ ์ @Transaction ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฐ๋จํ ํ์ฉํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์์, ์ปค๋ฐ, ๋กค๋ฐฑํ๋ ๋ก์ง์ ๋ถ๋ฆฌํ ๋ ๋ฑ์ ์์ผ๋ฉฐ ๋ณด์ ๋ฐ ์ธ์ฆ์ Spring Security ์์ AOP ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค.
- Spring MVC ์ํคํ ์ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. DispatcherServlet์ ์ญํ ๊ณผ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ์ ๋ํด ์์ธํ ์ค๋ช ํด์ฃผ์ธ์.
MVC ์ํคํ ์ณ๋ Model View Controller๋ก Model์ DB์ ์ํธ์์ฉํ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ์ ๋๋ค View๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด์ฌ์ง๋ ๊ฒฐ๊ณผํ๋ฉด์ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ด๊ณ Controller๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๊ทธ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ณ ์ด๋ค ๋ก์ง์ ์คํ์ํฌ ๊ฒ์ธ์ง ์ ์ดํ๋ ๋ชจ๋์ ์ญํ ์ ํฉ๋๋ค.
DispatcherServlet์ front Controller๋ก๋ ๋ถ๋ฆฌ๊ณ ์์ต๋๋ค. '/' ๊ฒฝ๋ก์ ๋งคํํ์ฌ ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ๋งก๊ณ ์๋๋ฐ Mapping ์ด๋ ธํ ์ด์ ์ ํ์ฉํด ๋งคํํด๋์ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๋ก ์์ฒญ์ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
DispatcherServlet๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๊ณ (์ค์ ์ ์ด์ค) ํธ๋ค๋ฌ๋งคํ์ด ์๋ง์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ต๋๋ค ๊ทธ๋ฆฌ๊ณ ํธ๋๋งคํ์ ์คํํ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ์ฐพ์ต๋๋ค ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๋ฅผ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ธ๋ก์ DispatcherServlet ๋ฐํ ๋ทฐ๋ฆฌ์กธ๋ฒ๋ ์๋ง์ JSP ํ์ผ์ ์ฐพ์ต๋๋ค. ๋ทฐ๋ JSP ํ์ผ์ ๋ชจ๋ธ์ ์ ๋ณด๋ฅผ ํ ๋๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค
- Spring์์ ํธ๋์ญ์ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? ์ ์ธ์ ํธ๋์ญ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ํธ๋์ญ์ ์ ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
์ ์ธ์ ํธ๋์ญ์ ๊ด๋ฆฌ, ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ํธ๋์ญ์ , ํธ๋์ญ์ ์์ฑ ์ค์ , ํธ๋์ญ์ ๊ด๋ฆฌ์ ์ค์ ๋ฑ์ด ์์ต๋๋ค.
์ ์ธ์ ํธ๋์ญ์ ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ XML ์ค์ ์ ํตํ ๋ ๊ฑฐ์ ๋ฐฉ์์ด ์์ต๋๋ค. ๋๊ฒ ์ด๋ ธํ ์ด์ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค ์ ์ธ์ ํธ๋์ญ์ ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ ์๋๋ฐ ๊ทธ๋ก์ธํ ์ฝ๋ ๊ฐ๊ฒฐ์ฑ๊ณผ ์ ์ง ๋ณด์์ ํฐ ๊ฐ์ ์ ๊ฐ๊ณ ์์ต๋๋ค. ๊ฐ๋จํ๊ณ ๋ช ํํ ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ ์ผ๋ฐ์ ์ด ์ํฉ์์ ์ ์ธ์ ํธ๋์ญ์ ์ ์ฌ์ฉํฉ๋๋ค
ํ๋ก๊ทธ๋๋ฐ์ ํธ๋์ญ์ ์ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์ง์ ์ค๊ณํด์ผํฉ๋๋ค. ๋ฌผ๋ก ๋ ์ธ๋ฐํ ํธ๋์ญ์ ์ ์ด๊ฐ ๊ฐ๋ฅํ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ก ์ธํ ์ฝ๋์ ๋ณต์กํด์ง ์ ์๋ ๋จ์ ์ ๊ฐ๊ณ ์์ต๋๋ค. ํธ๋์ญ์ ์ ๊ฒฝ๊ณ๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํด์ผํ ๋ ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋, ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํธ๋์ญ์ ๋์์ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํฉ๋๋ค.
- Spring Security์ ์ฃผ์ ํน์ง๊ณผ ์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ(Authorization) ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Spring security์ ์ฃผ์ ํน์ง์ผ๋ก๋ ํฌ๊ด์ ์ธ ๋ณด์ ์๋ฃจ์ , ์ ์ฐํ ์ค์ , ๋ค์ํ ์ธ์ฆ ๋ฐฉ์์ ์ง์ํ๊ณ ์ธ์ ๊ด๋ฆฌ์ CSRF, XSS๋ฑ ์น ๋ณด์ ์ํ ๋์์ด ์์ต๋๋ค.
์ธ์ฆ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง์ ํ์ธ ๊ณผ์ ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์์ด๋์ ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๋ฉด (credentials) AuthenticationManager๊ฐ ์ธ์ฆ ๊ฒ์ฆ ํ ๋ค ์ฑ๊ณต ์ ์ธ์ฆ ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ SecurityContext์ ์ ์ฅํฉ๋๋ค.
์ธ๊ฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ธ๋ฐ ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ํน์ URL๋ก ์ ๊ทผํ๋ ค๊ณ ํ ๋, AccessDecisionManager๊ฐ ํด๋น ์ฌ์ฉ์์ ๊ถํ๊ณผ ๋ฆฌ์์ค์ ํ์ํ ๊ถํ ๋น๊ตํ์ฌ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
JWT์ spring security์ ๋ํด ์ค๋ช
ํ๊ณ
์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ค๋ช
ํ๊ธฐ
์ํ ๋น์ ์ฅ ์ธ์ฆ, ๋ณด์ ๊ฐํ, ์ฑ๋ฅ ์ต์ ํ , ํฌ๋ก์ค ๋๋ฉ์ธ ์ธ์ฆ
์ด์ผ ์ฌ์ฉ ?
์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ JWT ํ ํฐ ์์ฑ ์์ฑ๋ ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋์ด ์ดํ ์์ฒญ์ Authorization ํค๋์ ํฌํจ
์ปค์คํ
ํํฐ๋ฅผ ๊ตฌํํด ์ํ๋ฆฌํฐ ํํฐ ์ฒด์ธ์ ์ถ๊ฐ
๋งค ์์ฒญ๋ง๋ค JWT ํ ํฐ์ ๊ฒ์ฆ ํ ์ ํจํ ๊ฒฝ์ฐ Authentication ๊ฐ์ฒด ์์ฑ SecurityContext ์ค์
Access Refresh Token ์ผ๋ก ์ก์ธ์ค ๋ง๋ฃ์ ๋ฆฌํ๋ ์๋ฅผ ์ฌ์ฉํด ์๋ก์ด Access Token ๋ฐ๊ธ๋ฐ๋ ํ๋ก์ธ์ค ๊ตฌํ
๋ํ ํ ํฐ ๋ง๋ฃ ์๊ฐ์ ์ ์ ํ ์ค์ ํด ๋ณด์ ๊ฐํ ๋ฐ HTTPS ์ฌ์ฉํด ํ ํฐ ์ ์ก์ ์ํธํ
- Spring Boot๋ ๋ฌด์์ด๋ฉฐ, Spring Framework์์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์? Spring Boot์ ์๋ ๊ตฌ์ฑ(Auto-configuration) ์๋ฆฌ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Spring boot๋ ๋ ๋ฆฝ์ ์ด๊ณ ์คํ ๊ฐ๋ฅํ Spring ๊ธฐ๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ์ ๋๋ค. ๋ณต์กํ ์ค์ ์์ด ๋น ๋ฅด๊ฒ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์ต๋๋ค.
-> ์ฃผ์ ์ฐจ์ด์ ์ ํฌ๊ฒ ์ค์ ์ ๋ณต์ก์ฑ, ์๋ฒ, ์์กด์ฑ, ์ ์ฐ์ฑ, ๋ง์ดํฌ๋ก์๋น์ค, ํ์ต๊ณก์ ๋ฑ์ด ์์ต๋๋ค. ํต์ฌ์ ์ผ๋ก boot๋ ์๋ ๊ตฌ์ฑ, ์์กด์ฑ ๊ด๋ฆฌ ์ต์ํ, ๋ด์ฅ ์๋ฒ ์ ๊ณต์ด ์์ผ๋ฉฐ ๊ฐ๋ฐ ๋ฐฉ์ ์ญ์ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ค์ ๊ณผ ๋๋ถ๋ถ์ ์ค์ ์ด ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ด ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
framework๋ XML ๊ธฐ๋ฐ์ Java ์ค์ ํด๋์ค๊ฐ ํ์ํ๊ณ ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ ์ฐ๊ฒฐ๊ณผ ์๋์ผ๋ก ๊ตฌ์ฑํด์ผํ๋ ์ ๋ชจ๋ ์์กด์ฑ์ ์ง์ ๊ด๋ฆฌํด์ผํฉ๋๋ค. ๋ฌผ๋ก ์ธ๋ฐํ ์์ ์ด ๊ฐ๋ฅํ์ง๋ง ๊ฐ๋ฐ์์ ์์ ๋๋ฌด ๋ง์ด ์๊ธฐ๋ ์ ์ด ์์ต๋๋ค.
์๋ ๊ตฌ์ฑ ์๋ฆฌ๋ ์กฐ๊ฑด๋ถ ๊ตฌ์ฑ๊ณผ ์ฐ์ ์์์ ํต์ฌ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ @EnableAutoConfiguration์ ๊ฐ์งํ๊ณ Spring.factoriesํ์ผ์์ ๊ตฌ์ฑ ํด๋์ค ๋ชฉ๋ก์ ๋ก๋ ๊ฐ ์๋ ๊ตฌ์ฑ ํด๋์ค์ ์กฐ๊ฑด์ ํ๊ฐํ๊ณ ์กฐ๊ฑด ๋ง์กฑ ์ ํด๋น ๊ตฌ์ฑ ์ ์ฉ ํฉ๋๋ค.
- Spring Data JPA๋ ๋ฌด์์ธ๊ฐ์? JPA์ Hibernate์์ ๊ด๊ณ, ๊ทธ๋ฆฌ๊ณ Spring Data JPA๊ฐ ์ ๊ณตํ๋ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
Data JPA๋ ๊ธฐ์กด JPA๋ฅผ ํ ๋จ๊ณ ๋ ์ถ์ํ ์์ผ ๊ฐ๋ฐ ์ฉ์ด์ฑ์ ์๋นํ ์ฌ๋ ค์ฃผ๋ ์ธํฐํ์ด์ค์ ๋๋ค. Data Jpa๋ repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต์ฃผ๋๋ฐ ์ฌ์ฉ์๊ฐ ๋ ํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ์ ํด์ง ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์ ๋ ฅํ๋ฉด, ์คํ๋ง์ด ์์์ ํด๋น ๋ฉ์๋์ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด Bean์ผ๋ก ๋ฑ๋กํด์ค๋๋ค.
Hibernate๋ JPA์ ๊ตฌํ์ฒด ์ ๋๋ค. JPA์ hibernate๋ ๋ง์น ์๋ฐ์ ์ธํฐํ์ด์ค์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ ๊ด๊ณ์ ๋๋ค.
Data JPA์ ๊ณตํ๋ ์ฃผ์๊ธฐ๋ฅ์ ์์ ์ธ๊ธํ Repository ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ด๋ฆ์ ํตํ ์ฟผ๋ฆฌ ์์ฑ ํ์ด์ง, ์ ๋ ฌ๊ณผ @Query ์ด๋ ธํ ์ด์ , Auditing, Specification, ๊ด๊ณ ๋งคํ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋งคํ, ์ปค์คํ Repository ๊ตฌํ ์ด ์์ต๋๋ค.
Repo์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ์ ์ธ CRUD ์ฐ์ฐ์ ์ํ ๋ฉ์๋ ์๋ ๊ตฌํ (CrudRepo, JpaRepo) ์ฌ์ฉ์๊ฐ ๋ ํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ์ ํด์ง ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์ ๋ ฅํ๋ฉด, ์คํ๋ง์ด ์์์ ํด๋น ๋ฉ์๋์ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด Bean์ผ๋ก ๋ฑ๋ก
@Query ์ด๋ ธํ ์ด์ ์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ์ ๊ธฐ๋ฅ ์ ๊ณตํ๊ณ
์ด๋ ธํ ์ด์ ์ ์ด์ฉํ ์๋ ์๊ฐ ๊ธฐ๋ก, ๋์ ์ฟผ๋ฆฌ ์์ฑ์ ์ํ ์ธํฐํ์ด์ค ์ ๊ณต, @OneToMany ๊ฐ์ ์ํฐํฐ ๊ฐ์ ๊ด๊ณ ์ ์ ํด๋์ค ๊ธฐ๋ฐ์ DTO ํ๋ก์ ์ ์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ํ๋ก์ ์ ์ ์ ๊ณตํ๊ณ ์ปค์คํ ๋ ํฌ ๊ตฌํ์ ํตํ ํน์ ๋ ํฌ์งํ ๋ฆฌ์ ์ฌ์ฉ์ ์ ์ ๊ตฌํ ๊ธฐ๋ฅ ๋ฑ์ด ์์ต๋๋ค.
- @Controller, @Service, @Repository ์ด๋ ธํ ์ด์ ์ ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ์ ์ญํ ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. ์ด๋ค์ด ์ด๋ป๊ฒ Spring์ ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋๋์?
๏ฟฝ์ผ๋จ ์ปจํธ๋กค๋ฌ ์๋น์ค ๋ ํฌ์งํ ๋ฆฌ ์ด๋ ธํ ์ด์ ์ ํฐ ์ฐจ์ด์ ์ ๋ํด์ ์์นํ๋ ๊ณ์ธต์ ๋ํด ๋จผ์ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ปจํธ๋กค๋ฌ๋ ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ ์ฆ, ์ต์์ ๊ณ์ธต์ ์์นํ๊ณ ์๋น์ค๋ ์ค๊ฐ์ธ ๋น์ฆ๋์ค ๊ณ์ธต ๋ ํฌ์งํ ๋ฆฌ๋ ์ตํ์ ๋ฐ์ดํฐ ๊ณ์ธต์ ์์นํฉ๋๋ค.
๋ํ ์ฃผ์ ์ญํ ์ ์ปจํธ๋กค๋ฌ๋ ์น ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๊ณ URL ๋งคํ ๋ฐ ๋ทฐ ๋ฐํ ์ฒ๋ฆฌ ์ค์ ์ ๋๋ฉฐ ์๋น์ค๋ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ์ ํธ๋์ญ์ ๊ด๋ฆฌ์ ์ค์ ์ด ์๊ณ ๋ ํฌ์งํ ๋ฆฌ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง ์ฒ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ฐ ์ค์ ์ด ์์ต๋๋ค.
์์กด์ฑ ์ฃผ์ ํจํด์ ์ฐจ์ด๋ ์๋๋ฐ @์ปจํธ๋กค๋ฌ๋ @์๋น์ค์ ์์กดํ๊ณ @์๋น์ค๋ @๋ ํฌ์งํ ๋ฆฌ์ ์์กด @๋ ํฌ์งํ ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์คํ๋ง ์ปดํฌ๋ํธ์ ์์กดํ์ง ์์์ ์ด ํจํด์ ๊ณ์ธต๊ฐ ๋จ๋ฐฉํฅ ์์กด์ฑ์ ๊ฐ์ ํฉ๋๋ค.
AOP ์ ์ฉ ์ฐจ์ด์ผ๋ก๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค ์ปจํธ๋กค๋ฌ๋ ์ฃผ๋ก ๋ก๊น ๊ณผ ๋ณด์ ๊ด๋ จ AOP์ด๊ณ ์๋น์ค๋ ํธ๋์ญ์ ๊ด๋ฆฌ AOP, ๋ ํฌ์งํ ๋ฆฌ๋ ์ฃผ๋ก ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ด๋ จ AOP ์ ๋๋ค.
๋ ์ด์ด๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋๋ฐ ํฌ๊ฒ ๋์์ ์ฃผ๊ฒ๋ฉ๋๋ค. ํนํ ์์กด์ฑ ์ฃผ์ ํจํด๊ณผ ๊ฐ ์ด๋ ธํ ์ด์ ์ด ์์นํ๋ ๊ณ์ธต์ผ๋ก ์ธํด ๊ฐ ๊ณ์ธต์ ์ ์์น์์ ์ฑ ์์๋ง ์ง์คํ๊ณ ์์กด์ฑ ๋จ๋ฐฉํฅ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ฒ ๋ฉ๋๋ค.
- Spring์ ํ๋กํ์ผ(Profile) ๊ธฐ๋ฅ์ ๋ฌด์์ด๋ฉฐ ์ด๋ค ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋์? ํ๋กํ์ผ์ ์ค์ ํ๊ณ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. ํน์ ํ๊ฒฝ์ด๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ Bean ์ค์ ์ด๋ ์์ฑ์ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค ๊ฐ๋ฐ ํ ์คํธ ์ด์ ํ๊ฒฝ๋ณ ๋ค๋ฅธ ์ค์ ์ ์ฉํด ๊ฐ ํ๊ฒฝ์ ๋ง๋ ์ํฉ ๋ง๊ฒ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ๊น์ง ๊ณผ์ ์ ๋ ์ ์ฐํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋กํ์ผ ์ค์ ํ๊ณ ํ์ฑํ๋ ๋ฐฉ๋ฒ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฉ์์ผ๋ก JVM ์ต์ ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ๊ณผ application.properties์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์ ๋ฑ์ด ์๊ณ XML ์ค์ ํ๋ ๋ฐฉ์๊ณผ ์๋ฐ ์ค์ ์ผ๋ก config ํด๋์ค์ @Profile ์ด๋ ธํ ์ด์ ์ ์๋ฐ ์ค์ ํ๋ ๋ฐฉ์์ด ์์ต๋๋ค.
์ฌ์ฉํด๋ณธ์ ์๋์ ? local๊ณผ prod ํ๋กํ์ผ ์ค์ ์ผ๋ก ์ ์ฉํด ๊ฐ๋ฐ ๋จ๊ณ์์๋ ๊ด๊ณ์์ง๋ง ์ด์ ๋จ๊ณ์์ ์ฌ์ฉ์์๊ฒ ๋ถํ์ํ ๋ ธ์ถ์ ์ค์ด๊ธฐ ์ํด ymlํ์ผ์ ์์ ํด์ ์ฌ์ฉํ์ต๋๋ค.