본문 바로가기

전체 글297

순차적 작업 처리 시, CompletableFuture.get() 사용에 대해 CompletableFuture는 Java 8부터 표준 라이브러리에 포함된 클래스로, 비동기 작업을 처리하는 데에 주로 사용되는 클래스입니다.이걸 순차적인 작업이 필요한 곳에 사용하게 되면 자칫 성능을 악화시킬 가능성이 있습니다.다음과 같은 코드가 그 예시입니다.CompletableFuture.supplyAsync(() -> { result = doStep1(); // 300ms result = doStep2(result); // 200ms result = doStep3(result); // 150ms return result; // 총 650ms}, executor).get(); 각 단계는 이전 단계의 결과에 순차적으로 의존합니다.별도 .. 2026. 5. 25.
배치 성능 높이기(executeBatch(), rewriteBatchedStatements) 대량 데이터 처리 프로젝트에서 MySQL과 MongoDB의 배치 처리 성능을 비교했다. 결과가 충격적이었다. # 테스트 조건- 약 10,000건 대량 데이터 처리- 1개 테이블/컬렉션- 5개 컬럼 (여러 데이터 변환 작업 포함) # 결과DB1만 건 중 3천 건 처리 시간MySQL8.2sMongoDB0.546s약 15배 차이다.MongoDB는 빠르고, MySQL은 의외로 느렸다. 마이그레이션 배치 코드를 들여다봤다. 분명히 `executeBatch()`를 쓰고 있었다.배치 처리를 하고 있는데 왜 이렇게 느릴까? 의심: executeBatch()가 정말 배치인가?`executeBatch()`는 배치 처리처럼 보이지만, 설정이 없으면 클라이언트 API 레벨에서만 묶인다. # 동작 방식Java Applicati.. 2026. 4. 5.
Relaxed Binding과 Property 우선순위의 함정 개발 중에 예상치 못한 버그를 만났다. 마이크로서비스 환경에서 A 서비스가 B Server로 API 요청을 보낼 때마다 401 Unauthorized가 나왔다. 코드는 문제없어 보였고, API 키도 제대로 주입된 것처럼 보였는데, 삽질 끝에 알게 된 원인은 Spring Boot의 편의 기능 하나였다. Relaxed Binding. Spring Boot Relaxed Binding이란?Relaxed Binding은 Spring Boot가 제공하는 기능으로, 환경변수나 시스템 프로퍼티의 다양한 이름 형식을 자동으로 properties에 매핑해주는 것이다.예를 들어 다음은 모두 같은 설정을 가리킨다.형식예시KebabCaseservice.api-keyCamelCaseservice.apiKeyUnderScore.. 2026. 4. 5.
Kubernetes + Quartz 환경 Job 중복 실행된 원인 # 요약Kubernetes, 멀티 파드 환경에서 Quartz 스케줄러를 클러스터 모드로 잘 사용하고 있다고 생각했다. 하지만, `instanceId`가 구분되어 있지 않아, 실제로는 정상 동작하지 않고 있었다. 확인해보니 Job이 파드마다 한 번씩 실행되고 있었으며, `instanceId=AUTO`와 `clusterCheckinInterval` 설정을 통해 정상 복구하였다.---# 문제 상황Kubernetes 환경에서 Quartz 스케줄러를 다음과 같이 구성하여 사용 중이었다.- `isClustered=true`- 동일 서비스 파드 2개- 동일 DB를 사용하는 JDBC JobStoreQuartz 클러스터 모드에서는 동일 Job이 클러스터 내 한 노드에서만 실행되는 것이 정상이다.하지만 운영 중 다.. 2026. 3. 8.
WSL2 - Windows 파일 시스템 권한 변경 안되는 이슈 # windows 파일 시스템 mnt/c/~ 경로에 위치한 파일의 권한 변경 안되는 이슈권한 변경이 필요한 파일을 도커 볼륨을 통해 컨테이너 안에서 권한 변경을 시도했지만 실패. WSL2에서 Windows 파일 시스템(/mnt/c/)에 있는 파일은 기본적으로 Linux 파일 권한 변경(chmod, chown)이 적용되지 않음.이 문제를 해결하려면 wsl.conf 설정을 수정하여 metadata 옵션 활성화가 필요함. WSL2에서 Windows 파일 시스템(/mnt/c/)은 기본적으로 NTFS 파일 시스템을 사용하며, Linux의 파일 권한(chmod, chown) 저장할 수 없음.metadata 옵션을 활성화하면 WSL이 파일 권한 정보를 별도의 메타데이터로 저장하여 Linux 파일 권한을 변경할 수 있.. 2025. 3. 29.
DB 커넥션 관련 에러 - 트랜잭션 # 에러 메시지### Caused by: co[http://m.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException:](http://m.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException:) Lock wait timeout exceeded; try restarting transaction\### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cann.. 2025. 3. 29.
Datagrip Data Source 연결 시, invalid fetch size 문제 해결 Maria DB를 로컬에 생성한 후, Datagrip을 통해 Data Source를 연결하는 과정에서 문제가 발생하였습니다.  Test Connection을 통해 정상적으로 연결되는 것을 확인하였습니다.OK를 눌러 Data Source 연결을 적용하려고 하니, 우측 하단에 다음과 같은 경고 문구가 떴습니다.  Data Source를 연결할 때, 디폴트 값으로 설정된 fetch size에 문제가 있나 싶었습니다.해당 Data Source의 속성 설정에 들어가 defaultFetchSize 값을 늘려서 연결해보았지만 실패했습니다.  관련해서 구글링을 해보다가 Jetbrains YouTrack에 동일한 이슈에 대해서 다루고 있었고, 해답을 찾게 되었습니다.  JDBC 드라이버의 버전 문제였고, 버전을 낮춰주니.. 2024. 6. 16.
Mac에서 MySQL 완전 삭제하기 터미널에서 다음 명령어 입력 homebrew를 통해 MySQL을 설치했을 때sudo rm -rf /usr/local/var/mysqlsudo rm -rf /usr/local/bin/mysql*sudo rm -rf /usr/local/Cellar/mysql MySQL 공식 홈페이지의 dmg파일로 설치했을 때sudo rm -rf /usr/local/mysqlsudo rm -rf /Library/PreferencePanes/My*sudo rm -rf /var/db/receipts/com.mysql.* 출처: https://imthekingofcoding.tistory.com/8 2024. 4. 19.
[책 리뷰] 객체지향의 사실과 오해 읽게 된 계기  전부터 이 책을 알고는 있었지만, 항상 읽어야지.. 읽어야지.. 생각만 했었다. 이런저런 생각은 많은데, 바로바로 실행에 옮기는 게 쉽지는 않다. 엄청난 필요성을 느끼는 게 아니면, 그냥 생각하는 선에서 그치곤 한다. 그러던 중, 우테코 프리코스 미션을 수행하면서 객체지향 설계에 관한 지식의 필요성을 굉장히 많이 느꼈다.  프리코스 동안의 미션들은 대부분 클래스의 적절한 설계, 클래스 간의 낮은 결합도와 상호작용을 많이 신경써야 했고, 또 그 부분을 지키려고 애썼다. 매 주차마다 더 나은 설계를 하고 싶었고, 그래서 이 책을 택해서 읽게 되었다. 객체지향 하면 떠오르는 캡슐화, 상속, 다형성, 추상화 등의 특징들 이외에도 객체지향 설계에 관한 내용을 더 알아보고 싶었다.   기억에 남는 .. 2024. 2. 21.