안녕세계

MDC란? MDC(Mapped Diagnostic Context)는 스레드 단위로 데이터를 읽고 쓸 수 있는 기능입니다. MDC를 사용하면 멀티 스레드 환경에서 각 스레드의 실행 컨텍스트를 구분할 수 있어서 모니터링시 추적에 용이합니다. 예를 들어 멀티 스레드 환경에서는 요청 순서대로 로그가 찍히지 않고, 로그가 섞여서 쌓이게 되므로 동일한 스레드의 컨텍스트를 추적하기 위해 MDC를 사용합니다. 스레드 로컬에 대해 알고 계시는 분들은 MDC와 스레드 로컬의 차이점이 무엇인지 궁금하실 수 있을 것 같습니다. 사실, MDC는 내부적으로 스레드 로컬을 사용하고 있어서 별도로 스레드 로컬을 선언할 필요없이 MDC를 바로 사용하면 됩니다. // MDC 내부 public class MDC { static final..

스레드 로컬이란? 여러 스레드가 같은 인스턴스의 필드에 접근하면 최초 스레드가 보관한 데이터는 다른 스레드에 의해서 덮어 씌워질 수 있습니다. 예를 들어, ThreadA가 특정 인스턴스의 필드에 `userA`라는 값을 저장하고 이후 ThreadB가 동일한 인스턴스의 필드에 `userB`라는 값을 저장하면 ThreadA가 인스턴스 필드에 저장한 `userA` 값이 `userB` 값으로 덮어 씌워집니다. 이후 ThreadA가 인스턴스의 필드를 조회할 때 `userB`가 조회되면서 의도하지 않은 동작을 하게 됩니다. 이러한 문제점을 해결하기 위해서 스레드 로컬(Java에서는 java.lang.ThreadLocal 클래스를 제공)을 사용하는 것을 고려해볼 수 있습니다. 스레드 로컬(Thread Local)이란 ..

이번 포스팅에서는 MacOS에서 여러 Java 버전을 설치하는 방법을 알아봅니다. Python에 pyenv가 있다면, Java에는 jenv가 있습니다. 본 예제에서는 brew를 사용하여 AdoptOpenJDK와 jenv를 설치합니다. AdoptOpenJDK 설치 예제에서는 Java8과 Java11을 설치하겠습니다. (언제부턴가 brew에 cask 명령어가 사라지고 install의 --cask 옵션으로로 변경되었더군요 ㅎㅎ) $ brew install --cask adoptopenjdk/openjdk/adoptopenjdk8 $ brew install --cask adoptopenjdk/openjdk/adoptopenjdk11 jenv 설치 $ brew install jenv ~/.zshrc에 jenv 설..

지난 포스팅에 이어서 본 포스팅에서는 Java8에서 컬렉션 프레임워크에 추가된 함수형 인터페이스에 대해 알아봅니다. 인터페이스 메서드 설명 Collection boolean removeIf(Predicate filter) filter 조건의 element 제거 List void replaceAll(UnaryOperator operator) 모든 element를 operator 수행 결과로 반환 Iterable void forEach(Consumer action) 모든 element에 대해 action 수행 Map V compute(K key, BiFunction f) 특정 key에 대해 f 수행 V computeIfAbsent(K key, Function f) 특정 key가 없을 경우 f 수행 후 추가 ..

지난 포스팅에 이어서 본 포스팅에서는 Java8에 이미 정의된 함수형 인터페이스에 대해 알아봅니다. 함수형 인터페이스를 개발자가 직접 만들어서 사용할 수 있지만 항상 새로운 함수형 인터페이스를 정의하기보다는, 자주 쓰이는 형식의 인터페이스는 java.util.function 패키지에 이미 정의된 인터페이스를 사용하는 것을 권장합니다. 1. 기본 함수형 인터페이스 기본 함수형 인터페이스는 매개변수와 반환값에 유무에 따라 함수형 인터페이스 존재합니다. (T: 데이터 타입, R: 리턴 타입) 함수형 인터페이스 메서드 매개변수 반환값 java.lang.Runnable void run() X X Supplier T get() X O Consumer void accept(T t) O X Function R appl..

Java8에 추가된 람다식과 함수형 프로그래밍에대해 알아봅니다. Java8부터 람다식이 추가되면서 Java는 객체지향언어인 동시에 함수형 언어의 기능까지 갖추게 되었습니다. 함수형 언어라고 하면 처음엔 낯설고 어렵게 느껴질 수 있지만 조금만 살펴보면 금방 이해하실 수 있습니다 :) 그럼, 지금부터 람다와 함수형 인터페이스란 무엇인지 알아보겠습니다. ☺️ 1. 람다식이란? 람다식이란 이름이 어려워 보이지만 메서드를 하나의 식(expression)으로 표현한 것을 뜻합니다. 메서드를 람다식으로 표현하면 메서드 이름과 반환값이 없어서 익명 함수라고도 합니다. 람다식은 (1)메서드의 매개변수로 전달될 수 있으며 (2)메서드의 결과로 반환될 수 있습니다. 이러한 람다식 특징 덕분에 메서드를 변수처럼 다루는 것이 ..

Intellij를 사용할 때 내가 원하는 JDK를 바라보고 있지 않거나 찾을 수 없다고 나올 때가 있습니다. 이 경우 어떻게 Intellij에 내가 설치한 특정 JDK를 적용할 수 있는지 알아봅니다. 우선 Intellij를 실행하고 ⌘ + ; 를 눌러서 새로운 JDK 경로를 설정합니다. JDK home path가 알맞게 설정되었는지 확인하고 해당 JDK를 구별할 Name을 설정합니다. JDK 설정을 완료한 뒤 위에서 설정한 JDK로 Project SDK를 변경합니다. ✔︎ Note Intellij 프로젝트에서 JDK가 바뀌지 않으면 프로젝트에서 .idea 파일(Intellij 설정 파일)을 삭제합니다. 해당 파일을 삭제한 뒤 프로젝트를 다시 열면 JDK를 설정이 필요하다고 알림이 뜨면 원하는 JDK를 지..

OpenJDK는 다양한 Vendor에서 제공을 하고 있는데 이번 포스팅에서는 AdoptOpenJDK를 설치합니다. (homebrew를 사용하여 AdoptOpenJDK를 설치하는 방법은 다음 포스팅을 확인해주세요.) OpenJDK 설치를 위해 AdoptOpenJDK 사이트로 접속합니다. → https://adoptopenjdk.net/ AdoptOpenJDK AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX. adoptopen..