enum은 단순한 이름 상수(name constant)가 아니라, 각 상수마다 다른 데이터를 가질 수 있는 객체다.즉, 아래처럼 NAVER, KAKAO는 단순히 "naver"나 "kakao"라는 이름이 아니라, Partner라는 클래스의 인스턴스이고, 각각 다른 값을 갖는 객체다:enum class Partner(val value: String) { NAVER("naver"), KAKAO("kakao") } Kotlin의 enum class에서 value: String처럼 val 없이 생성자 매개변수만 선언할 때, 이런 단순 생성자 매개변수는 왜 존재하는가? 언제 쓰는가?내부 처리용 임시 매개변수로 사용하려는 경우에만 의미 있음즉, val이나 var 없이 생성자 매개변수를 선언하면, 그 값은 enum 상..
MDCContextclass MDCContext( val contextMap: MDCContextMap = MDC.getCopyOfContextMap()) : AbstractCoroutineContextElement, ThreadContextElementMDCContextMap> (source)MDC context element for CoroutineContext.Example:MDC.put("kotlin", "rocks") // Put a value into the MDC contextlaunch(MDCContext()) { logger.info { "..." } // The MDC context contains the mapping here}Note that you cannot upd..
Slf4j의 문제점아래는 로그 레벨을 Debug로 설정해뒀을 때만 출력되는 로그 예제이다.if (logger.isDebugEnabled()) { logger.debug("{}", foo.veryExpensiveMethod());}이렇게 작성하는 이유는 다음과 같다:foo.veryExpensiveMethod()는 실행 비용이 크다.isDebugEnabled() 조건문을 사용해서 로그 레벨이 DEBUG가 아니라면 호출을 막아 비용을 절감한다.하지만 매번 조건문을 작성해야 해서 보일러플레이트 코드가 발생한다. 람다(Supplier)를 이용한 개선 방식Java 8부터 도입된 람다를 사용하여 개선할 수 있다. 람다는 함수의 마지막 파라미터를 함수 본문으로 옮길 수 있기 때문인데...🔹 Supplier는 ..
In Spring WebFlux, a WebFilter is an interface used to intercept and process web requests and responses in a reactive manner. It provides a mechanism for implementing cross-cutting concerns, such as security, logging, or request/response manipulation, before the request reaches the target handler or after the handler has processed it. Interface Definition: The WebFilter interface defines a singl..
runBlocking은 일반적으로 코루틴이 아닌 코드에서 코루틴을 시작할 때 (예: main 함수, 테스트 코드 등) 사용한다.하지만 이미 코루틴 환경이 구성되어 있는 경우 (suspend 함수 내부, Spring 코루틴 지원, CoroutineScope 내 등)에는 필요하지 않다. 코루틴은 코루틴 안에서만 suspend 함수를 호출할 수 있다.withContext는 suspend 함수이다. 반드시 코루틴 안에서만 호출 가능하다. 그리고 suspend 함수 자체가 코루틴 안에서 실행된다는 뜻이기 때문에, 굳이 runBlocking을 쓸 필요가 없다. suspend fun doSomething() { withContext(Dispatchers.IO) { println("IO 작업 중") ..
e.stackTrace와 e.stackTraceToString()은 예외 처리 시 stack trace 정보를 다룰 때 사용하는 것이지만, 다음과 같은 차이점이 있다e.stackTrace (속성)타입: Array설명: 예외가 발생한 호출 스택의 각 프레임을 나타내는 배열이다.사용 목적: 각 스택 프레임을 프로그래밍적으로 분석할 때 사용한다.예시:val e = Exception("Test") e.stackTrace.forEach { println(it) }Ljava lang stacktraceelemente.stackTraceToString() (함수)리턴 타입: String설명: 예외 메시지 + 전체 stack trace를 문자열 형태로 반환한다.사용 목적: 로그로 찍거나 출력용으로 사용할 때 적합하다...