๐ ๋ค์ด๊ฐ๋ฉด์
๋จผ์ ์ฝ์ผ๋ฉด ์ข์ ๊ธ.
์ด ๊ธ์์ ์ธ๊ธํ ์ ์ด์ ์ญ์ (IoC), ์์กด์ฑ ์ฃผ์
(DI) ๋ฑ์ ๋ํ ์ค๋ช
์ด ํฌํจ๋์ด ์๋ค.
- tistory
Spring์ ์ฐ๋ ์ด์ : Spring์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ๊ณผ ํน์ง - velog
Spring์ ์ฐ๋ ์ด์ : Spring์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ๊ณผ ํน์ง
๐ ์ฃผ์
Spring Boot์์ ์ด๋ป๊ฒ Bean์ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ ๊น?
โ Bean์ ๊ฐ๋
Bean์ด๋?
- ์คํ๋ง IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด
์คํ๋ง์์๋ ๊ฐ๋ฐ์๊ฐ ์๋ IoC ์ปจํ ์ด๋์ ์ํด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , ์์กด ๊ด๊ณ๊ฐ ๊ด๋ฆฌ๋๊ณ , ํ์ ์๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ค.
๐ซ Bean์ ํน์ง
POJO(Plain Old Java Object)
- ํน๋ณํ ๊ท์ฝ์ ์ฝ๋งค์ด์ง ์์ ์์ ์๋ฐ ๊ฐ์ฒด.
- ์คํ๋ง Bean์ ๋๊ฐ POJO ํํ๋ก ์์ฑํ์ฌ, ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์ข ์๋์ง ์๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค.
์ปจํ ์ด๋ ๊ด๋ฆฌ
- Bean์ IoC ์ปจํ ์ด๋์ ๋ฑ๋ก๋์ด ๊ด๋ฆฌ๋๋ค.
- ๋ฑ๋ก๋ Bean์ ํ์ ์์ ์ ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ํ๊ณ , ๋ผ์ดํ์ฌ์ดํด์ ์ ์ดํฉ๋๋ค.
์์กด์ฑ ์ญ์ (Inversion of Control)
- Bean์ ์๊ธฐ ์ค์ค๋ก๊ฐ ์์กด์ฑ์ ๋ง๋ค๊ฑฐ๋ ๊ด๋ฆฌํ์ง ์๊ณ , ์ค์ง ์์ ์ ๋ก์ง์๋ง ์ง์คํ๋ค.
- ํ์ํ ์์กด์ฑ(๋ค๋ฅธ Bean๊ณผ์ ๊ด๊ณ)์ ์ปจํ ์ด๋๊ฐ ์ฃผ์ ํด ์ค๋ค.
๋ฐฐ์น(Assembly)์ ์ค์ (Configuration)
- Bean๋ผ๋ฆฌ์ ๊ด๊ณ(์ด๋ค Bean์ด ์ด๋ค Bean์ ์ฐธ์กฐํ๋์ง ๋ฑ)๋ ๋ณ๋์ ์ค์ ํ์ผ(์๋ฐ ์ค์ , XML, ์ด๋ ธํ ์ด์ ์ค์บ ๋ฑ)์ ํตํด ์ ์ํ๋ค.
- ๋๋ถ์ ์ฝ๋์ ์ค์ ์ ๋ถ๋ฆฌํ์ฌ ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๊ทน๋ํํ ์ ์๋ค.
โ๏ธ ์๋ ๋ฑ๋ก: Configuration & Bean
@Configuration
์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ ์คํ๋ง ๋น์ ์ค์ ํ๋ ํด๋์ค์์ ๋ํ๋ธ๋ค.
@Configuration
public class AppConfig {
// ๋น ๋ฑ๋ก
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@Bean
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ํน์ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์ด ๋ฉ์๋(myService()
)๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋๋ผ๋ ์ค์ ์ธ์คํด์ค๋ ๋จ ํ๋๋ง ์์ฑ๋๋๋ก, ์ฆ ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋๋ก ์ฒ๋ฆฌํ๋ค.
@Bean์ ์ฃผ๋ก ์ธ๋ถ์์ ๋ง๋ (์์ ์ด ๊ฐ๋ฐํ ์ฝ๋๊ฐ ์๋ ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ๋ฐํ ์ฝ๋) ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํด ์ฌ์ฉ๋๋๋ฐ,
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค์ ๊ฐ์ฒด ์์ฑ ๋ฉ์๋๋ฅผ ๋ง๋ ํ ํด๋น ๋ฉ์๋์ ์ ์ธํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
์ด์ฒ๋ผ ์๋ฐ ํด๋์ค๋ฅผ ์ด์ฉํด Bean์ ์ ์ํ๊ณ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์
Java Config๋ผ๊ณ ํ๋ค.
โ ์ฅ์
- ํ์
์์ ์ฑ(Type-safety)
- ๊ธฐ์กด์ ์ค์ ๋ฐฉ๋ฒ XML์ ๋ฌธ์์ด ๊ธฐ๋ฐ์ด๋ผ ์คํ๊ฐ ๋ฐ์ํด๋ ์ปดํ์ผ ์์ ์ ์กํ๊ธฐ ์ด๋ ต๋ค.
- ์๋ฐ ์ฝ๋๋ก ์์ฑ๋๋ฏ๋ก IDE์ ์ฝ๋ ์๋ ์์ฑ, ์ปดํ์ผ ํ์ ์ฒดํฌ, ๋ฆฌํฉํ ๋ง ์ง์์ด ์ฉ์ดํ๋ค.
- ๊ฐ๊ฒฐ์ฑ๊ณผ ๊ฐ๋
์ฑ
- ์๋ฐ ํด๋์ค๋ ํ์ํ ๋งํผ๋ง ์ ์ธํ๊ณ , ๋ก์ง์ ๊ฐ๊น์ด ๋ฐฉ์์ผ๋ก Bean ์ ์๋ฅผ ํํํ ์ ์๋ค.
- ์ ์ฐํ ๊ตฌ์กฐ
- ์ค์ ์ ์ฌ๋ฌ ์๋ฐ ํด๋์ค๋ก ๋ชจ๋ํํด์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๋ค.
- ์กฐ๊ฑด๋ถ ๋ก์ง(if/else) ๋ฑ์ ์๋ฐ ์ฝ๋์์ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ๋ค. (์: ์ด์ ํ๊ฒฝ/ํ ์คํธ ํ๊ฒฝ ๋ถ๊ธฐ)
- ๋ฐ๋ฉด XML ์ค์ ์๋ ์ธ๋ถ ์ค์ ๊ด๋ฆฌ, ๋ฐฐํฌ ์์ ์ ์์ค ์ฝ๋ ์์ ์์ด ์ค์ ๋ง ๋ฐ๊พธ๊ธฐ ๋ฑ์ ์ฅ์ ์ด ์์ผ๋ฏ๋ก, ์ํฉ์ ๋ฐ๋ผ ํผํฉ ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค.
๐ข ์๋ ๋ฑ๋ก: Annotation
์ด๋ ธํ ์ด์ ์ด๋?
์ฌ์ ์ ์ผ๋ก๋ '์ฃผ์'์ด๋ผ๋ ์๋ฏธ๋ก ์์ค ์ฝ๋๊ฐ ์ปดํ์ผ๋๊ฑฐ๋ ์คํ๋ ๋ ์ปดํ์ผ๋ฌ ๋ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์๊ฒ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํด ์ฃผ๋ ๋ฌธ๋ฒ ์์์ด๋ค.
@Component
@Bean๊ณผ ๋ฌ๋ฆฌ ์ง์ ์์ฑํ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๋น์ผ๋ก ๋ฑ๋กํ๊ณ ์ถ์ ํด๋์ค์ @Component
์ด๋
ธํ
์ด์
์ ๋ถ์ธ๋ค.
@Component
public class MyComponent {
public void sayHello() {
System.out.println("Hello from MyComponent!");
}
}
์ ์์์์ MyComponent ํด๋์ค๋ @Component ์ ๋ ธํ ์ด์ ๋๋ถ์ Spring ์ปจํ ์ด๋์ Bean์ผ๋ก ๋ฑ๋ก๋๋ค.
@Componet๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํน์ํ๋ ์ด๋
ธํ
์ด์
๋ค์ด ์๋ค.
์์ฃผ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ์์๋ก @Service
, @Controller
, @Repository
๊ฐ ์๋ค.
๊ธฐ๋ฅ์ ์ผ๋ก๋ @Component์ ๊ฐ์ด ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ ์ญํ ์ ํ์ง๋ง ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ญํ ์ด ๋ช
ํํ๊ฒ ๊ตฌ๋ถ์ด ๋์ด ์๋ค.
@Component๋ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ ํ์ ํด๋์ค์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ํน์ ํ ์ญํ ์ ๋ช
์ํ์ง ์๋๋ค.
- @Service: ์ฃผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค ๊ณ์ธต์ ํด๋์ค๋ฅผ ๋ํ๋ธ๋ค.
- @Controller: HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ๋ฐํํ๋ ์น ๊ณ์ธต์ ๋ด๋นํ๋ ํด๋์ค๋ฅผ ๋ํ๋ธ๋ค.
- @Repository: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ํด๋์ค๋ฅผ ๋ํ๋ธ๋ค.
@Service, @Controller, @Repository๋ ๋ชจ๋ @Component์ ํน์ํ๋ ์ ๋ ธํ ์ด์ ์ผ๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก๋ @Component์ ๊ฐ์ ์ญํ ์ ํ๋ค.
ํ์ง๋ง ๊ฐ ์ ๋
ธํ
์ด์
์ ํน์ ๊ณ์ธต์ด๋ ์ญํ ์ ๋ช
ํํ ํํํ์ฌ
๊ฐ๋ฐ์์๊ฒ ๊ฐ ํด๋์ค์ ์๋๋ฅผ ๋ช
ํํ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
โ ์ฅ์
- ์๋ ๋ฑ๋ก์ ํธ๋ฆฌํจ
- @Configuration ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ผ์ผ์ด @Bean ๋ฉ์๋๋ฅผ ์ ์ํ ํ์ ์์ด ํ์ํ ํด๋์ค์ ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด Spring์ด ์๋์ผ๋ก ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค.
- ์ฝ๋ ์๋ ์ ๋ฌ ๋ฅ๋ ฅ
- @Service, @Controller, @Repository ๋ฑ ํด๋์ค์ ์ญํ ์ ๋ช ํํ ๊ตฌ๋ถํ ์ ์๋๋ก ํ๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ์๋๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๊ฒ ์ง๊ด์ ์ด๋ค.
์ฐธ๊ณ ์๋ฃ