728x90
1.DI(Dependency Injection)
우선 DI의 개념을 알아야한다. 객체가 필요로 하는 의존 객체를 직접 생성하지 않고, 외부에서 주입받는 방식을 의미하며
즉 new 로 내가 클래스에서 개체를 따로 만드는게 아니라 외부에서 주입해주는것이다.
이거는 DI를 사용하지않은 예제로 UserService에서 UserRepository 개체를 new로 생성한다.
public class UserService {
private UserRepository userRepository = new UserRepository(); // 직접 생성
}
이게 DI 방식으로 생성자로 의존성을 주입해주는 방식이다.
보면 UserService는 생성자로 개체를 만들때 외부에서 userRepository 개체를 받아서 생성해줘야한다.
public class UserService {
private final UserRepository userRepository;
// 생성자를 통한 의존성 주입
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
2. IoC(Inversion of Control)
IoC는 직역하자면 제어의 역전이라 말할수있다.
프로그램의 흐름 제어 권한을 개발자가 아니라 프레임워크에 넘기는 것이다.
예시를 봐보자
위에서 UserService 클래스를 만들었으면 이제 원래라면 개발자가 다음처럼 직접 필요한 부분에서 호출해서 사용해 줘야할것이고 의존성 주입 (DI) 또한 개발자가 다음처럼 직접 해줘야할것이다.
IoC란 이런 번거러운과정들을 모두 스프링에게 넘겨버리는것이다. (제어를 넘겨줌!)
UserService userService = new UserService();
UserRepository userRepository = new UserRepository();
UserService userService = new UserService(userRepository);
3.Spring IoC 컨테이너
Spring에서 이러한 IoC를 담당하는것이 바로 Spring IoC 컨테이너이다.
스프링 프레임워크의 핵심 구성 요소로 애플리케이션에서 사용하는 Bean을 생성하고, 관리하고, 의존성을 주입해주는 시스템이다.
그러면 여기서 Bean은 뭘까?
3-1.Bean
Bean은 Spring IoC 컨테이너가 생성하고 관리하는 객체를 의미한다.
즉, Spring IoC 컨테이너가 IoC를 하기 위해서는 등록을 해줘야하는데 이 등록한 객체들을 Bean 이라고 부른다.
3-2. @Component
클래스를 Bean으로 등록하기 위해서는 @Component 어노테이션을 사용해줘야한다.
클래스에 직접 붙이면 자동으로 Bean이 등록되어 관리한다.
우리가 SpringBoot를 하며 어노테이션으로 @Controller, @Service, @Repositroy를 사용했는데 이것또한 내부에 들어가면 @Component 어노테이션을 포함하고 있다.
이건 @Service 어노테이션 클래스 파일인데 보면 @Component가 포함되어 @Service를 사용할때도 자동으로 Bean이 등록되는 것을 확인할수있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* Alias for {@link Component#value}.
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
이렇게 딱히 Controller, Service, Repository는 아니지만 내가 필요에 의해 만든 클래스를 Bean으로 관리하기 위해 @Component 를 붙였다.
@Component
public class AuthUtil {
}
3-3. @Bean
@Bean 어노테이션또한 존재하는데 이는 클래스가 아닌 메서드에 사용하기 위한 어노테이션이다.
@Bean이 붙은 메서드는 리턴값을 Bean으로 등록한다.
이건 외부 라이브러리를 사용하게 되면 이미 만들어진 클래스를 사용하게 되는데 이를 Bean으로 등록하기 위해서 사용한다.
이건 외부라이브러리인 Spring Security에서 사용하는 비밀번호를 복호화하기 위한 클래스이다.
이미 만들어진 클래스를 사용해야하므로 클래스에 @Component를 붙일수 없다.
public class BCryptPasswordEncoder implements PasswordEncoder {
}
때문에 다음처럼
@Bean이 붙은 메서드는 리턴값을 Bean으로 등록하기 때문에 Bean으로 BCryptPasswordEncoder객체가 등록된다.
단 이때 반환값 타입은 PasswordEncoder 이므로 , PasswordEncoder라는 타입의 Bean을 등록하되, 그 구현체는 BCryptPasswordEncoder를 사용하라는 의미가 되겠다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
때문에 이후 다음처럼 작성하면 passwordEncoder에 PasswordEncoder의 구현체인 Bean으로 등록한 BCryptPasswordEncoder 객체가 DI 될것이다.
@Service
@RequiredArgsConstructor
public class AuthService {
private final PasswordEncoder passwordEncoder;
}
728x90
'BackEnd > SpringBoot' 카테고리의 다른 글
[SpringBoot] React + SpringBoot + JWT + Stomp으로 WebSocket 채팅 구현하기 (1) | 2025.05.26 |
---|---|
[SpringBoot] JDBC 사용하기 (1) | 2025.05.14 |
[SpringBoot] MySQL springBoot 연결하기 (0) | 2025.05.14 |