- 1. Spring ํ๋ ์์ํฌ์ ๋ํด ๋งํด์ฃผ์ธ์.
- 2. ์ ์ด์ ์ญ์ (Inversion of Control, IoC)์ ๋ํด ๋งํด์ฃผ์ธ์.
- 3. ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)์ ๋ํด ๋งํด์ฃผ์ธ์.
- 4. ์คํ๋ง ๋น(Spring Bean)์ ๋ํด ๋งํด์ฃผ์ธ์.
- 5. ์คํ๋ง MVC์ ๋ํด์ ๋งํด์ฃผ์ธ์.
- 6. Spring Boot ํ๋ ์์ํฌ์ ๋ํด ๋งํด์ฃผ์ธ์.
- 6-1. ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ , ์ฃผ์ ํน์ง์ ๋ํด์ ๋งํด์ฃผ์ธ์.
- 6-2. ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- 6-3. @SpringBootApplication ์ด๋ ธํ ์ด์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- 6-4. Spring Data JPA์ ๋ํด ๋งํด์ฃผ์ธ์.
- 6-5. Spring Repository์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- 6-6. CrudRepository์ JpaRepository์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- 7. ์คํ๋ง AOP์ ๋ํด ๋งํด์ฃผ์ธ์.
Spring ํ๋ ์์ํฌ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์๋ฐ ๊ธฐ๋ฐ์ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์ด๋ค.
- IoC, DI, AOP ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ ์ฝ๊ฒ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๋๋ก ๋๋๋ค.
- ์คํ๋ง์ ํนํ ์น ์ ํ๋ฆฌ์ผ์ด์ , RESTful ์๋น์ค, ๋ฐฐ์น ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
โ๏ธ Spring ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- IoC ๋ฐ DI๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ๊ด๋ฆฌ์ ์์ํจ๊ณผ ์ฝ๋์ ๊ฒฐํฉ๋๊ฐ ๊ฐ์ํ๋ค.
- ๋ชจ๋ํ ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ผ๋ก ํ์ํ ๊ธฐ๋ฅ๋ง ์ ํํ์ฌ ์ฌ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ด ์๋ค.
- AOP๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ๊ฐ๋ ์ฑ์ ํฅ์์ํจ๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํด ์คํ๋ง MVC ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ค.
- Hibernate, JPA, EJB ๋ฑ ๋ค์ํ ๊ธฐ์ ๊ณผ ์ฝ๊ฒ ํตํฉ๋๋ค.
โ๏ธ Spring ํ๋ ์์ํฌ์ ํต์ฌ ๋ชจ๋์ด ๋ฌด์์ธ์ง ๋งํด์ฃผ์ธ์.
- Spring Core: ์ ์ด์ ์ญ์ (IoC)๊ณผ ์์กด์ฑ ์ฃผ์ (DI) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Spring AOP: ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ ๊ณตํ๋ค.
- Spring ORM: Hibernate, JPA ๋ฑ ORM ํ๋ ์์ํฌ์์ ํตํฉ์ ์ ๊ณตํ๋ค.
- Spring DAO: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ์์ฉ์ ๊ฐ์ํํ๋ JDBC ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํ๋ค.
- Spring Context: ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
- Spring Web: ์น ์งํฅ ํตํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Spring MVC: Model-View-Controller ์ํคํ ์ฒ ๋ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ๋ค.
์ ์ด์ ์ญ์ (Inversion of Control, IoC)์ ๋ํด ๋งํด์ฃผ์ธ์.
- ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ์์น์ด๋ค.
- ์ด์ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด์ ๊ตฌํ์ ์ง์คํ๊ณ , IoC๋ฅผ ํตํด ๊ฐ์ฒด์ ๊ด๋ฆฌ์ ์์กด์ฑ ์ฃผ์ ์ ์ธ๋ถ์ ๋งก๊ธด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ ์ ์์กด์ฑ์ ์ค์ค๋ก ์์ฑํ๋ ๊ฒ๊ณผ ๋ฐ๋๋๋ ๊ฐ๋ ์ด๋ค.
โ๏ธ IoC ์ปจํ
์ด๋์ ๋ํด ๋งํด์ฃผ์ธ์.
- IoC ์์น์ ๊ตฌํํ๋ ์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ ์ปดํฌ๋ํธ์ด๋ค.
- ์คํ๋ง ๋น(Bean)์ ์์ฑ, ์์กด์ฑ ์ฃผ์ , ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ๋ฑ์ ๋ด๋นํ๋ค.
- ์คํ๋ง์ ApplicationContext์ BeanFactory๊ฐ ๋ํ์ ์ธ IoC ์ปจํ ์ด๋์ด๋ค.
IoC ์์น์ ์ค์ ๋ก ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ์์คํ ์ด๋ ๋๊ตฌ์ด๋ค. IoC๋ฅผ ์ ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)์ ๋ํด์ ๋งํด์ฃผ์ธ์.
- ์์กด์ฑ ์ฃผ์ ์ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ธฐ๋ฒ์ด๋ค.
- ์ด๋ฅผ ํตํด ๋์จํ ๊ฒฐํฉ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ผ ์ ์๋ค.
โ๏ธ ์คํ๋ง์ ์์กด์ฑ ์ฃผ์
๋ฐฉ์์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์์ฑ์ ์ฃผ์ (Constructor Injection): ์์กด์ฑ์ ํด๋์ค์ ์์ฑ์๋ฅผ ํตํด ์ฃผ์ ํ๋ ๋ฐฉ์์ด๋ค.
- ์ธํฐ ์ฃผ์ (Setter Injection): ํด๋์ค์ ์ธํฐ ๋ฉ์๋๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ด๋ค.
- ํ๋ ์ฃผ์ (Field Injection): ํด๋์ค์ ํ๋์ ์ง์ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ด๋ค.
์์ฑ์ ์ฃผ์ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ผ๋ก, ํ์์ ์ธ ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ์ ๊ณตํ๋ฉฐ ๋ถ๋ณ์ฑ์ ์ ๊ณตํ๋ค.
์คํ๋ง ๋น(Spring Bean)์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์คํ๋ง ๋น์ IoC ์ปจํ ์ด๋์ ์ํด ์ธ์คํด์คํ๋๋ฉฐ, ์์ฑ ๋ฐ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ด๋ค.
- ์คํ๋ง ๋น์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ์คํ๋ง ์ค์ ํ์ผ์ ์ ์๋๊ฑฐ๋ @Componet, @Service ๋ฑ์ ์ด๋ ธํ ์ด์ ์ผ๋ก ํ์๋๋ค.
โ๏ธ ์คํ๋ง ๋น์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์คํ๋ง ๋น ์ ์: XML ์ค์ ๋ฐฉ์
<!-- ์์: ์คํ๋ง ๋น ์ค์
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myService" class="com.example.MyService"/>
</beans>
-->- ์คํ๋ง ๋น ์ ์: ์๋ฐ ๊ธฐ๋ฐ ์ค์ ๋ฐฉ์
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}- ์คํ๋ง ๋น ์ ์: ์๋ฐ ์ด๋ ธํ ์ด์ ์ค์ ๋ฐฉ์
@Component
public class MyBean {
}โ๏ธ ์คํ๋ง ๋น์ ์๋ช
์ฃผ๊ธฐ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ๋น ์์ฑ(Instantiation): ์คํ๋ง IoC ์ปจํ ์ด๋๋ ๋น์ ์ ์๋ฅผ ๋ฐํ์ผ๋ก ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ๋จ๊ณ์์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋๋ค.
- ์์กด์ฑ ์ฃผ์ (Dependency Injection): ๋น์ด ์์ฑ๋ ํ, IoC ์ปจํ ์ด๋๋ ํด๋น ๋น์ ์์กด์ฑ์ ์ฃผ์ ํ๋ค. ์ด ๊ณผ์ ์ ์์ฑ์, ์ธํฐ, ํ๋ ์ฃผ์ ๋ฑ์ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค.
- ์ด๊ธฐํ(Initialization): ๋น์ด ์์กด์ฑ์ ์ฃผ์ ๋ฐ์ ํ, ์ด๊ธฐํ ๊ณผ์ ์ด ์์๋๋ค. @PostConstruct, init-method ์์ฑ
- ์ฌ์ฉ(Usage): ๋น์ด ์์ฑ๋๊ณ ์ด๊ธฐํ๋ ํ, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ค. ์ด ์์ ์์ ๋น์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํ์ํ ์์ ์ ์ํํ๋ค.
- ์๋ฉธ(Destruction): ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ๋น์ด ๋ ์ด์ ํ์ํ์ง ์์ ๋, ๋น์ ์๋ฉธ ๊ณผ์ ์ด ์์๋๋ค. @PreDestroy, destroy-method ์์ฑ
IoC ์ปจํ ์ด๋๋ ์คํ๋ง ๋น์ ์๋ช ์ฃผ๊ธฐ์ธ ๋น ์์ฑ -> ์์กด์ฑ ์ฃผ์ -> ์ด๊ธฐํ -> ์ฌ์ฉ -> ์๋ฉธ ๊ณผ์ ์ ๊ด๋ฆฌํ์ฌ ๋น์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
โ๏ธ @Component, @Service, @Repository, @Controller ์ด๋
ธํ
์ด์
์ ์ฐจ์ด์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- @Componet: ์ผ๋ฐ์ ์ธ ์คํ๋ง ๋น์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค. ํน๋ณํ ์ญํ ์ด ์๊ณ , ํน์ ํ ๋ชฉ์ ์ ๋ง์ง ์๋ ์ผ๋ฐ์ ์ธ ์ปดํฌ๋ํธ๋ฅผ ๋ํ๋ธ๋ค.
- @Service: ์๋น์ค ๊ณ์ธต์ ๋น์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค. ๋น์ฆ๋์ค ๋ก์ง์ด ํฌํจ๋ ์๋น์ค ํด๋์ค๋ฅผ ๋ํ๋ด๋ฉฐ, ์ฃผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๋ก์ง์ ์ํํ๋ค.
- @Repository: ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ๋น์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ์ฒ๋ฆฌํ๋ ํด๋์ค์ ์ฌ์ฉ๋๋ค.
- @Controller: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค. HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์ฌ์ฉ์์๊ฒ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค. ์ฃผ๋ก MVC ํจํด์์ ์ฌ์ฉ๋๋ค.
Spring MVC์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์คํ๋ง ํ๋ ์์ํฌ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋๋ก, MVC(Model-View-Controller) ๋์์ธ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง, ์ฌ์ฉ์ ์ธํฐํ์ด์ค, ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฑ์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์ ํจ์จ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฌ์ค๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ๋ก, ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ค.
โ๏ธ DispatcherServlet์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์คํ๋ง MVC์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค.
- ๋ค์ํ ํธ๋ค๋ฌ, ์ธํฐ์ ํฐ, ๋ทฐ ๋ฆฌ์กธ๋ฒ ๋ฑ์ ์ค์ ํ ์ ์๊ณ , ์คํ๋ง์ IoC ์ปจํธ๋กค๋ฌ์ ํตํฉ๋์ด ์์กด์ฑ ์ฃผ์ ์ ํตํด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ์ปดํฌ๋ํธ๋ก, ์์ฒญ์ ์์ ํ๊ณ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ๋ฉฐ, ์ต์ข ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค.
โ๏ธ ์คํ๋ง MVC์ ๋์ ๊ณผ์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๊ณ , ์์ฒญ์ ์ ์ ํ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ก ์ ๋ฌํ๋ค.
- ์์ฒญ URL์ ๋ฐ๋ผ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ํธ์ถํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ ์๋น์ค ๋ ์ด์ด๋ฅผ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
- ์๋น์ค๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ ๋ด์ ๋ทฐ๋ก ์ ๋ฌํ๋ค.
- ๋ทฐ๋ฅผ ๊ฒฐ์ ํ๊ณ ๋ ๋๋ง์ ์ง์ํ๋ค.
DispatcherServlet -> Handler Mapping -> Bussiness Logic -> Model -> ViewResolver
Spring Boot ํ๋ ์์ํฌ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์กด ๊ฐ๋ฐ ๋ฐฉ์์ ๋ฌธ์ ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๋ง์ ๋ชจ๋์ ์ถ๊ฐํ๋ฉด ์ค์ ์ด ๋ณต์กํด์ง๋๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์คํ๋ง ๋ถํธ๊ฐ ํ์ํ๊ฒ ๋์๋ค.
- ์คํ๋ง ๋ถํธ๋ ์คํ๋ง ํ๋ ์์ํฌ ์์ ๊ตฌ์ถ๋ ํ๋ก์ ํธ๋ก, ์ ํ ๋จ๊ณ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ฐ์ํํ๋ค.
- ์๋ฒ ๋๋ ์๋ฒ, ๋ณด์, ๋ฉํธ๋ฆญ์ค, ์ธ๋ถํ๋ ์ค์ ๊ณผ ๊ฐ์ ๋ค์ํ ๋น๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ต์ํ์ ์ค์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋๋ก ๋๋๋ค.
์คํ๋ง ํ๋ ์์ํฌ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ , ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ค.
โ๏ธ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ , ์ฃผ์ ํน์ง์ ๋ํด์ ๋งํด์ฃผ์ธ์.
-
์๋ ๊ตฌ์ฑ, AutoConfiguration
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ์ ์๋์ผ๋ก ๊ฐ์งํ์ฌ ๋ณต์กํ ์ค์ ๊ณผ์ ์ ์ต์ํํ๋ค.
-
์คํํฐ ์์กด์ฑ, Starter Dependency
- ๋ค์ํ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ๋ฏธ๋ฆฌ ์ ์๋ ์คํํฐ ์์กด์ฑ์ ์ ๊ณตํ๋ค.
-
๋จ๋ ์คํ, Standalone
- ๋ด์ฅ๋ ์น ์๋ฒ Tomcat, Jetty ๋ฑ์ ํฌํจํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ๊ณ , ๋ณ๋์ ์๋ฒ ์ค์น ์์ด JAR ํ์ผ๋ก ์คํํ ์ ์๋ค.
-
ํ๋ก๋์ ์ค๋น, Production Ready
- ๋ชจ๋ํฐ๋ง, ๋ฉํธ๋ฆญ์ค, ์ค์ ๊ด๋ฆฌ ๋ฑ ํ๋ก๋์ ํ๊ฒฝ์ ํ์ํ ๊ธฐ๋ฅ์ ๋ด์ฅํด์ ์ด์ ํ๊ฒฝ์ ์ ํฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
-
์คํ๋ง์ ๋ชจ๋ ๊ธฐ๋ฅ ์ฌ์ฉ
- ์คํ๋ง ํ๋ ์์ํฌ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ์คํ๋ง ์ํ๊ณ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค.
โ๏ธ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ๋น ๋ฅธ ๊ฐ๋ฐ: ๋ณต์กํ ์ค์ ์์ด ๋น ๋ฅด๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๋์์ง๋ค.
- ์ ์ฐ์ฑ: ๋ค์ํ ์คํํฐ์ ์ค์ ์ต์ ์ ํตํด ํ์ํ ๊ธฐ๋ฅ๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ๋ชจ๋ํ: ๊ฐ ๊ธฐ๋ฅ์ ๋ชจ๋ํํ์ฌ ๊ด๋ฆฌํ ์ ์์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ์ปค๋ฎค๋ํฐ์ ์ง์: ์คํ๋ง ์ํ๊ณ์ ํ๋ถํ ์๋ฃ์ ์ปค๋ฎค๋ํฐ ์ง์์ ๋ฐ์ ์ ์๋ค.
โ๏ธ @SpringBootApplication ์ด๋
ธํ
์ด์
์ ๋ํด ๋งํด์ฃผ์ธ์.
-
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ํ๊ธฐ ์ํ ํต์ฌ ์ด๋ ธํ ์ด์ ์ผ๋ก, ์ธ ๊ฐ์ง ์ด๋ ธํ ์ด์ ์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
-
@SpringBootConfiguration: ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ ์ํ๋ค.
- @Configuration ์ด๋ ธํ ์ด์ ์ ํฌํจํ์ฌ ์คํ๋ง์ ์ค์ ํด๋์ค๋ก ์๋ํ๋ค.
-
@EnableAutoConfiguration: ์คํ๋ง ๋ถํธ์ ์๋ ์ค์ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ค.
- ํด๋์ค ๊ฒฝ๋ก์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ์ ๋ฐ๋ผ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ์ ์๋์ผ๋ก ์ค์ ํ๋ค.
-
@ComponetScan: ํ์ฌ ํจํค์ง์ ๊ทธ ํ์ ํจํค์ง์์ ์คํ๋ง์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ๊ฒ์ํ๋ค.
- ์ด๋ @Component, @Service, @Repository, @Controller์ ๊ฐ์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ฐพ์ ์คํ๋ง์ Application Context์ ๋ฑ๋กํ๋ค.
์คํ๋ง ๋ถํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ๋ค์ ์๋์ผ๋ก ์ค์ ํ๋ ์ด๋ ธํ ์ด์ ์ ์ ๊ณตํ๋ค.
โ๏ธ Spring Data JPA์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์.
- ์คํ๋ง ํ๋ ์์ํฌ, ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต ๊ฐ๋ฐ์ ๊ฐ์ํํ๋ Spring Data์ ํ ๋ถ๋ถ์ด๋ค.
- JPA(Java Persistence API)์ ํจ๊ป ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ด๋ค.
- CRUD(CREATE, READ, UPDATE, DELETE) ์์ ์ ์ฝ๊ฒ ์ํํ๋ฉฐ, ORM์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฐ ๊ฐ์ฒด ๊ฐ ๋ณํ์ ์๋์ผ๋ก ์ฒ๋ฆฌ ๋ฐ ๋ฐ๋ณต ์ฝ๋๋ฅผ ์ค์ฌ์ค๋ค.
โ๏ธ Spring Repository์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๊ฐ์ํํ๊ณ , ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๋ฉฐ, ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ค.
- Repository ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ฉด ์คํ๋ง์ด ์๋์ผ๋ก ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ, ๋ณต์กํ DAO ํด๋์ค๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค.
- ๋ฉ์๋ ์ด๋ฆ ๊ธฐ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์๋์ผ๋ก SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ธ๋ค.
- @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
- JPA ์ธ์๋ MongoDB, Redis ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ํ์ฌ ์ ์ฐํ ๋ฐ์ดํฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ธ๋ฅผ DataAccessException์ผ๋ก ๋ณํํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ๋ค.
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByLastName(String lastName);
}Spring Repository๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๊ธฐ ์ํ CRUD ์์ ๋ฐ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ ๋ํ ์ถ์ํ์ด๋ค.
โ๏ธ CrudRepository์ JpaRepository์ ์ฐจ์ด์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์.
- CrudRepository: ๊ธฐ๋ณธ์ ์ธ CRUD(CREATE, READ, UPDATE, DELETE) ์์ ์ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ก JPA์ ์์กดํ์ง ์๋๋ค.
- JpaRepository: CrudRepository๋ฅผ ์์๋ฐ์ ๊ธฐ๋ณธ CRUD ๋ฉ์๋๋ฅผ ํฌํจํ๋ฉฐ, JPA ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ด๋ค.
๋จ์ CRUD ์์ ์ด ํ์ํ ๊ฒฝ์ฐ CrudRepository๋ฅผ ์ฌ์ฉํ๊ณ , JPA ๊ธฐ๋ฅ์ ํ์ฉํ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ JpaRepository๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค.
์คํ๋ง AOP์ ๋ํด ๋งํด์ฃผ์ธ์.
- ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ฌ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํจ๋ค.
- ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ด์ฌ์ฌ์ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ธฐ์ ์ด๋ค.
โ๏ธ ์คํ๋ง AOP์์ Advice์ ์ข
๋ฅ์ ๋ํด ๋งํด์ฃผ์ธ์.
- @Before: ๋น์ฆ๋์ค ๋ก์ง์ด ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ค.
- @AfterReturning: ๋น์ฆ๋์ค ๋ก์ง์ด ์ ์์ ์ผ๋ก ๋๋ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์คํ๋๋ค.
- @AfterThrowing: ๋น์ฆ๋์ค ๋ก์ง ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋๋ค.
- @After: ๋น์ฆ๋์ค ๋ก์ง ์คํ ํ, ์ฑ๊ณต ์ฌ๋ถ์ ๊ด๊ณ์์ด ํญ์ ์คํ๋๋ค.
- @Around: ๋น์ฆ๋์ค ๋ก์ง ์คํ ์ ํ์ ๋ชจ๋ ์คํ๋๋ค.
โ๏ธ ์คํ๋ง AOP์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํด ๋งํด์ฃผ์ธ์.
- ๋น ์์ฑ: ์คํ๋ง ์ปจํ ์ด๋์์ ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ๋น ํ์ฒ๋ฆฌ๊ธฐ: ๋น์ด ์ ์ฅ์์ ๋ฑ๋ก๋๊ธฐ ์ ์ ํ์ฒ๋ฆฌ๊ธฐ์ ์ ๋ฌ๋์ด AOP ์ ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
- Advisor ์กฐํ: ๋ชจ๋ Advisor(Advice์ Pointcut์ ํฌํจํ๋ ๊ฐ์ฒด)๋ฅผ ์กฐํํ๋ค.
- ํ๋ก์ ์์ฑ: ํฌ์ธํธ์ปท๊ณผ ๋ฉ์๋ ์กฐ๊ฑด์ด ๋งค์นญ๋๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ๋น ๋ฑ๋ก: ํ๋ก์๊ฐ ์์ฑ๋์ง ์์ผ๋ฉด ์๋ ๊ฐ์ฒด ๊ทธ๋๋ก ๋น ์ ์ฅ์์ ๋ฑ๋กํ๋ค.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature().getName());
}
@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("Method returned: " + joinPoint.getSignature().getName());
System.out.println("Result: " + result);
}
}ํ๋ก์ ํจํด์ ์ฌ์ฉํ์ฌ ์ค์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๋ฉฐ, ํ๋ก์๊ฐ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ AOP ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฑ๋ฅ ์ ํ ์์ด AOP๋ฅผ ์ ์ฉํ ์ ์๋ค.