본문 바로가기
WEB/Spring

[Spring] 스프링 컨테이너란, 스프링 빈 등록법

by 서현 SEOHYEON 2023. 7. 4.

🌸 스프링 컨테이너

- 애플리케이션의 객체(빈)를 생성하고 관리한다.

- 객체의 생명주기를 관리하며, 객체들 간의 의존성을 해결하고 필요한 객체를 제공한다.

- 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 연결, 공통 로그처리 같은 기술 지원은 수동으로 등록해주는 것이 좋다.


이 글은 인프런 [스프링 핵심 원리 - 기본편] 강의를 들으며 학습한 내용 + 직접 조사한 내용을 토대로 작성되었습니다.

댓글