300x250
✍️ 서론 논리적으로 연관된 상수를 정의할 때 사용하는 자료형 enum. enum은 심볼릭하게 그 자체로도 의미를 가지지만 필요에 따라 필드를 추가하거나 메서드를 추상화해서 enum이 책임질 수 있는 코드를 구현할 수 있다. 🍊 simple enum enum의 가장 단순한 사용법으로 보통 상태 값이나, 분기를 위한 플래그로 사용된다. public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE; } public class Calculator { public double calculate(double a, double b, Operator op) { if (op == Operator.PLUS) { return a + b; } else if (op == Operator.MI..
✍️ CompletableFuture in loop 다수의 쓰레드를 만들고, 반복된 작업을 비동기적으로 여러 번 수행하고, 수행 결과를 집계하는 코드를 작성해야 할 때가 있다. 가령 뽑기와 같은 확률 로직이 포함된 서비스의 테스트 코드 작성 시에 이와 같은 니즈가 발생한다. 이때 CompletableFuture를 사용하면 비동기 작업과 콜백 메서드를 매우 쉽게 정의할 수 있다. 아래 코드는 반복문 내부에서 CompletableFutre를 만들어 비동기적으로 작업을 수행해서 결과를 반환하고 콜백 메서드에서 결과를 집계하는 샘플 코드이다. public class ParallelAdder { private List synchronizedList = Collections.synchronizedList(new A..
✍️ JWT (JSON Web Token) 개념 JWT(JSON Web Token)란 선택적 서명 혹은 선택적 암호화를 사용해 데이터를 만드는 인터넷 표준으로, 헤더, 페이로드, 서명으로 구성된다. 페이로드는 클레임(claim)을 담은 JSON 형태이며 서명은 무결성과 인증을 위해 사용된다. 쉽게 말하면 JSON 포맷을 이용해서 사용자 정보를 저장하는 Web Token으로, 클라이언트 서버 구조에서 주로 인증과 데이터 전달에 사용된다. 여기서 선택적 서명과 선택적 암호화라는 말이 나오는데 JWT에 서명을 추가하면 무결성이 보장되는 JWS가 되고, 암호화를 추가하면 무결성과 기밀성이 보장되는 JWE가 된다. 비유하자면 JWT를 확장한 클래스가 JWS 혹은 JWE라고 할 수 있다. 하지만 JWT를 이야기할 ..
✍️ Stack, Heap, Thread 결론부터 말하면 ThreadLocal이란 Thread마다 독립적인 변수를 갖도록 지원하는 클래스이다. 쉽게 말하면 Thread마다 독립적으로 읽고 쓰는 변수를 제공하는 클래스이다. ThreadLocal을 이해하기 전에 JVM 메모리 정책을 가볍게 짚고 넘어갈 필요가 있다. Java 8 이후 기준, 메서드 파라미터와 지역 변수는 Stack에 할당되고 그 외의 것들은 Heap에 할당된다. 엄밀히 말하면 틀린 설명이지만 메서드에 정의된 것들은 Stack, 그 외의 것들은 Heap 영역이라고 생각하자. Thread(이하 쓰레드)란 한 프로세스 내에서 실행되는 흐름의 단위이다. 한 프로세스당 기본적으로 하나의 쓰레드를 갖는데 이를 메인 쓰레드라고 부른다. 만약 별도의 쓰레..
📝 Contents 어노테이션 개념과 샘플 코드 ✍️ Annotation 자바 어노테이션은 잘만 사용하면 매우 유용한 자바의 문법이다. 기본적인 종류는 한정되지만 원하는 대로 커스텀 어노테이션을 만들 수 있어서 적재적소에 활용 가능하다. 먼저 어노테이션은 1. 문서화 2. 컴파일러 체크 3. 메타데이터 용도로 사용된다. 문법적으로 @기호가 붙은 심볼을 사용하며 패키지, 클래스, 메서드, 프로퍼티, 변수에 명시할 수 있다. 어노테이션이 붙은 코드를 컴파일 시에 수집해서 API 문서화에 사용되기도 하지만 JavaDoc이라는 좋은 문서화 도구가 있기에 문서화는 가장 비중이 낮은 어노테이션 사용법이다. 이외에도 컴파일 타임에 에러나 경고를 발생시켜 개발자에게 위험 요소를 알리는 목적으로도 사용된다. (= @Ov..
✍️ Map to Set 1. Simple Loop Map map = new HashMap(); map.put(1, "이말년"); map.put(2, "침착맨"); map.put(3, "주호민"); Set ids = new HashSet(); for (int id : map.keySet()) { ids.add(id); } Set names = new HashSet(); for (String name : map.values()) { names.add(name); } System.out.println(ids); System.out.println(names); // [1, 2, 3] // [침착맨, 이말년, 주호민] 2. Constructor Map map = new HashMap(); map.put(1, "..