토비의 스프링책을 읽던중에 정리해보고자한다

 

싱글톤이뭘까?? 용어가 궁금했다.

 

싱글톤패턴이란 인스턴스를 하나만 생성하여 사용하는 디자인패턴이라한다.

객체의 인스턴스가 JVM상에 하나만 존재한다는 뜻이다.

 

이러한 인스턴스가 왜하나만 존재하는지이유를 살펴보면

스프링 웹서비스를 기반에 둔 프레임워크이다.

서버클라이언트환경에서 여러개의 클라이언트가 동시다발적으로 서버에 객체 생성을 요구한다.

이로인해 서버에 부하가 발생할 가능성이커진다.

이를 방지하기위해 싱글톤 패턴으로 특정객체의 인스턴스를 한나만 생성시키고

이를 공유해 서버 부하 및 메모리 낭비를 방지한다.

 

이렇다면 하나의 인스턴스를 공유함으로서 서버부하를 줄일수있는 효과가 있을수있겠구나 생각이든다.

 

 

하지만 이러한 싱글톤도 문제가있다고한다.

바로 private !!

class suvCar {

   private static final INSTANCE = new suvCar();
   
   private static suvCar getInstance() { return INSTANCE; }
   
   private suvCar(){}
   
}

 

 

이렇게 싱글톤을 구현하게 되면 해당 Class는 private 생성자때문에 상속을 사용할수없게된다.

 

 

 

 

 

 

그래서 생긴게 싱글톤 레지스트리이다.

 

싱글톤패턴의 문제점 private 를 해결하고, 스프링 IoC컨테이너인 ApplicationContext가

Bean을 싱글톤 형태의 Object로 만들고 관리하는 기능을 말한다.

 

즉 스프링 프레임워크는 기본적으로 객체를 싱글톤으로 생성시킨다.

평소에 많이쓰는 예제 코드로 이해해보자

 

@Service
@RequiredArgsConstructor
public class MemberCreateService {

    private final MemberRepository memberRepository;

    public void createMember(MemberCreateRequest memberCreateRequest) {
    	String email = memberCreateRequest.getEmail();
        String pw = memberCreateRequest.getPw();

        if (!memberRepository.existsByEmail(email)) {
            memberRepository.save(new Member(email, pw));
            return;
        }
        throw new EmailDuplicationException();
    }

}

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MemberCreateRequest {

    private String email;
    private String pw;
   
    @Builder
    public MemberCreateRequest(String email, String pw) {
        this.email = email;
        this.pw = pw;
    }
}

 

@Service로인해 MemberCreateService는 싱글톤 Scope를 가진다

즉 스프링에게 빈으로 등록함으로서 Ioc컨테이너가 알아서 관리하고 의존성주입을 해주면서

싱글톤 Scope를 가지게된다

 

 

1. 전역 변수영역에는 불변 객체인 Repository만 가지고있으며 상태정보를 갖지않는다 -> 무상태(stateless)방식, final, 필드내부변경x

2. 데이터의 변경은 메서드의 파라미터(MemberCreateRequest)를 이용하고있다 -> 파라미터로 Bean사이의 데이터주고받기, 데이터변경

 

 

 

지금까지 싱글톤과 싱글톤레지스트리에 대해 알아보았다

평소 쓰이던 코드에서 왜 이애노테이션사용하고 bean을 등록하는지에대해 이해해보는 시간이되었다

 

+ Recent posts