Java10 무분별한 var를 지양해야 하는 이유
Tech/Java&Spring2023. 6. 18. 16:18Java10 무분별한 var를 지양해야 하는 이유

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

멀티스레드 분산 환경에서의 로깅(2)
Tech/Java&Spring2023. 6. 4. 23:15멀티스레드 분산 환경에서의 로깅(2)

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

멀티스레드 분산 환경에서의 로깅(1)
Tech/Java&Spring2023. 5. 21. 22:43멀티스레드 분산 환경에서의 로깅(1)

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

JPA saveAll이 Bulk INSERT 되지 않았던 이유
Tech/Java&Spring2023. 4. 5. 21:01JPA saveAll이 Bulk INSERT 되지 않았던 이유

실습 환경 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 영역
Tech/Java&Spring2023. 3. 11. 00:24try-with-resources와 native 영역

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

[SpringBoot] Intellij spring boot 프로젝트 생성 방법
Tech/Java&Spring2022. 1. 10. 00:32[SpringBoot] Intellij spring boot 프로젝트 생성 방법

서론 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는 꼭 지금이 아니더라도 이후에 ..

[Springboot] 민감정보 숨기기 - Argument 입력
Tech/Java&Spring2021. 11. 30. 14:31[Springboot] 민감정보 숨기기 - Argument 입력

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

Spring 환경에서 Docker run으로 jar에 argument 전달하기
Tech/Java&Spring2021. 11. 24. 10:49Spring 환경에서 Docker run으로 jar에 argument 전달하기

사전 요구 지식 Docker에 대한 이해 및 실행하는 방법과 Dockerfile 사용법 Spring boot에서 cmd로 값을 입력 받아 사용하는 방법 cmd에서 java jar로 arguments를 전달하는 방법 환경 Spring boot 2.5.7 사용 gitlab-ci로 jar를 docker image로 만들어 빌드합니다. 여기서, 민감정보(datasource.password 등)는 사용자가 직접 입력하는 방식을 채택했으며 아래 사진처럼 username과 password는 사용자가 입력하는 값을 그대로 가져와 사용합니다. 이 때, docker run으로 해당 argument에 값을 전달하려면 어떻게 해야하는지 이 포스트에서 설명합니다. 하지만 해당 포스트에서 spring boot 내에서 argume..

[Spring] Swagger ui Failed to load API definition 에러
Tech/Java&Spring2021. 9. 22. 14:01[Spring] Swagger ui Failed to load API definition 에러

작업 환경 Windows10 Chrome 에러 내용 Failed to load API definition Fetch error undefined http://localhost:8080/v2/api-docs There was an unexpected error (type=Internal Server Error, status=500). The request was rejected because the header value "(생략)=김싸피상품&4444&5555; admin=관리자상품&3000&5555; csrftoken=c5vXn9tLMDisCLLstOQX78Tew0J5qE5htQkUrlE4DdHtKjEG4Pr9CxWdHRG0y4YL; _ga=GA1.1.462135574..

[Java] Error와 Exception에 대해
Tech/Java&Spring2021. 2. 21. 22:05[Java] Error와 Exception에 대해

목차 이런 분들이 읽으시면 좋습니다 Checked, Unchecked를 처음 듣거나 긴가민가 하시는 분 Error와 Exception을 왜 함께 다루는지 궁금하신 분 실습 이전에 이론적 개념이 필요하신 분 왜 Error와 Exception을 함께 다루는가? Exception을 계속 타고 올라가다보면 최상위에 Throwable이 있습니다. 이 Throwable 하위엔 2가지 자식 클래스가 존재하는데, 각각 Error 클래스와 Exception 클래스입니다. 이미 다른 블로그 포스팅에 항상 Exception과 Error를 함께 설명하는 글이 많을텐데요, Throwable의 하위 자식이기 때문에 언급을 하고 넘어가는 것 같습니다. Error Class 에러는 간단하게 짚고 넘어가겠습니다. 백준과 같은 oj사이..

image