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

 

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

 

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

객체의 인스턴스가 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을 등록하는지에대해 이해해보는 시간이되었다

 

 

 

 

사용자의 로그인 상태를 서버에서 처리하는데 사용할수있는 대표적인 두가지 인증방식이있다.

 

1. 세션을 기반으로 인증

2. 토큰을 기반으로 인증

 

 

1. 세션 기반 인증 시스템

세션을 기반으로 인증 시스템을 만든다는것은 서버가 사용자가 로그인중임을 기억하고 있다는 뜻이다.

 

 

직접그려서 글씨체가 이상한건 양해....

 

 

세션 기반 인증시스템에서 사용자가 로그인을 하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id를 발급한다

발급된 id는 주로 브라우저의 쿠키에 저장한다. 그다음에 사용자가 다른 요청을 보낼때마다 서버는 세션 저장소에서

세션을 조회한후 로그인 여부를 결정하여 작업을 처리하고 응답을 한다

 

세션 기반 인증의 단점은 서버를 확장하기가 번거로워 질 수 있다는 점이다.

만약 서버의 인스턴스가 여러개가 된다면, 모든 서버끼리 같은 세션을 공유해야 하므로 세션 전용 데이터베이스를 만들어야 할 뿐 아니라 신경 써야 할것도 많다.

 

 

 

2. 토큰 기반 인증시스템

토큰은 로그인 이후 서버가 만들어주는 문자열이다. 해당 문자열안에는 사용자의 로그인 정보가 있고, 해당정보에는 서버에서 발급되었음을 증명하는 서명이 들어있다.

 

서버에서 만들어준 토큰은 해싱 알고리즘을 통해 만들어진 서명이있기때문에 무결성이 보장된다.

사용자가 로그인을 하면 서버에서 사용자에게 해당 사용자의 정보를 지니고 있는 토큰을 발급해주고, 그러면 서버는 해당 토큰이 유효한지 검사하고, 결과에 따라 작업을 처리하고 응답한다.

사용자 쪽에서 로그인 상태를 지닌 토큰을 가지고있으므로 서버의 확장성이 매우 높다.

서버의 인스턴스가 여러개 늘어나도 서버끼리 사용자의 로그인 상태를 공유 하고 있을 필요가 없기때문이다.

 

 

 

 

이두가지 기능중에서 우선 토큰 기반 인증 시스템을 사용해보겠다.

구현하기 간편하고 사용자들의 인증 상태를 관리하기 쉽기때문이다.

 

 

 

 

+ Recent posts