전체 글

저의 지식이 세상에 가치를 더하길 바라는 백엔드 지망생입니다.
SSL 인증서의 방식 SSL은 HTTPS 프로토콜이 돌아가는 보안이 강화된 프로토콜을 말한다. SSL 인증서는 클라이언트에게 서버의 신원을 보장해주는 역할을 한다. 보통 웹서버에 설치한다. 요즘은 NGINX에 설치하는 경우가 많다. 서버는 클라이언트로부터 요청이 올 때 인증서를 클라이언트에게 보내준다. 서버는 CA라는 인증된 기업으로부터 SSL 인증서를 구매했다. 클라이언트인 브라우저는 공인된 CA의 리스트를 가지고 있다. 서버로부터 인증서가 왔을때 인증서를 발급해준 CA가 자신의 공인된 CA 리스트에 들어있는지 판단한다. 인증서 내부에는 여러 데이터들이 있는데 핵심은 서버가 생성한 공개키이다. SSL 인증서를 통한 보안 통신의 과정을 살펴보자. 공인된 CA로부터 발급된 인증서라는건, 그 CA의 공개키로..
@Authentication을 통한 인증 유저를 가져오는 과정에서 겪은 문제와 제가 해결한 방법에 대해 공유하고자 합니다. @AuthenticationPrincipal 어노테이션의 사용법을 구글에 검색했을때, 많은 블로그에서 UserDetailsService를 구현한 CustomUserDetailsService의 loadUserByUsername 메서드에서 반환해준 값을 파라미터로 직접 받아 사용할 수 있다고 알려줬습니다. loadUserByUsername 메서드에서 반환하는 UserPrincipal 객체입니다. UserDetails를 구현하는 방식으로 만들었습니다. 전체 코드 중 일부를 가져온 것이기 때문에 '이런 객체를 반환하도록 만들었구나' 정도만 생각해주면 감사하겠습니다. 이제 Controller..
· Dev Book
Comparable 인터페이스를 구현한 클래스의 인스턴스는 자연적인 순서를 가지게 된다. Comparable 인터페이스는 compareTo라는 메서드를 하나 가진다. compareTo 메서드는 동치성 비교와 순서 비교가 가능하다. 자바의 거의 모든 값 클래스와 열거 타입이 Comparable을 구현한 상태이다. CompareTo 메서드의 일반 규약 동치성 인스턴스 자기 자신을 compareTo로 비교한 값은 0이 나와야 한다. n1.compareTo(n1) 대칭성 인스턴스 두개의 비교 순서를 뒤집으면 항상 반대의 값이 나와야 한다. n1.compareTo(n2) // 양수 n2.compareTo(n1) // 음수 추이성 n1.compareTo(n2) > 0 n2.compareTo(n3) > 0 // 추이..
· Dev Book
우리는 흔히 자원을 닫아주는 close 메서드를 사용할때 try-finally 안에서 처리해준다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try{ return br.readLine(); } finally { br.close(); // finally 블록 안에서 close 메서드 호출! } } 위의 방법을 사용했을때의 문제점은 크게 두가지가 있다. 자원을 두개 이상 사용하면 구조가 복잡해진다. 예외가 정상적으로 표시되지 않는다. 두번째 문제점에 대해 조금 더 알아보자. 예외가 중첩으로 일어날때, 가장 중요한 예외는 가장 먼..
· Dev Book
자바는 가비지 컬렉터(GC)를 사용하여 메모리를 관리해주기 때문에 직접 메모리를 관리해야 하는 C/C++ 언어보다 사용하기 편리하다. 하지만 가비지 컬렉터가 모든 메모리 관리를 대신해준다고 믿고 있다가는 메모리 누수로 성능 저하가 일어날 수 있다. 메모리 누수의 예를 살펴보자. 스택의 예 public class Stack { private Object[] elements; // 배열에 들어가있는 데이터의 개수 private int size = 0; // 배열의 고정 할당 크기, size가 이 크기를 넘어가면 복사해서 새로 만든다. private static final int DEFAULT_INITIAL_CAPACITY = 10; public Stack() { elements = new Object[Def..
· Dev Book
똑같은 기능을 하는 객체는 매번 생성하기 보다 객체 하나를 재활용 하는 방법을 선택하자. 객체 재활용의 대표적인 예로 String 클래스가 있다. String 클래스의 문자열 생성 과정을 살펴보자. String s = "java" // String constant pool을 사용하는 방법 String s2 = new String("java") // 일반적인 객체 생성을 사용하는 방법 위의 리터럴(" ")을 사용하는 방법은 String의 intern() 메서드를 사용해 String constant pool 내부의 문자열 객체를 재활용 한다. 반면 아래의 객체 생성 방법은 Heap에 문자열 객체를 생성한다. String s1 = new String("java") String s2 = new String("j..
· Dev Book
의존 관계를 가지는 두 가지 경우를 먼저 살펴보자 // 정적 유틸리티 클래스 방식 public class SpellChecker { private static final Lexicon dictionary = new KoreaDictionary(); private SpellChecker() {} // 객체 생성 방지 } // 싱글톤 방식 public class SpellChecker { private static final Lexicon dictionary = new KoreaDictionary(); public static SpellChecker INSTANCE = new SpellChecker(); private SpellChecker(){}; } 위의 두가지 경우는 다양한 사전 종류에 유연하게 대처하..
· Dev Book
[ 유틸리티 클래스 ] 객체 생성이 목적이 아닌, 정적 메서드와 정적 필드만을 사용하기 위해 만들어진 클래스를 유틸리티 클래스라고 한다. 유틸리티 클래스의 예로 java.lang.Math가 있다. public final class Math { // Math 내부는 모두 static 변수와 static 메서드로 이루어져 있다. public static final double E = 2.7182818284590452354; ... public static double floor(double a) { return StrictMath.floor(a); } ... } java8 이전에는 인터페이스에 static 메서드 선언이 불가능했기때문에 이런 유틸리티성 작업은 모두 클래스에서 해야했지만, java8 이후로는 ..
Jemlog
깊게 자라기