예전부터 필자가 정말 중요하게 생각하는 부분은 기초이다.
이 기초를 탄탄히 다지지 못해서 많이 넘어져도 봤고, 넘어지는 사람들도 많이 보았다.
최근 스프링에 대해 공부하며, 나는 내 생각보다 더 스프링을 잘 모른다는 느낌이 들었다.
그렇게 중요시하던 기초적인 부분도, 원리도, 그냥 이런 식으로 되는구나~ 하고 넘겨왔던 것 같다.
그러다보니 스프링을 더욱 공부해나갈수록, 기초적인 부분에서 발목이 잡히기 시작했다.
왜 이렇게 동작하는지도 확실하게 알지 못하는데, 점점 그 앞을 나아갈 수 있을 리 없다.
그렇기에 초심으로 돌아가서, 당분간 스프링의 핵심 요소들 및 헷갈리거나 중요한 요소들을 차근차근 공부하고 정리할 예정이다.
금일은 스프링 컨테이너와 빈에 대해서 학습해보자.
DI (의존성 주입) 담당ApplicationContextBeanFactoryDI 에 필요한 요소new 를 통해 객체를 직접 생성하지 않을 수 있게 해줌@Component)@Bean 어노테이션은 오직 메서드만 지정 가능@Configuration 내부에서 사용name 옵션으로 빈의 이름을 변경할 수 있음1) @Configuration 지정 방식
@Configuration 어노테이션 지정@Bean 어노테이션으로 지정@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userRepository);
}
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
}
userService 와 userRepository 가 등록2) @Component 지정 방식
@Controller , @Service , Repository 의 기본형@Component
public class UserService {
public String sendUser() {
return "User";
}
}
userService 를 빈으로 등록🛑 1)과 2)의 코드를 같이 사용하면 userService를 동일한 이름으로 가진 빈이 2개 발생한다.
기본적으로 빈의 이름은 고유해야 하기 때문에, 이 경우 충돌이 발생한다.
@Configuration
public class AppConfig {
@Bean
public User user {
return new User();
}
@Bean
public User user {
return new User();
}
}
1) name 옵션 및 @Qualifier 사용
@Bean(name = "newName")
public User user {
return new User();
}
public class UserService {
@AutoWired
@Qualifier("newName")
private User user;
}
name 옵션을 지정User 로 동일하기 때문에, 스프링 컨테이너 에는 user 빈이 2개 등록user 빈 중 어떤 것을 선택할 지 @Qualifier 어노테이션으로 지정2) @Primary
@Bean(name = "newName")
@Primary
public User user {
return new User();
}
@Primary 지정user 빈 중 기본 빈으로 스프링 컨테이너에 등록참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/