
서론 회사에서 코드 리팩토링을 하는 업무를 하고 있었습니다. 레거시 코드 중 중첩 Map 형태로 반환하는 부분 때문에 프론트엔드에서는 불필요하게 반환된 객체의 key를 모두 읽고(Object.keys) 가장 최하단의 value에 직접 접근하는 로직을 항상 작성해야 했습니다. 그러다 보니 매번 프론트에서 작성되는 반복문 로직이 작성되어야만 했고 그 반복문 내에서 비즈니스 로직이라도 들어가게 되면 가독성을 매우 저하시키는 상황이 종종 생겼습니다. 그래서 이 중첩 Map 형태를 중첩이 없는 List형태로 반환하고자 코드를 수정하던 중, 누군가가 작성한 var 타입 추론을 만나게 됩니다. 간단히 눈으로 디버깅을 할 때 타입 추론은 IDE에 의존적임을 깨달았는데요, IDE가 없는 Github, GitLab 환경에..

서론 이전 포스팅과 이어 작성됩니다. 2023.05.21 - [Tech/Java&Spring] - 멀티스레드 분산 환경에서의 로깅(1) 멀티스레드 분산 환경에서의 로깅(1) 서론 담당하고 있는 프로젝트에서 사용자 수가 점점 늘어나고, Batch 작업 갯수가 늘어나기 시작했습니다. 드물게 에러가 발생하기도 하는데, 이 때 어떤 상황인지 파악하고 원인을 알아내기 위 imksh.com 지난 포스팅에서 결론은 하나의 요청에서 파생된 로그인지 확인하기 어렵다는 결론이었습니다. 그래서, 이번 포스팅에서는 이를 해결할 수 있는 MDC Filter를 적용해봅니다. MDC란 MDC: Mapped Diagnostic Context MDC는 slf4j 패키지에 속해있는 클래스입니다. 또한 ThreadLocal을 이용해 각 ..

서론 담당하고 있는 프로젝트에서 사용자 수가 점점 늘어나고, Batch 작업 갯수가 늘어나기 시작했습니다. 드물게 에러가 발생하기도 하는데, 이 때 어떤 상황인지 파악하고 원인을 알아내기 위해 로그를 추적하기 시작합니다. Kibana로 로그 모니터링을 하고 있으나 한 가지 문제점을 경험했습니다. 멀티 스레드 및 분산 환경의 모든 로그를 하나로 모아보니 굉장히 많은 로그가 적재되고, 내가 원하는 로그를 찾기가 정말 어려워졌습니다. 이 포스팅에서는 이러한 문제점에 대해 알아보고, 다음 포스팅을 통해 하나의 요청에서 파생된 로그들을 쉽게 구분할 수 있도록 하는 방법인 MDC Filter에 대해 알아볼 계획입니다. 상황 가정 테스트에 사용된 모든 코드는 Github Repository에서 확인할 수 있습니다. ..

실습 환경 MySQL 5.7버전 사용 Windows 10 Entity ID 전략은 IDENTITY Java 11 서론 실무에서 MySQL 5.7 버전을 사용하고 있고, JPA Entity의 ID 전략은 IDENTITY를 사용하고 있는데, 이때 JPARepository를 이용한 saveAll과 save가 bulk insert로 처리되지 않는 것을 발견했습니다. 당장은 saveAll로 아주 많은 데이터를 저장할 일이 없다고 하더라도, 왜 이렇게 작동하는지 확인하고 추후에 동일한 환경에서 bulk 연산을 처리해야 할 때 유연하게 대처할 수 있어야 합니다. 따라서, 이번 기회에 상황과 원인을 파악하고 어떻게 대처할 수 있는지 알아보겠습니다. 결론만 보고 싶으시다면 하단의 “정리” 부분을 보시면 되겠습니다. 작동..

소개 try-with-resources 구문과 native 자원의 관계 이해 대상 독자: 초보 Java 개발자 자바 관련 스터디를 하고 있는데, 이번엔 try-with-resources와 관련된 주제로 얘길 나누었습니다. (이 주제는 이펙티브 자바, 자바의 신에서 꼭 등장하는 내용이기도 합니다) 정말 별 것 아닌 것 같지만, 해당 주제로 대화를 나누기 위해 정말 광범위하고 깊은 키워드들이 등장했었습니다. GC, JVM, JNI, native 영역, FileDescriptor 등등 기본적인 개념에 대해서는 알고 있었으나, 이들의 관계에 대해 간단하게 살펴보고 왜 try-with-resources를 쓰는지에 대해 좀 더 자세하게 알아보겠습니다. (FileDescriptor는 다른 포스팅에서 다룰 예정이라 이..

서론 Vue.js로 프로젝트를 진행하다 게이트웨이로 헤더 값을 보내는 과정 중에 겪었던 일이었다. 기존엔 영어나 숫자로 이루어진 값을 헤더에 담아 보냈었는데, 한글 데이터를 보내게 되면 에러가 발생했다. 한글 이름을 헤더에 담아 보내야했기 때문에 반드시 필요했던 과정이었다. 원인 HTTP Header 표준에 한글은 포함되어 있지 않기 때문이다. 그래서 한글 데이터만 담으면 에러가 발생했고 해당 내용은 링크에서 알 수 있었다. 실제 에러도 HTTP RFC와 관련된 에러가 발생하는 것을 볼 수 있었다. 대처 방법 이미 잘 알고 있겠지만, 인코딩을 해서 보내면 된다. URIEncoding 방식을 이용했고, Javscript에서 제공해주는 함수를 이용했다. 대표적으로 encodeURI()와 encodeURICo..

서론 최근 클린코드 스터디를 진행하며 겪었던 일이었습니다. ```java boolean isVisited = false; ``` 위처럼 백틱(`) 3개로 코드를 감싸는 것을 코드 블럭이라고 합니다. ```suggestion ```java boolean isVisited = false; ``` ``` Pull Request에 코드 블럭을 포함한 Suggestion을 등록했으나 백틱(`)이 제대로 동작하지 않았습니다. 원인 ```suggestion# suggestion 블럭 시작 ```java boolean isVisited = false; ```# suggestion 블럭 끝으로 인식!! ```# 실제 동작해야 하는 블럭의 끝 내용을 보면 유추할 수 있을텐데, 백틱(`)이 자신의 구역을 인지하지 못하고 j..

서론 Intellij IDE를 이용해 Spring Boot 프로젝트 생성 방법에 대해 알아보겠습니다. 생성 방법 1. 프로젝트 생성 Intellij 최초 실행 시, [New Project]를 선택하거나 위 사진처럼 [File] - [New] - [Project]를 선택하는 방법이 있습니다. 2. Spring Initialzr 선택하기 Spring Initializr를 선택하고 설정값을 적어줍니다. 저는 Maven 대신 Gradle과 Java 버전 11을 선택했습니다. Maven에서 Gradle로 변경하는 방법은 꽤 번거로울 수 있으니 잘 선택하시기 바랍니다. 본인 환경에 맞게 설정하시면 됩니다. 3. Spring boot Dependencies 설정 Dependencies는 꼭 지금이 아니더라도 이후에 ..

서론 흔히 알고 있는 "트래픽이 증가하면 서버를 늘린다"에서 그치는 것이 아니라, 어떻게 서버를 늘리는지 그 방법은 어떤 것이 있는지 궁금하여 포스팅하게 되었습니다. 팀구라는 프로젝트를 진행하면서 채팅 서버에 약 40명 정도의 인원이 동시에 채팅을 연사 한 적이 있습니다. t2.micro 서버였지만 거뜬하더라구요. 그때 느낀 점이 "내 생각보다 서버는 튼튼하다"와 "대체 얼마나 많은 트래픽이 있어야 터질까?"였습니다. 국내에서 흔히 접할 수 있는 카카오, 네이버, 당근마켓, 배달의민족과 같은 서비스를 한다면, 사용자가 늘어남에 따라 많은 트래픽을 견디기 위해 어떤 대처를 하면 좋을까요? "요새 내 몸이 하나로 부족해.." 다들 바쁘실 때 이런 말 쓰시죠? 이 상황에서 우리에겐 2가지 선택권이 있습니다. ..

개요 지난번 작성했던 글에 이어 어떻게 민감정보를 숨기는지에 대해 작성하려고 합니다. application.properties 또는 application.yml 파일을 작성하다 보면 datasource.username, datasource.password와 같이 형상관리 페이지에는 숨기고 싶은 정보들이 존재합니다. 이를 숨기거나 암호화할 수 있는 방법이 여러 개 존재하는데, 이 중 사용자 입력을 통해 application.yml에 Argument 전달하는 방법을 포스팅합니다. 결과물 java -jar {jar 경로} --datasource.username=강승현 --datasource.password=비밀번호 --datasource.url=링크 위와 같이 --변수명=value 형태로 값을 전달하게 될 것..