스터디/Spring
스프링 컨테이너에 대해서 알아보자
Big Sun
2022. 7. 15. 15:16
728x90
이번 포스팅에서는 스프링 컨테이너에 대해서 공부한 내용을 정리해보려고 합니다.
스프링 컨테이너(Application Context)
Application Context를 보통 스프링 컨테이너라고 합니다.
스프링 컨테이너는 빈(Bean)을 싱글톤으로 관리합니다. 즉, 동일한 객체를 한 번만 생성하고 애플리케이션 전반에서 공유하여 사용합니다.
스프링 컨테이너에 빈을 등록하기 위해서는 아래와 같이 코드를 작성할 수 있습니다.
빈 직접 등록
@Configuraion
public class TestConfig {
@Bean
public Test test() {
return new Test():
}
}
위 코드의 의미는 다음과 같습니다.
- @Bean을 사용하면 해당 객체를 스프링 컨테이너에서 빈으로 관리합니다.
- @Configuration을 사용하면 해당 클래스가 스프링의 설정 클래스임을 나타내며, 내부에 정의된 빈을 싱글톤으로 관리합니다.
컴포넌트 스캔(Component Scan)
위에서는 빈을 코드로 직접 등록했지만, 스프링에서는 자동으로 스프링 빈을 등록하는 컴포넌트 스캔(Component Scan) 기능을 제공합니다.
- @ComponentScan은 @Component가 붙어 있는 클래스를 찾아서 자동으로 빈으로 등록합니다.
- @SpringBootApplication에는 이미 @ComponentScan이 포함되어 있으므로, 별도로 설정할 필요가 없습니다.
- @SpringBootApplication을 프로젝트의 루트 패키지에 두면, 해당 패키지 이하의 모든 클래스가 자동으로 스캔됩니다.
이와 같은 방식으로 스프링 컨테이너는 빈을 관리하고 애플리케이션 전반에서 활용할 수 있도록 지원합니다.
싱글톤 방식의 주의점
싱글톤 방식은 하나의 객체를 공유하는 방식이므로, 상태를 가지지 않도록 설계해야 합니다. 예를 들어, 아래와 같이 사용한다면 큰 문제가 발생할 수 있습니다.
가급적 읽기 전용으로 사용해야 하며, 필드 대신 지역 변수, 메서드 파라미터, ThreadLocal 등을 활용해야 합니다. 그렇지 않으면 여러 스레드에서 동시에 접근할 때 동시성 문제가 발생할 수 있습니다.
@Component
public class SingletonService {
private int count = 0; // 상태를 저장하는 필드
public void increase() {
count++; // 여러 스레드에서 동시에 접근하면 문제가 발생할 수 있음
}
public int getCount() {
return count;
}
}
SingletonService는 count 필드라는 상태를 저장하는 필드를 가지고 있기 때문에 여러 스레드에서 동시에 접근할 시에 의도하지 않은 값이 나올 수도 있습니다.
지금까지 스프링 컨테이너에 빈을 등록하는 방법과 스프링 컨테이너가 빈을 관리하는 방법에 대해서 알아보았습니다. 감사합니다.
728x90