Java to KotlinKotlin version먼저 코틀린 설정을 위해 아무 .java 파일 우클릭 후 Convert Java File to Kotlin File 기능을 사용하면 OK, Configure Kotlin In the Project로 코틀린 설정이 가능합니다.JDK 21을 사용할 예정이라서 Kotlin 버전은 2.1.0으로 설정하였습니다.※ Which versions of Kotlin are compatible with which versions of Java?IDE의 도움으로 kotlin 설정을 마치면 build.gradle, settings.gradle 파일에 코틀린 설정이 추가됩니다.Kotlin 설정 및 gradle.kts로 변환䷿AS-IS) build.gradleplugins { ..
📊 동시성 제어 방식 비교SeriesJava Concurrency ControlDatabase Concurrency ControlRedis Concurrency ControlKafka Concurrency ControlCompare Concurrency Control⚠️ 로컬에서 테스트한 결과이고,서버 환경과 여러 요인들에 의해 결과가 달라질 수 있고, 정확하지 않을 수 있습니다.Case 01한정수량 : 50,000Total User : 296Processes : 8Threads : 37(DB Named 방식은 제외).시간 내에 모든 트래픽을 성공적으로 처리한 방식DB PessimisticRedis IncrKafka + Redis.일부 성공을 하긴 하였지만, 트래픽을 버티지 못하고 성능 문제가 발생한 ..
🎯 Java Concurrency ControlRace Condition경쟁상태는 두 개 이상의 스레드가 공유 데이터에 액세스 할 수 있고, 동시에 변경을 하려고 할 때 발생하는 문제Race Condition 으로 동시에 들어오는 요청들이 갱신 전 값을 읽고, 수정하면서실제 갱신이 누락되는 현상이 발생SeriesJava Concurrency ControlDatabase Concurrency ControlRedis Concurrency ControlKafka Concurrency ControlCompare Concurrency Control🏹 Java Asynchronous동시에 들어오는 요청들이 갱신 전 값을 읽고, 수정하면서 실제 갱신이 누락before: 100, after: 99 // 갱신 전 값..
jackson Serialized/DeserializedJackson 직렬화/역직렬화에 대하여 알아보려고 합니다.Field먼저 필드의 접근 제어자와 Jackson의 관계는 어떠할까요?!ℹ️ Jackson 은 public 필드만 기본적으로 직렬화하고 있습니다.@Testvoid jackson_and_access_level_test() throws Exception { ObjectMapper mapper = new ObjectMapper(); JacksonAndAccessLevelTest dtoObject = new JacksonAndAccessLevelTest(); String dtoAsString = mapper.writeValueAsString(dtoObject); System.ou..
Spring 공통 예외 처리(ControllerAdvice, ExceptionHandler) @ControllerAdvice, @ExceptionHandler 는 애플리케이션의 모든 컨트롤러에서 발생할 수 있는 예외를 한 곳에서 관리하기 위해 설계된 기능입니다. 예외 발생 시 ResponseEntity 또는 JSON/XML 형태로 클라이언트에게 에러 정보를 제공할 수 있고, 특정 컨트롤러, 패키지에 대한 예외만 처리할 수도 있습니다. . 아래 코드를 보면 bindingResult 를 검증하는 코드와 try-catch 로 예외를 핸들링하는 것을 볼 수 있습니다. 모든 컨트롤러에 아래와 같은 형태로 구현을 하게 되면 컨트롤러에 코드가 거대해지고 코드를 읽기도 어려워질 것 같죠?! 제가 그랬었답니다..😅 @P..
Record record 클래스를 잘 알고 사용하기 위해 java14에 출시한 record 클래스를 알아보려고 합니다. Intro Record 클래스는 데이터를 저장하는 데 사용되는 DTO(Data Transfer Object)나 VO(Value Object) 같은 간단한 데이터를 운반하기 위한 불변 클래스를 정의할 때 간결하고 유용하게 사용할 수 있습니다. record 클래스는 데이터를 저장하는데 사용되는 DTO(Data Transfer Object)라고 불리는 클래스를 API 요청, 쿼리 결과 등의 데이터 이동에 사용하곤 합니다. DTO는 대부분 불변성을 가지고 있는데, 불변 클래스로 만들기 위해 적지 않은 노력이 필요합니다. 각 데이터에 private, final 키워드 선언 각 필드에 대한 get..
Content type 'application/octet-stream' not supported for bodyType Intro WebClient를 사용하여 아래와 같은 방식으로 API 통신을 하던 중 마주한 예외를 탐구해 보게 되었습니다. Response response = webClient.mutate() .baseUrl(baseUrl).build() .post().uri(uri) .bodyValue(requestBody) .headers(httpHeaders -> httpHeaders.setAll(headers)) .retrieve() .onStatus(HttpStatus::isError, res -> { return Mono.error(new ResponseStatusException(res.s..
파일 시그니처로 유효성 검사하기 기존 반품 신청 시 이미지만 업로드가 가능했었는데요. 이번에 동영상도 업로드가 가능하도록 기능을 추가하게 되었습니다. 클레임 영역에서 동영상 업로드/재생 로직을 신규로 구현하다 보니 신경 써야 할 요소들이 다소 있었습니다. 그중에서 파일 시그니처로 파일 유효성 검사에 대한 내용을 다뤄보려고 합니다. 어느 날 점심을 먹으러 가는 길에 팀원분과 파일 업로드 관련하여 이야기를 나누던 중 팀원분이 문득 "바이러스 파일을 업로드 가능한 확장자로 변경해서 업로드하게 되면 바이러스도 업로드가 가능하지 않을까?"라는 의문을 공유해 주셨습니다. 당시에는 "설마 클레임 신청 시 바이러스를 업로드하는 사람이 있을까?"라고 단순하게 생각했었지만, 계속 생각하다 보니 충분히 가능성이 있는 사례였..