스프링 공부 - 1.5, 1.6 정리

haaaalin·2022년 1월 25일
0
post-thumbnail

스프링의 IoC

오브젝트 팩토리를 이용한 스프링 IoC

👀 용어정리

  • 빈(bean): 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트, 자바빈 또는 엔터프라이즈 자바빈(EJB)에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트. 모든 오브젝트가 빈은 아니다.
  • 빈 팩토리(bean factory): 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
  • 애플리케이션 컨텍스트: 빈 팩토리에서 확장한 IoC 컨테이너, 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일
    빈 팩토리와 애플리케이션 컨텍스트는 같은 말로 봐도 된다.
  • 설정정보/설정 메타정보: 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 메타 정보.
  • 컨테이너 또는 IoC 컨테이너: IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 도는 IoC컨테이너 라고 한다.
  • 스프링 프레임워크: IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용

빈 팩토리나 애플리케이션 컨텍스트는 별도로 설정정보를 가지고 있는 무엇인가를 가져와 활용한다.

그 설정 정보를 가지고 있는 친구를 우리는 DaoFactory로 만들어 보자.

@Configuration
public class DaoFactory {
    @Bean
    public UserDao userDao() {
    	return new UserDao(connectionMaker());
    }
    
    @Bean
    public ConnectionMaker connectionMaker() {
    	return new DConnectionMaker();
    }
}

이렇게 @Bean@Configuration 두 개의 애노테이션만 추가하면 된다.
@Configuration 이 붙으면, 애플리케이션 컨텍스트가 설정 정보로 사용하겠다는 뜻이다.

애플리케이션 컨텍스트의 동작방식

스프링에서는 애플리케이션 컨텍스트IoC 컨테이너, 스프링 컨테이너 또는 빈 팩토리라고 부를 수도 있다.

애플리케이션 컨텍스트는 IoC를 적용해서 모든 오브젝트에 대한 생성과 관계 설정을 담당한다. 그렇지만 DaoFactory 처럼 코드로 작성되어 있지 않고, 별도의 설정정보를 통해 생성정보와 연관관계 정보를 얻는다.

클라이언트가 UserDao의 오브젝트인 userDao의 생성을 getBean() 함수를 통해 요청하면, getBean() 함수에서는 설정 정보(DaoFactory)를 이용해 UserDao 오브젝트를 생성하도록 요청한다. 그렇게 생성된 오브젝트를 클라이언트에게 돌려준다.

👀 애플리케이션 컨텍스트를 사용했을 때의 장점

  • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.

싱글톤 레지스트리와 오브젝트 스코프

🤔 스프링의 애플리케이션 컨텍스트와 기존에 직접 만들었던 오브젝트 팩토리의 중요한 차이점?


DaoFactoryuserDao() 를 여러 번 호출했을 때, 매번 다른 값을 가진 동일하지 않은 오브젝트가 생성된다.

애플리케이션 컨텍스트를 사용해 여러 번에 걸쳐 UserDao 빈을 요청한다면? 매번 동일한 오브젝트가 생성된다.
스프링은 빈 오브젝트를 싱글톤으로 만들고 있다.

왜 그럴까??????????????


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

애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리(singleton registry)이기도 하다.

스프링은 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버 환경이다.
그렇다면, 상상을 해보자. 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 생성해야 한다. 항상 프로그래밍을 할 때에는 극단적 상황을 생각해보라고 했다.

만약에, 초당 5000000번의 요청이 들어온다면? 1분에는 몇 개고, 10분에는 몇 개가 생성될까? 이렇게 부하가 걸리면 서버가 터져버리고 말 것이다.1

👀 싱글톤 레지스트리란?
자바의 기본적인 싱글톤 패턴의 구현 방식은 단점이 많다. 그래서 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공하는데, 이것을 바로 싱글톤 레지스트리라고 한다.


싱글톤과 오브젝트의 상태

멀티 스레드 환경에서의 싱글톤 사용

싱글톤이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에는 상태정보를 내부에 갖고 있지 않은 무상태 방식(stateless)으로 만들어져야 한다.
다중 사용자의 요청을 한꺼번에 처리하는 스레드들이 동시에 싱글톤 오브젝트의 인스턴스 변수를 수정하는 것은 위험하다.
오브젝트가 하나라, 저장할 공간도 하나이니 서로 값을 덮어써야 하고, 그러다 보니 저장하지 않은 값을 읽기도 할 수 있다.

그래서 무상태 방식으로 만들어져야 하는데, 그렇다면 개별적으로 변경되는 정보들은 어떻게 다뤄야 할까?
바로 메소드 파라미터를 이용하거나, 메소드 로컬 변수를 이용하는 것이다.

스프링 빈의 스코프

스코프(scope)란?
빈이 생성되고, 존재하고, 적용되는 범위

스프링에서 만들어지는 대부분의 빈은 싱글톤 스코프를 가진다.
싱글톤 스코프는 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지된다.

profile
한 걸음 한 걸음 쌓아가자😎

0개의 댓글