[SpringBoot] 스프링부트 IoC와 DI의 이해
Spring Boot는 Java 기반의 개발 프레임워크로, IoC (Inversion of Control)와 DI (Dependency Injection) 같은 핵심 개념을 통해 개발자에게 많은 이점을 제공합니다. 이번 글에서는 IoC와 DI가 무엇이며, Spring Boot에서 어떻게 활용되는지에 대해 자세히 알아보겠습니다.
IoC (Inversion of Control)란?
IoC란 제어의 역전을 의미하며, 객체의 생성과 관리를 개발자가 아닌 프레임워크가 담당하는 개념입니다.기존의 개발 방식에서는 개발자가 객체를 직접 생성하고 관리했지만, IoC를 통해 객체의 생명주기를 프레임워크가 제어하게 됩니다.Spring Boot에서는 IoC 컨테이너를 통해 객체의 생명주기와 의존성을 관리합니다.
DI (Dependency Injection)란?
DI란 의존성 주입을 의미하며, 객체 간의 의존 관계를 설정하는 방식입니다.
개발자가 직접 객체를 생성하고 의존 관계를 설정하는 대신, 프레임워크가 객체를 생성하고 의존성을 주입해줍니다. Spring Boot에서는 DI를 통해 객체 간의 의존성을 해결하고, 유연하고 효율적인 개발을 가능하게 합니다.
Spring Boot에서의 IoC와 DI 활용 방법
Spring Boot에서는 @Autowired 어노테이션을 사용하여 의존성 주입을 수행합니다.
@Autowired 어노테이션은 필드, 생성자, 메서드에 적용될 수 있으며, 해당하는 객체를 자동으로 주입받을 수 있습니다.
Spring Boot는 IoC 컨테이너를 구성하고, 컨테이너 내에서 객체들의 의존성을 관리합니다.
@Component, @Service, @Repository 등의 어노테이션을 사용하여 Spring Boot에게 객체의 역할을 알려줄 수 있습니다.
Bean과 스프링 IoC 컨테이너
Bean과 스프링 IoC 컨테이너스프링 IoC 컨테이너가 관리하는 객체들을 Bean 이라고 부릅니다. 스프링은 이러한 Bean들의 의존성을 관리하고, 객체를 만들어 주며, Bean으로 등록을 해 주고, 이렇게 만들어진 것들을 관리합니다. 개발자가 이 부분까지 신경쓰지 않아도, 프레임워크가 알아서 해 주는 것입니다.
보통 시큐리티 설정을 하고 SecurityFilterChain 클래스를 작성할 때 @Bean 어노테이션을 사용합니다! 이때 @Bean으로 인하여 스프링 컨테이너에게 해당 메서드가 빈을 생성하고 관리하도록 지시하는 역할을 합니다.
아래 코드에서 filterChain이라는 메서드가 @Bean 어노테이션과 함께 사용되었으므로, 이 메서드는 스프링 컨테이너에 의해 관리되는 빈으로 등록됩니다.
간단히 말하면, filterChain 메서드가 반환하는 SecurityFilterChain은 스프링 시큐리티의 필터 체인을 정의하는 빈입니다. 이 빈은 스프링 시큐리티에서 사용되며, 해당 메서드 안에서 필요한 설정들을 구성합니다.
@Bean으로 설정된 메서드의 반환 객체는 스프링 컨테이너에 의해 생성 및 초기화됩니다. 객체의 생성 시점은 스프링 컨테이너가 빈을 필요로 할 때입니다. 스프링은 이 빈을 싱글톤으로 관리하기 때문에, 해당 빈이 처음으로 필요로 되는 시점에 한 번 생성되며 이후에는 재사용됩니다.
개발자가 직접 초기화를 하지 않아도 되고 필요한 시점에 초기화가 된다, 재사용이 가능하다는 점 등 등 .. 마무리 말에서 제 생각을 정리하도록 하겠습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.formLogin(form -> form
.loginPage("/member/login") // 로그인 페이지
.defaultSuccessUrl("/") // 로그인 성공 후 이동 페이지
.failureUrl("/member/login/error")
.usernameParameter("email") // 로그인 페이지의 아이디 파라미터
.passwordParameter("password") // 로그인 페이지의 비밀번호 파라미터
.permitAll() //모든 사용자가 접근할 수 있음
);
장점과 주의할 점
IoC와 DI를 사용하면 코드의 재사용성과 유지보수성이 향상됩니다. 의존성 주입을 통해 유연하게 객체를 교체하거나 확장할 수 있습니다.
하지만, 잘못된 의존성 관리는 런타임 오류를 발생시킬 수 있습니다. 의존성 주입 시 객체의 스코프와 생명주기를 주의깊게 관리해야 합니다.
마무리..
Spring Boot에서 IoC와 DI는 개발자에게 많은 이점을 제공합니다. 이를 통해 코드의 유연성과 확장성을 높이며, 개발 작업을 효율적으로 수행할 수 있습니다. IoC와 DI의 개념을 이해하고, Spring Boot에서의 활용 방법을 익힌다면 보다 효과적인 개발을 할 수 있을 것입니다.