Spring-Singleton

Developer:Bird·2021년 1월 18일
0

Spring

목록 보기
10/17

[1.Legacy vs Spring]

LegacySpring에서 DIP,SRP,OCP등을 실천하기 위해서 관심사의 분리를 한다. 이를 위해 관리자를 두어서 객체에 대한 정보를 저장하고 주입 시켜줘야하는데, Legacy에서는 하나의 Class에서, Spring에서는 ApplicationContext(Ioc)가 관리를 하게된다. 그렇다면 Legacy와 Spring의 두관리자는 어떻게 다를까? 수많은 차이가 있지만 싱글톤관점에서 집중해보고자 한다.

그렇다면 코드로 비교해보자.

- 레거시 Configuration

public class RidingConfiguration {
    public Driver Driver(){
        return new Driver("geunwoo");
    }
    public HyunDeCar Car(){
        return new HyunDeCar();
    }
}

보기와 같이 객체에 대한 요청을 할때마다 메서드가 실행이되고 계속해서 동적생성이 계속 발생하고 싱글톤패턴을 유지할 수 없게 된다. 따라서 RidingConfiguration관련된 모든것을 싱글톤으로 변경해야한다.

- 싱글톤 Configuration


public class RidingConfiguration {
    private static final RidingConfiguration instance; //여러곳에서 RidingConfiguration을 생성할 수 있기에..
	
    public static SingletonService getInstance () {
            return instance;
    }
    private RidingConfiguration() { }//생성자 호출막아야함
    

    public Driver Driver() {
        Driver.getInstance();
    }

    public HyundeCar Car() {
        HyundeCar.getInstance();
        
    }

이런 번거로운 작업이 이루어지게 된다. 하지만 스프링을 이용하면 이것을 전부 싱글톤으로 관리해준다.

- 스프링 Configuration

@Configuration
public class RidingConfiguration {
    @Bean
    public Driver Driver(){
        return new Driver("geunwoo");
    }
    @Bean
    public HyunDeCar Car(){
        return new HyunDeCar();
    }
}

정말 간단해졌다. 물론 항상 싱글톤으로 유지해야만 하는건 아니다.@scope("prototype")하게 되면 호출시마다 새로운 객체생성 가능하다.

[2.그렇다면 어떻게 SingleTon을 유지할 수 있을까?]

당연하게도 빈이 등록된 모든 메서드 및 객체들에 대해서 컨테이너에 관리하게 되서 다음번에 호출하게 되면 컨테이너에서BeanDefinition()을확인한후 가져 오게된다. 그렇다면 이를 어떻게 하는것인가? 바로 AOPCGLIB(바이트코드 라이브러리)의 비밀이다. 이에 대해서는 나중에 더 알아보자.

[3.SingleTon으로 생기는 문제점]

싱글톤을 사용하게 되면 대규모 트래픽에서 여러 클라이언트들이 bean객체를 같이 사용할때 문제가 생길 수 있다. 클라이언트의 데이터 관련된것을 인스턴스에 state-full하게 가지게 된다면 클라이언트끼리 정보 유출하게 되거나, 트랜잭션이 꼬일 수 있다.따라서 엔티티와 관련되지 않은 모든 객체들은 state-less하게 작성하는 습관이 중요하다.

profile
끈임없이 발전하자.

0개의 댓글