Bean : Spring의 관리 시스템(IoC 컨테이너) 안에 등록된 자바 객체.
준비되어 있는 객체를 가져다 사용할 수 있음. → new 키워드로 수동 생성 및 구현을 하지 않아도 됨.
설정 읽기
Bean 생성
의존성 주입(DI)
초기화
사용
종료 및 소멸
1️⃣ 설정 정보 읽기
Spring이 어떤 객체를 만들지 파악함.
대상
@SpringBootApplication
@ComponentScan
@configuration
예시
@SpringBootApplication
public class Application {
}
@CompunentScan 실행
지정된 패키지 탐색
찾는 대상
@Component
@Service
@Repository
@Controller
얘네는 Bean으로 만들기
2️⃣ Bean 생성
Spring은 찾은 클래스들을 객체로 생성한다.
예시
@Service
public class UserService {
}
내부적으로
UserService userService = new UserService();
Spring이 생성 : 직접 생성(new 사용) X
3️⃣ 의존성 주입 (DI)
예시
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
동작 과정
1. Spring이 UserService 생성하려고 시도
2. 생성자 확인
3. UserRepository가 필요하다는 것을 발견
4. 컨테이너에서 찾아서 넣어줌
만약 없다면 에러
4️⃣ Bean 초기화
객체 생성 및 주입이 끝나면 초기화 작업 수행
방법
@PostConstruct
public void init() {
System.out.println("초기화 완료");
}
Bean 생성 직후 실행됨
5️⃣ Bean 사용
@Autowired
UserService userService;
어디서든 꺼내서 사용 가능
Bean은 기본적으로 Singleton
: 한 번 생성 → 계속 재사용
6️⃣ Bean 소멸
Spring 종료 시 소멸
@PreDestroy
public void destroy() {
}
정리 작업 수행
등록하는 법 : xml에 직접 등록 / @Bean 사용 / @Component, @Controller, @Service, @Repository 등을 이용
가져다 쓰는 법 : @Autowired 사용(Spring 4.3 이후는 생성자가 하나이면 생략 가능) 혹은 생성자 주입
이전의 개발 방식 : 객체를 직접 생성(new Service())하는 것
객체의 생성과 생명주기 관리 권한을 Spring 컨테이너에 넘겨, 객체를 요구(@Autowired)하는 것을 선언.
Bean 생성 → 의존성 주입 → 보관(Map 형태) → 필요할 때 꺼내쓰기
public class UserService {
private UserRepository userRepository = new UserRepository();
}
UserService가 직접 UserRepository를 생성함
강한 결합
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Spring이 대신 객체를 만들어서 넣어줌
객체 간 의존성 낮아짐.
구현체 사이의 변경이 용이.
프로그램의 진행 흐름과 구체적인 구현을 분리시킬 수 있음.
IoC를 구현하기 위한 디자인 패턴으로, DI를 사용한다.
// 예시
@Service
public class UserService {
private final UserRepository userRepository;
>
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
필요한 객체를 외부에서 넣어주는 것으로
Spring이 자동으로 UserRepository를 생성하고
UserService에 넣어준다.
DI의 방식 3가지
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}