이전 프로젝트에서 Spring Security와 JWT를 사용해 로그인을 구현했었다. 그 당시에는 구현만 집중하고 개념에 대한 정리를 한 적이 없는 것 같아 Spring Security의 인증과 권한에 대해 기본적인 개념을 정리해보려고 한다. Spring Security 애플리케이션의 인증, 인가와 같은 보안 기능을 제공해준다. 보안과 관련된 ...
스프링 Security
Item89 (인스턴스 수를 통제해야 한다면 readResolve 보다는 열거 타입을 사용하라)
인스턴스 수를 통제해야 한다면 readResolve 보다는 열거 타입을 사용하라 implements Serializable을 추가하면 싱글턴이 될 수 없다. 기본 직렬화를 쓰지 않더라도, 명시적인 readObject를 제공하더라도 마찬가지다. 어떤 readObejct를 사용해도 이 클래스가 초기화될 때 만들어진 인스턴스와는 별개인 인스턴스를 반환하...
Item86 (Serializable을 구현할지는 신중히 결정하라)
Serializable을 구현할지는 신중히 결정하라 어떤 클래스의 인스턴스를 직렬화할 수 있도록 하려면 간단하게 Serializable을 구현해주면 된다. 너무 쉽게 적용할 수 있기 때문에 프로그래머가 특별히 신경 쓸 것이 없다는 오해가 생길 수 있다. 하지만 진실은 그렇지 않다. 직렬화를 구현한다는 것은 아주 값비싼 일이다. Serializa...
Item85 (자바 직렬화의 대안을 찾으라) + JPA에서의 직렬화에 관하여
이번 아이템부터는 직렬화에 대해 다룬다. 직렬화는 자바가 객체를 바이트 스트림으로 인코딩하고 그 바이트 스트림으로부터 다시 객체를 재구성하는 메커니즘을 말한다. 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 나중에 역직렬화할 수 있다. 이 직렬화는 위험성이 존재하는데 그 위험을 최소화하는 방법들을 다룬다. 자바 직렬화의 대안을 찾으라...
Item84 (프로그램의 동작을 쓰레드 스케줄러에 기대지 말라) + 스프링 스케줄러
프로그램의 동작을 쓰레드 스케줄러에 기대지 말라 여러 쓰레드가 실행 중이면 운영체제의 쓰레드 스케줄러가 어떤 쓰레드를 얼마나 오래 실행할지 결정하게 된다. 구체적인 스케줄링 정책은 운영체제마다 다르기 때문에 잘 작성된 프로그램이라면 이 스케줄링 정책에 좌지우지 되어서는 안된다. 정확성이나 성능이 쓰레드 스케줄러에 따라 달라지는 프로그램이라면 다른...
Item83 (지연 초기화는 신중히 사용하라)
지연 초기화는 신중히 사용하라 지연 초기화란 필드의 초기화 시점을 그 값이 처음 필요할 때까지 늦추는 기법이다. 값이 쓰이지 않는다면 초기화도 결코 일어나지 않는다. 지연 초기화는 정적 필드와 인스턴스 필드 모두에 사용할 수 있다. 보통 최적화 용도로 사용되며, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환 문제를 해결하는 효과도 있다. 그...
Item81 (wait와 notify보다는 동시성 유틸리티를 애용하라)
wait와 notify보다는 동시성 유틸리티를 애용하라 java.util.concurrent 패키지는 직전 아이템에서 다루었던 Executor 실행자 프레임워크, 동시성 컬렉션(Concurrent Collection), 동기화 장치(Synchronizer)의 세 범주로 나눌 수 있다. 이번 아이템에서는 동시성 컬렉션과 동기화 장치에 대해 다루어본다...
Item80 (스레드보다는 실행자, 태스크, 스트림을 애용하라) + Callable, Runnable, Executor
스레드보다는 실행자, 태스크, 스트림을 애용하라 이전 아이템에서 동기화에 대해 다루었다. 필요하면서도, 제대로 구현하기 위해서는 외계인 메서드 등을 고려하며 안전 실패나 응답 불가 문제를 없애야 한다. 이렇게 까다로운 동시성 프로그래밍에 도움이 되는 패키지가 등장했다. java.util.concurrent 패키지이다. 이 패키지는 실행자 프레임워...
Item79 (과도한 동기화는 피하라)
과도한 동기화는 피하라 이전 아이템에서 동기화의 중요성을 알아보았지만, 동기화가 과도하면 오히려 역효과가 날 수 있다. 성능을 떨어뜨리고, 교착 상태에 빠뜨리거나 예측 불가능한 동작을 낳기도 한다. 동기화 메서드나 동기화 블록 안에서 제어를 클라이언트에 맡기면 안된다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서의 제어...
Item78 (공유 중인 가변 데이터는 동기화해 사용하라)
이번 아이템부터는 동시성에 대해 다룬다. 쓰레드는 여러 활동을 동시에 수행할 수 있도록 해주는데 이를 위한 동시성 프로그래밍은 단일 쓰레드 프로그래밍보다 어렵다. 잘못될 수 있는 일들이 늘어나고 무엇보다 문제를 재현해내기가 어렵다. 그렇다고 언제까지 피할 수 없다. 내 것으로 만들어야 한다. 동시성 프로그램을 명확하고, 정확하게 만들고 잘 문서화...