-
[Spring] ์คํ๋ง IOC ์ปจํ ์ด๋์ BeanSpring Boot 2023. 1. 15. 00:50
๐ Spring IOC, Container, DI, Bean?
์คํ๋ง์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊พธ์คํ ๋ค์ด์ค๋ ์ฉ์ด๋ค์ด๋ค. ์ด ์ฅ์์๋ ๊ทธ ๊ฐ๋ ์ ๋ํด์ ์์๋ณด๊ณ ์ ๋ฆฌํด ๋ณธ๋ค.
IOC (Inversion of Control)
์ ์ด์ ์ญ์ ์ด๋ผ ๋ถ๋ฅธ๋ค. ์๋์์ ์ปจํ ์ด๋์ ํจ๊ป ์ค๋ช ํ๋ค.
Container (์ปจํ ์ด๋)
์ปจํ ์ด๋๋ ๋ณดํต ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ, ์์ฑ๋ ์ธ์คํด์ค๋ค์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์คํ๋ง ์ปจํ ์ด๋๋ ์์กด์ฑ๋ ๊ด๋ฆฌํ๋ค.
Spring IOC Container - ์คํ๋ง IOC ์ปจํ ์ด๋
์คํ๋ง์ ์คํ๋ง IOC ์ปจํ ์ด๋์์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ ์คํ๋ง์ด ์ ์ด ๊ถํ์ ๊ฐ์ ธ ๊ฐ์ฒด ์์ฑ, ๊ด๊ณ, ์์กด์ฑ, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ํ๋๋ฐ ์ด๋ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ ํ๋ค. ์ด Bean๋ค์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ค.
์ฆ, ๊ฐ๋ฐ์๋ ์ด๋ฐ ๊ณผ์ ์ ์คํต ํจ์ผ๋ก์จ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋์ค๋ฅผ ์คํ๋ง IOC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ ์ ์๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? ๋ฐ๋ก Bean์ผ๋ก ๋ฑ๋กํด ์ฃผ๋ฉด ๋๋ค. Bean์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ ์์ ์ ์ฌ์ฉํ๋ XML์ ํตํด ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ ์ด๋ ธํ ์ด์ ์ ํตํด ๋ฑ๋กํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ธํด ๋ณด์.
1. Bean์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
1-1. Component Scan
Bean์ผ๋ก ๋ฑ๋ก๋ ์ค๋น๊ฐ ๋ ํด๋์ค๋ค์ ์ค์บํ์ฌ Bean์ผ๋ก ๋ฑ๋กํด ์ฃผ๋ ๊ณผ์ ์ด๋ค.
์ค๋น๊ฐ ๋ ํด๋์ค๋ค์ด๋ @Component ์ด๋ ธํ ์ด์ ์ ํด๋์ค์ ์ถ๊ฐํ ๊ฒ์ ๋งํ๋ค. ๋ง์ด ์ฌ์ฉํ๋ @Controller, @Service, @Repository๋ ๋ฐ๋ผ๊ฐ ๋ณด๋ฉด @Componet์ด ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ํ๋ ๋ ๊ถ๊ธ์ฆ์ด ์๊ธด๋ค. ๋๋ ์ปดํฌ๋ํธ ์ค์บ์ ํ ์ ์ด ์๋๋ฐ ์ ์์ ์ด๋ ธํ ์ด์ ๋ง ๋ถ์์ ๋ฟ์ธ๋ฐ Bean์ผ๋ก ๋ฑ๋ก๋ ๊ฑธ๊น?
์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ~Application ํด๋์ค๊ฐ ์์ฑ๋๋๋ฐ ์ด ํด๋์ค์๋ @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ๊ทธ ์์ ์ดํด๋ณด๋ฉด @ComponentScan ์ด๋ ธํ ์ด์ ์ ํตํด์ ํด๋น ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ํจํค์ง๋ฅผ ์ค์บํ๋ ๊ฑธ ์ ์ ์๋ค.
1-2. Java config - @Configuration, @Bean
@Configuration ํด๋์ค์์ @Bean ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ์๋์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋์ ๋น์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ด๋ค.
@Configuration public class TestConfig { @Bean public OpenApi openApi() { return new OpenApi(); } }
์์ ๊ฐ์ด ์๋์ผ๋ก Bean์ ๋ฑ๋กํ๋ ๊ฒฝ์ฐ์๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ์ฌ์ฉํ๋ค.
1. ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ์ฌ ์ฌ์ฉํ ๋
2. ์ ๋ฒ์์ ์ผ๋ก ์ฌ์ฉ๋๋ ํด๋์ค๋ฅผ ๋ฑ๋กํ ๋
3. ๋คํ์ฑ์ ํ์ฉํ์ฌ ์ฌ๋ฌ ๊ตฌํ์ฒด๋ฅผ ๋ฑ๋กํด์ฃผ์ด์ผ ํ ๋
2. DI(Dependency Injection) - ์์กด์ฑ ์ฃผ์
Bean์ผ๋ก ๋ฑ๋กํ๊ณ ์คํ๋ง IOC ์ปจํ ์ด๋์ ์ํด ์์ฑ๋ ๋์๋ค๋ฉด, ์ด์ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ฌ์ฉํ ์ ์๋๋ฐ ์์กด์ฑ ์ฃผ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ์ฐจ๋ก๋๋ก ํ์ธํด ๋ณด์.
2-1. ํ๋ ์ฃผ์
@Controller public class TestController { @Autowired private TestService testService; }
2-2. ์์ ์(Setter) ์ฃผ์
@Controller public class TestController { private TestService testService; @Autowired public void setTestService(TestService testService) { this.testService = testService; } }
2-3. ์์ฑ์ ์ฃผ์
@Controller public class TestController { private final TestService testService; public TestController(TestService testService) { this.testService = testService; } }
๋ค๋ง, ํ๋๋ Setter ๋ฉ์๋์์ ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์์ฑ์ ์ฃผ์ ๋ฐฉ๋ฒ์ด ๊ถ์ฅ๋๋ค. ๊ทธ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
1. ์ํ ์ฐธ์กฐ ๋ฐฉ์ง
A๊ฐ B๋ฅผ ์ฐธ์กฐํ๊ณ , B๊ฐ ๋ค์ A๋ฅผ ์ฐธ์กฐํ๋ ๋ฌธ์
2. ๋ถ๋ณ์ฑ(Immutability)
์์ฑ์๋ก ์์กด์ฑ์ ์ฃผ์ ํ ๋ final๋ก ์ ์ธํ ์ ์๊ณ , ๋ฐํ์์์ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ณํ ์ผ์ด ์์ด์ง๊ฒ ๋๋ค. ๋, ํ๋ ์ฃผ์ ๋ฐฉ์์ null์ด ๋ง๋ค์ด์ง ๊ฐ๋ฅ์ฑ์ด ์๋๋ฐ final๋ก ์ ์ธํ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ null์ด ๋ถ๊ฐ๋ฅํ๋ค.
Reference
'Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Redis๋ก ์ธ์ ํด๋ฌ์คํฐ๋ง ์ ์ฉํ๊ธฐ (0) 2023.01.24 [JAVA] ํ์ผ ๋ค์ด๋ก๋ ๊ตฌํํ๊ธฐ (0) 2022.11.09 [Java] jar ๋ฐฐํฌ ์ File java.nio.file.NoSuchFileException (0) 2022.11.01 [Spring Boot] AOP(Aspect Oriented Programming) ์ ์ฉํ๊ธฐ (0) 2022.10.24 [JAVA] ํ์ผ ์ฒจ๋ถ, ํ์ผ ์ ๋ก๋ ๊ตฌํํ๊ธฐ (0) 2022.07.11