[Spring] 스프링 컨테이너와 빈

jsieon97·2023년 3월 2일

[Spring] BackEnd

목록 보기
7/11

스프링 컨테이너란?

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 합니다

개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸시킬 수 있는데, 스프링 컨테이너가 이 역할을 대신해 줍니다. 즉, 제어 흐름을 외부에서 관리하는 것입니다. 또한 객체들 간의 의존성 관계를 런타임 과정에서 자동으로 생성하며 생성자, @Autowired 등의 어노테이션을 사용하여 관리합니다.

빈이란?

스프링 컨테이너에서 생성된 자바객체들을 빈이라고 부릅니다.
생성된 자바객체를 빈으로 등록하기 위해서는
@Configuration과 @Bean을 사용합니다

@Configuration
public class UserConfiguration {

    @Bean
    public UserRepository userRepository(JdbcTemplate jdbcTemplate) {
        return new UserRepository(jdbcTemplate);
    }
}

위와 같이 @Bean으로 등록된 자바객체는 런타임시 자동으로 의존성 관계를 성립하게 됩니다.

스프링 컨테이너를 사용하는 이유?

DI(의존성 주입)을 다르게 함으로써 같은 서비스에서 다른 Repository에 접근하는 것을 용이하게 변경하기 위해서 입니다.
예를들어 메모리와 MySQL 두 가지에 저장할 수 있는 BookRepository가 있다고 가정한다면 다음과 같이 사용할 수 있습니다.

먼저 인터페이스를 생성합니다.

public interface BookRepository {

    void saveBook();
}

메모리와 MySQL에 저장할 Repository에 위에서 생성한 인터페이스를 implements를 통해 구현하도록 합니다.

@Primary
@Repository
public class BookMySqlRepository implements BookRepository{

    @Override
    public void saveBook() {
        System.out.println("MySqlRepository");
    }
}
@Repository
public class BookMemoryRepository implements BookRepository{

    @Override
    public void saveBook() {
        System.out.println("MemoryRepository");
    }


}

각각 MySQL과 메모리에 저장할 Repository입니다. 여기서 @Primary를 통해 어떤 Repository를 최우선으로 사용할지 지정해줄 수 있습니다.
Service에서는 단순히 인터페이스를 생성하여 사용하고 만약 사용되는 Repository가 변경된다 하여도 @Primary를 붙이는 Repository만 변경하면 되도록 설계됩니다.

스프링빈을 이용할 수 있도록 해주는 어노테이션은 @Configuration과 @Bean 말고도 @Controller, @Service, @Repository를 사용하는 방법이 있습니다.

@Contoller 어노테이션을 붙이면 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성됩니다. 마찬가지로 @Repository, @Service 어노테이션은 해당 클래스를 루트 컨테이너에 빈(Bean) 객체로 생성해주는 어노테이션입니다.

@Controller 어노테이션은 Model에 객체를 담고 View를 반환하지만
@RestController는 @Controller에서 메소드를 객체로 반환할 수 있도록 해주는 어노테이션입니다

profile
개발자로써 성장하는 방법

0개의 댓글