[ 목차 ]
[Spring container]
객체(Bean)을 생성 및 관리하고 의존성을 주입하는 역할 담당
[Spring Bean]
Spring Container가 관리하는 객체. Bean을 new 키워드 대신 사용한다.
Spring Bean의 특징
- Spring 컨테이너에 의해 생성되고 관리된다.
- 기본적으로 Singleton으로 설정된다.
- 의존성 주입(DI)을 통해 다른 객체들과 의존 관계를 맺을 수 있다.
- 생성, 초기화, 사용, 소멸의 생명주기를 가진다.
Bean 등록 방법
1. 자동 빈 등록
- 어노테이션을 통해 Bean으로 등록
- @Component: bean으로 등록하려는 클래스 위에 사용.
- @ComponentScan(basePackages = "com.example"): com.example 패키지를 스캔해서 component, Controller, Service, Repository 어노테이션이 붙은 클래스들을 bean으로 등록한다. 메인 메서드가 있는 클래스에서 사용
2. 수동 빈 등록
- @Configuration: 클래스를 Bean으로 등록하고 해당 클래스의 메서드에 @Bean을 붙여서 bean을 생성한다.
// 수동으로 빈 등록
@Configuration
public class AppConfig {
// TestService 타입의 Spring Bean 등록
@Bean
public TestService testService() {
// TestServiceImpl을 Bean으로 등록
return new TestServiceImpl();
}
}
- 자동 Bean 등록을 사용하는 이유
- 다양한 Annotation으로 편리하게 등록할 수 있다.
- Spring Boot는 ComponentScan 방식을 기본으로 사용한다.
- 간단하지만 OCP, DIP를 준수하며 개발할 수 있다.
- 수동 Bean 등록을 사용하는 경우
- 외부 라이브러리나 객체를 Spring Bean으로 등록할 때
- 외부 라이브러리에서 제공하는 클래스는 자동 등록이 불가능하다.
- 데이터베이스 연결과 같이 비지니스 로직을 지원하는 기술들에 사용한다.
- 비지니스 로직보다 그 수가 아주 적지만 Application에 광범위하게 적용된다.
- 설정 정보에 명시되어 있어서 유지보수성이 증가한다.
- 같은 타입의 Bean 여러개 중 하나를 명시적으로 선택해야 할 때
- 외부 라이브러리나 객체를 Spring Bean으로 등록할 때
꼭 필요한 경우가 아니라면 자동 Bean 등록을 사용하면 된다.
[같은 타입의 Bean이 중복된 경우 충돌 해결 방법]
1. @Autowired+필드명 사용
// 필드명을 Bean 이름으로 설정
@Autowired
private MyService myServiceImplV2;
...
2. @Qualifier 사용
@Component
@Qualifier("firstService")
public class MyServiceImplV1 implements MyService { ... }
@Component
@Qualifier("secondService")
public class MyServiceImplV2 implements MyService { ... }
@Component
public class ConflictApp {
private MyService myService;
// 생성자 주입에 구분자 추가
@Autowired
public ConflictApp(@Qualifier("firstService") MyService myService) {
this.myService = myService;
}
// setter 주입에 구분자 추가
@Autowired
public void setMyService(@Qualifier("firstService") MyService myService) {
this.myService = myService;
}
...
}
3. @Primary 사용: primary 지정된 bean이 우선 순위를 가진다. 보통은 primary를 많이 사용(mysql)
@Component
@Primary
public class MyServiceImplV2 implements MyService { ... }
'코딩 > 자바' 카테고리의 다른 글
[Spring] Validation (1) | 2025.02.05 |
---|---|
[Spring] IOC/DI, 싱글톤 패턴 (0) | 2025.02.05 |
[Spring] SOLID 원칙 (0) | 2025.02.04 |
[Spring] Spring 3 Layered, Spring MVC (1) | 2025.01.23 |
[Spring] 기초 6주차 (0) | 2025.01.23 |