• 스프링 빈 : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트 단위의 컴포넌트

애플리케이션 컨텍스트

빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리 혹은 애플리케이션 컨택스트라고 부른다. 빈 팩토리라고 말할 때는 빈의 생성하고 관계를 설정하는 IoC기본 기능에 초점을 맞춘 것이고, 애플리케이션 컨택스트라고 말할 떄는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC엔진이라는 의미가 더 부각된다고 보면 된다.

예제

// ApplicationContext(BeanFacotory 인터페이스 상속함) 인터페이스 구현
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
// "userDao" 이름의 메소드 호출
UserDao dao = context.getBean("userDao", UserDao.class);
@Bean
public UserDao userDao() {
    return new UserDao(connectionMaker());
}

userDao라는 이름의 메소드에 @Bean이라는 어노테이션을 붙였는데, 이 메소드의 이름이 바로 빈의 이름이 된다. userDao라는 이름의 빈을 가져온다는 것은 DaoFactory의 userDao() 메소드를 호출해서 그 결과를 가져온다고 생각하면 된다.

오브젝트 팩토리 vs 애플리케이션 컨텍스트

  • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.

    클라이언트가 필요한 오브젝트를 가져오려면 어떤 팩토리 클래스를 사용해야할지 알아야 하고, 필요할 때마다 팩토리 오브젝트를 생성해야 하는 번거로움이 있다.

    애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 이를 알아야 하거나 직접 사용할 필요가 없다.

  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.

    오브젝트 생성과 관계설정 뿐만 아니라 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 설정할 수도 있고, 부가적으로 자동생성, 오브젝트 후처리, 정보의 조합, 설정방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용이 가능하다. 빈이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공해주기도 한다.

  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.

    getBean() 메소드는 빈의 이름을 이용해 빈을 찾아준다. 타입만으로 빈을 검색하거나, 특별한 애노테이션 설정이 되어있는 빈을 찾을 수도 있다.

싱글톤 레지스트리로서의 애플리케이션 컨텍스트

애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다. 스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.

싱글톤 레지스트리는 스태틱 메소드와 private 생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 해준다.

싱글톤 패턴과 달리 싱글톤 레지스트리는 스프링이 지지하는 객체지향적인 설계 방식과 원칙, 디자인 패턴을 적용하는 데 제약이 없다.

싱글톤과 오브젝트의 상태

싱글톤이 멀티스레드 환경이라면 여러 스레드가 동시에 접근해서 사용할 수 있다. 따라서 상태관리에 주의를 기울여야 한다. 기본적으로 싱글톤이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에는 상태정보를 내부에 갖지 않는 무상태(stateless)방식으로 만들어져야 한다.

다만, 읽기전용의 값이라면 초기화 시점에서 인스턴스 변수에 저장해두고 공유하는 것은 아무 문제가 없다.

상태가 없는 방식으로 클래스를 만드는 경우에 각 요청에 대한 정보나, DB나 서버의 리소스로부터생성한 정보는 파라미터와 로컬 변수, 리턴 값 등을 이용하면 된다. 메소드 파라미터나, 메소드 안에서 생성되는 로컬 변수는 매번 새로운 값을 저장할 독립적인 공간이 만들어지기 때문에 싱글톤이라고 해도 여러 스레드가 변수의 값을 덮어쓸 일은 없다.

스프링 빈의 스코프

스프링이 관리하는 오브젝트, 즉 빈이 생성, 존재, 적용되는 범위를 스코프라고 한다. 스프링 빈의 기본 스코프는 싱글톤이다. 싱글톤 스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서, 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지된다.

프로토타입 스코프는 컨테이너에 빈을 요청할 때마다 새로운 오브젝트를 만들어준다.

요청(request)스코프는 HTTP 요청이 생길때마다 생성된다.

세션(session)스코프는 웹의 세션과 스코프가 유사하다.

출처

토비의 스프링(책)

태그:

카테고리:

업데이트:

댓글남기기