[Spring] Spring์ด๋?
๐ Spring Framwork
๐ฝ ๊ฐ์
`Spring Framwork`๋ ์คํ ์์ค ๊ธฐ๋ฐ์ `JAVA Web Application`์ ๊ฐ๋ฐํ ์ ์๋ Framwork์ธ ๊ฒ์ด์์. ์ฆ, JAVA์ ๊ธฐ์ ๋ค์ ๋ ์ฝ๊ฒ ์ด์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋ JAVA์์ ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ค์ ์งํฉ์ด๋ผ๊ณ ํ ์ ์๋ ๊ฒ์ด์์.
๐ Spring Boot
๐ฝ ๊ฐ์
`Spring Boot`๋ `Spring Framwork` ์์ `Spring`์ ๋ ์ฝ๊ฒ ์ด์ฉํ๋๋ก ์์ฉํ ๊ฐ๋ฅํ Application์ ๋ง๋ค ์ ์๋๋ก ๋๋ ๋๊ตฌ์ธ ๊ฒ์ด์์. `Spring Framwork`์ ์ด๊ธฐ์ ์ค์ ํด์ผ ํ ๊ฒ์ด ๋ง์ ๋จ์ ์ด ์๋๋ฐ, ์ด ๋จ์ ์ ๋ณด์ํ ๊ฒ์ด `Spring Boot`์ธ ๊ฒ์ด์์.
๐ฝ ํน์ง
Spring์ `๊ฒฝ๋ ์ปจํ ์ด๋`๋ก JAVA ๊ฐ์ฒด์ Library ๋ฑ์ ์ง์ ๊ด๋ฆฌํด์ฃผ๋ฉฐ, WAS(์: Tomcat)์ด ๋ด์ฅ ๋์ด ์์ด Application์ ์์ฝ๊ฒ ๊ตฌ๋ํ ์ ์๋๋ก ํด ์ฃผ๋ ๊ฒ์ด์์.
JAVA ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์๋ฉธ๊ณผ ๊ฐ์ `์๋ช ์ฃผ๊ธฐ(Life Cycle)`์ ๊ด๋ฆฌํ๊ณ , ํ์ํ ๊ฐ์ฒด๋ `Spring Container`์์ ์ฌ์ฉํ๋ ๋ฑ JAVA ๊ฐ์ฒด๋ฅผ ์ง์ `Spring` ์์์ ๊ด๋ฆฌํ ์ ์๋ ๊ฒ์ด์์.
`Spring`์ ๋ณต์กํ ํธ๋์ญ์ ์ Annotaion ํน์ XML์ ์ด์ฉํด ์ค์ ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ ์ํฉ์ ๋ง๋ Code๋ฅผ ์์ฑํ์ง ์์๋ ๋๊ฒ ๋์์ฃผ๋ ๊ฒ์ด์์.
`Spring`์ `Web Programming` ๊ฐ๋ฐ ํ์ค์ธ `MVC(Mode-View-Controller)` Pattern์ ์ด์ฉํ๋ต๋๋ค.
`Maven`, `Gradle`์ `Dependency`์ stater Library๋ง ์์ฑํด์ฃผ๋ฉด `Spring`์์๋ ์ง์ ์ค์ ํ๋ ์ด๊ธฐ ์์ ๋ค์ ์ค์ ์ ์๋์ ์ผ๋ก ํด์ฃผ๋ ๊ฒ์ด์์. ๋ํ starter Library๋ `Dependency`์ ํ์ํ Library๋ค์ Version ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ฃผ์ด Version์ ๋ง์ง ์๋ ์ค๋ฅ๋ฅผ ๋ง์์ฃผ๋ ๊ฒ์ด์์.
์ด๋, `Maven`์ด๋? JAVA์ฉ ํ๋ก์ ํธ ๊ด๋ฆฌ Tool ๋ฐ Build Tool๋ก JAVA์์๋ง ์ด์ฉ ๊ฐ๋ฅํ Tool์ธ ๊ฒ์ด์์. `Gradle` ๋ํ, ๊ด๋ฆฌ Tool์ด์ง๋ง, JAVA ์ด์ธ์๋ Python, C++๊ณผ ๊ฐ์ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ด์์.
`Spring Boot`๋ ๋จ๋ ์คํ ๊ฐ๋ฅํ Application์ ์์ฑํด ์ฃผ๋ ์น๊ตฌ์ธ ๊ฒ์ด์์.
๐ฆ IoC(Inversion of Control) - ์ ์ด์ ์ญ์
์ผ๋ฐ์ ์ผ๋ก JAVA๋ฅผ ๋ฐฐ์ธ ๋, ์ฐ๋ฆฌ๋ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ณ , ๊ฐ์ฒด์ Method๋ฅผ ํธ์ถํ๋ ๋ฑ ์ง์ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๋ ์์ (์: A ๊ฐ์ฒด๊ฐ B ๊ฐ์ฒด์ Method๋ฅผ ์ด์ฉํ๊ณ ์ถ๋ค๋ฉด A ๊ฐ์ฒด์์ B ๊ฐ์ฒด๋ฅผ ์ ์ธ)ํ๋ ๊ฒ์ด์์.
IoC๋ ์ด๋ ๊ฒ ์ด์ฉ์๊ฐ ์์ ์ ์ ์ดํ๋ ๊ฒ์ด ์๋ `Spring`์์ ์์กด์ฑ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ํ์ํ ๊ณณ์ ๋ฃ์ด ๊ธฐ์กด์ ์ด์ฉ์๊ฐ ๊ฐ์ก๋ ์ ์ด๊ถ์ `๋ค๋ฅธ ์ฃผ์ฒด`์๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ด์์.
๐ฆ DI(Dependency Injection) - ์์กด์ฑ ์ฃผ์
DI๋? ํ์๋ก ํ๋ ๊ฐ์ฒด๋ฅผ ์์ ์๊ฒ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋ ํ์๋ก ํ๋ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ(Spring)์์ ์์ฑํ์ฌ ์ด์ฉํ๋ ค๋ ๊ฐ์ฒด์ ์ฃผ์ ์์ผ ์ฃผ๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด์์.
์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์์กด์ฑ์ด ๋์ง๋ง, DI์ ๊ฐ์ด ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ฒ ๋๋ฉด ์์กด์ฑ์ ์ค์ผ ์ ์๊ฒ ๋๋ ๊ฒ์ด์์.
๐ฆ POJO(Plain Old Java Object)
POJS๋? ๋ง ๊ทธ๋๋ก ํ๋ฒํ๊ณ , ์ค๋๋ JAVA ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด์์. ์ด๋ `Spring`์์ ๊ฐ์ฒด๊ฐ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ ๋, ๋ณ๋์ API๋ฅผ ์ด์ฉํ์ง ์๊ณ , JAVA Code๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ ์ ์์์ ๋ปํ๋ ๊ฒ์ด์์. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ Code์ ์์ฑํ ๋, ํน์ Library๋, Container ๊ธฐ์ ์ ์ข ์๋์ง ์์ ์ ์๊ฒ ๋์์ฃผ๋ ๊ฒ์ด์์.
๐ฆ AOP(Aspect Oriented Programming)
AOP๋? ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์ค ํ ์ ์๋๋ก ๋ฐ๋์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ถ๋ถ(์: ํก๋จ ๊ด์ฌ์ฌ = cross-cutting concerns)์ Module๋ก ๋ถ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ์ ํจ๋ฌ๋ค์์ ์ผ์ปซ๋ ๊ฒ์ด์์. `Spring`์์๋ AOP๋ฅผ `AspectJ`์ ๋ฌธ๋ฒ์ ํตํด ๊ตฌํํ๋๋ฐ, ์ด๋ฅผ ํตํด ์๋์ ํจ๊ณผ๋ฅผ ์ป๋ ๊ฒ์ด์์.
โ ๊ฐ๋ฐ์๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ์ฌ ๊ฐ๋ฐ ์งํ ๊ฐ๋ฅ.
โ ํ๋ก์ ํธ๋ง๋ค ๋ค๋ฅธ ๊ด์ฌ์ฌ๋ฅผ ์ ์ฉํ ๋, ์ฝ๋์ ์์ ์ต์ํ.
โ ํ์๋ก ํ๋ ๊ด์ฌ์ฌ์ ์ ์ง๋ณด์๊ฐ ์ํํ๋๋ก Code ๊ตฌ์ฑ ๊ฐ๋ฅ.
๐ฝ Spring VS Spring Boot
`Spring Boot`๋ Tomcat๊ณผ ๊ฐ์ ๋ด์ฅ Server๊ฐ ์กด์ฌํ๋ ๊ฒ์ด์์. `Spring`์ ๊ฒฝ์ฐ Tomcat์ ํด๋นํ๋ jar ํ์ผ์ ์ง์ ๋ด๋ ค ๋ฐ์ ์ค์นํ๋ ๋ฑ์ ์์ ์ ํตํด ํ๋ก์ ํธ ๋ด์์ Server ์ค์ ๋ฐ Version ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ์ง๋ง, `Spring Boot`๋ ๋ด์ฅ Tomcat์ผ๋ก ์ธํด ์ค์น์ Version ๊ด๋ฆฌ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ๊ฒ์ด์์.
`Spring`์์๋ `Servlet-context`, `root-context`์ ๊ฐ์ XML ํ์ผ์ ์์ฑํ์ฌ Web๊ณผ ๊ด๋ จ๋ ์ค์ ๋ฐ ํ๋ก์ ํธ ๋ด ์์กด์ฑ์ ์ง์ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ์ผ๋, `Spring Boot`๋ ์๋์ผ๋ก ์์กด์ฑ์ ๊ด๋ฆฌํด์ฃผ๋ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ด์์.