서론이 글은 리더, 경영진, 그리고 실무 개발자들을 대상으로 합니다. MSA 전환을 고려하거나 이미 추진 중인 조직의 이해관계자들이, 전환 과정에서 발생할 수 있는 문제와 그 해결 방안을 이해하는 데 도움이 되기를 기대합니다. 마이크로서비스 아키텍처(MSA)는 현재 많은 조직에서 주니어 개발자 채용 공고에도 우대사항으로 언급될 만큼 널리 채택되고 있는 아키텍처 패턴입니다. 그러나 MSA 전환은 단순한 기술 도입 이상의 도전으로, 조직 내 모든 구성원의 협력과 상당한 노력이 필요합니다. 기술적인 변화를 성공적으로 이루기 위해서는 단순히 시스템 구조를 변경하는 것만으로는 충분하지 않습니다. 조직의 문화, 비즈니스 전략, 그리고 운영 모델 전반에 걸친 변화가 필요하며, 이러한 변화는 경영진의 확고한 의지와 실..
서론 실무에서 코드리뷰를 하다가 String 함수 관련해서 개발자 의도와 다르게 작동할 수 있는 코드를 발견했습니다. 이 부분에 대해 바로 피드백드리고 정정할 수 있도록 가이드를 제공해 드렸는데요. 어떤 부분인지 어떻게 올바른 코드를 작성할 수 있는지 알아보겠습니다. Java 17, SpringBoot3를 기준으로 작성되었습니다. 배경 현재 회사에서 수개월의 설계를 끝낸 후 아주 활발하게 개발이 이뤄지고 있습니다. 저와 함께 협력하는 개발자는 같은 회사 동료도 있고 다른 회사에서 협력 중이신 분들도 계십니다. 현재 개발에 들어간 지 겨우 1개월 정도인데요. (3월에 시작) 모든 동료분들이 Java/Spring에 익숙한 상황이 아니기에 각 파트별로 기술적 논의와 표준을 정의하는 담당자를 배정했고 제가 그 ..
서론 회사에서 코드 리팩토링을 하는 업무를 하고 있었습니다. 레거시 코드 중 중첩 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는 꼭 지금이 아니더라도 이후에 ..