🌸 스프링 컨테이너
- 애플리케이션의 객체(빈)를 생성하고 관리한다.
- 객체의 생명주기를 관리하며, 객체들 간의 의존성을 해결하고 필요한 객체를 제공한다.
- IoC(Inversion of Control) 컨테이너라고도 알려진다.
❓ IoC(제어의 역전)란?
객체의 생성과 관리를 개발자가 직접하지 않고 컨테이너에 위임하는 것을 의미한다. 이를 통해 컴포넌트들 간의 결합도를 낮추고 유연성과 확장성을 향상시킨다.
<IoC 위반 사례>
public class UserService {
private UserDao userDao = new UserDao();
public void saveUser(User user) {
userDao.save(user);
}
}
//이 코드에서 UserService 클래스는 UserDao 클래스를 직접 생성해서 사용(의존하고 있음)
//UserDao 클래스를 변경하거나 다른 데이터 엑세스 기술을 써야할 때 모든 의존관계를 수정해야 하는 어려움이 있음. (유연성 떨어짐)
<해결 예시>
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(User user) {
userDao.save(user);
}
}
//이 코드에서는 생성자를 통해 UserDao 객체를 주입받고 있음
- 스프링 컨테이너의 주요 역할들
① 설정에 따라 필요한 객체(빈)들을 인스턴스화하고 메모리에 올린다.
② 객체가 다른 객체에 의존하는 경우, 스프링은 필요한 객체를 찾아 주입해준다.
③ 빈의 생명주기를 관리한다. 초기화와 소멸을 적절한 시점에 처리한다.
④ 빈의 스코프를 관리한다. 싱글톤, 프로토타입 등 다양한 스코프를 제공한다.
❓ 빈(Bean)이란?
스프링 컨테이너에 의해 관리되는 객체
스프링 컨테이너에 의해 인스턴스화되고 초기화된다.
- 스프링 컨테이너의 종류로는 ApplicationContext 인터페이스를 구현한 여러 구현체들이 있다. ex) AnnotationConfigApplicationContext, GenericXmlApplicationContext, FileSystemXmlApplicationContext 등... 각 컨테이너는 다양한 방식으로 설정 정보를 제공받아 객체를 생성하고 관리한다.
🌸 스프링 빈 등록방법
① @Configuration과 @Bean을 사용하여 등록하는 방법(수동)
- @Configuration 애노테이션이 지정된 클래스에서 @Bean 애노테이션을 사용하여 빈을 생성하고 등록한다.
- @Bean이 붙은 메서드를 호출해서 해당 메서드가 반환하는 객체를 스프링 빈으로 등록한다.
- 빈의 이름은 @Bean이 붙은 메서드 이름을 기반으로 생성된다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
- myBean()가 반환하는 MyBean 객체가 스프링 빈으로 등록된다.
② @ComponentScan을 사용하여 등록하는 방법(자동)
- @ComponentScan은 스프링 컨테이너에게 지정된 패키지와 하위 패키지를 스캔하여 컴포넌트를 찾아 스프링 빈으로 등록하도록 지시한다. (만약 패키지를 지정하지 않을 경우 @ComponentScan이 붙은 클래스의 패키지와 그 하위패키지를 스캔한다.)
- 컴포넌트 클래스에는 @Component나 @Service, @Repository, @Controller 애노테이션이 붙어있어야 스프링이 해당 클래스를 빈으로 등록한다.
- 빈의 이름은 클래스 명을 사용하되 맨 앞글자만 소문자를 사용한다.
@Configuration
@ComponentScan("com.example.package")
public class AppConfig {
// 설정 내용
}
❓ 그렇다면 자동과 수동을 어떻게 활용할까?
- 일단 결론부터 말하면 자동을 선호하는 추세
- 관리할 빈이 많아지면 설정 정보를 관리하는 것 자체가 어렵다.
- 컨트롤러, 서비스, 리포지토리 등 업무 로직은 자동 등록을 해주고, DB 연결, 공통 로그처리 같은 기술 지원은 수동으로 등록해주는 것이 좋다.
이 글은 인프런 [스프링 핵심 원리 - 기본편] 강의를 들으며 학습한 내용 + 직접 조사한 내용을 토대로 작성되었습니다.
'WEB > Spring' 카테고리의 다른 글
[Spring] 스프링 @Controller, @ResponseBody, @RestController 애노테이션 (0) | 2023.08.16 |
---|---|
[Spring] HTTP 요청을 매핑하는 @RequestMapping (0) | 2023.08.07 |
[Spring] 스프링 부트에서 caffeine 캐시 사용하기 (0) | 2023.06.13 |
[Spring] Spring boot 에서 application.yml 과 application.properties의 차이점 (0) | 2023.05.23 |
[Spring] 빈 생명주기 콜백 (0) | 2023.01.04 |
댓글