전체 글 98

2025년 회고, 이슈는 비동기였지만, 책임은 동기였다

올해를 돌아보면, 계획은 분명 세웠는데 그 계획대로 흘러간 적은 거의 없었다.운영 이슈는 생각보다 자주 터졌고, 프로젝트는 “이것만 하면 끝”이라는 말을 믿으면 안 된다는 것도 다시 배웠다.게다가 퇴근 후에는 개인 사정으로 또 다른 일정이 자연스럽게 이어졌다.이상하게도 일이 몰릴 때는 항상 동시에 몰린다. 그리고 그때마다 “지금 이 타이밍에?”라는 말이 절로 나온다. 이 글은 열심히 했다는 자기 위로용 회고라기보다는,왜 이렇게 일이 많아졌고, 그 상황에서 어떤 선택을 했는지를 기록한 글이다.잘 버틴 날도 있었고, 솔직히 좀 벅찼던 날도 있었다.그래도 결국은 다 끝냈고, 그래서 이렇게 회고를 쓴다. 1️⃣ 운영 이슈: 숫자로 보이는 것보다 훨씬 많은 일올해 운영 이슈로 정식 등록된 건 243건이고, 그중 ..

카테고리 없음 2026.01.01

슬로우 쿼리 로그 분석부터 인덱스 튜닝까지: 성능 최적화 실전기

처음에는 몰랐지만, 데이터가 점점 많아지며 실서비스에서 페이지 로딩 속도가 체감될 정도로 느려지기 시작...!!이제는 더 이상 안되겠다 싶어 MySQL 슬로우 쿼리 로그를 분석하게 되었다. 이번 포스팅에서는 슬로우 쿼리 분석 도구인 pt-query-digest 를 활용해 문제를 진단하고, 쿼리 개선 및 인덱스 튜닝을 통해 성능을 최적화한 과정을 공유한다. ✅ 1. 문제 인지: 느려진 페이지 응답 시간운영 중 다음과 같은 문제가 포착되었다.특정 페이지에서 데이터 조회 시간이 3초 이상 소요DB 조회 쿼리 성능 병목 가능성 의심Azure 포털에서 슬로우 쿼리 로그 확인 가능👉 참고: Azure MySQL 슬로우 쿼리 진단 가이드 쿼리 성능 문제 해결 - Azure Database for MySQL - F..

DB 2025.07.08

ArrayDeque는 언제 LinkedList보다 나을까?

자바에서 Queue를 구현할 때 흔히 LinkedList를 사용하는 경우가 많다. 나도 처음엔 아무 생각 없이 이렇게 작성했다:Queue queue = new LinkedList(); 하지만 이 코드는 충분히 동작은 하더라도, 성능 면에서 최적의 선택은 아니다.이번 글에서는 왜 ArrayDeque가 LinkedList보다 더 나은 선택인지, 그리고 실무에서 어떻게 적용할 수 있을지를 정리해봤다. 1. ArrayDeque가 더 나은 이유✅  ArrayDeque는 내부적으로 배열 기반 LinkedList는 각 요소가 노드 객체로 연결되는 구조메모리 사용량이 더 많다.캐시 적중률도 낮다.따라서 삽입, 삭제가 빠를 것처럼 보여도 실제론 느릴 수 있다.반면 ArrayDeque는 동적 배열 구조를 사용하기 때문에데..

Java 2025.04.01

"왜 이렇게 돌아가지?" 디미터의 법칙이 실무에서 중요한 이유

개발하면서 이런 코드 한 번쯤은 보신 적 있지 않나요? String city = order.getCustomer().getAddress().getCity(); 처음 봤을 땐 별문제 없어 보이지만, 나중에 유지보수하다 보면 이런 생각이 들기 시작합니다. “어디서부터 잘못됐지?”“이거 nullPointer 나면 어디가 문제인 거지?”“이거 구조 바뀌면 코드 전부 뜯어고쳐야 하잖아…”  이런 문제를 막기 위해 나온 개념이 바로 디미터의 법칙(Law of Demeter)입니다.🧠 디미터의 법칙이란? "너와 가까운 친구와만 이야기해라!"  객체는 자신이 직접 알고 있는 객체와만 상호작용해야 한다는 원칙입니다. 쉽게 말하면, 체인처럼 객체를 줄줄이 이어서 호출하지 말라는 이야기 !// ❌ 디미터의 법칙을 어긴 코..

JPA Entity Timestamp 관리 전략: DB Level vs Application Level

JPA Entity에서 생성 시간(created_at)과 수정 시간(updated_at)을 관리하는 방식은 크게 두 가지로, 데이터베이스 레벨(columnDefinition)과 애플리케이션 레벨(@CreationTimestamp/@UpdateTimestamp)입니다. 각 방식의 특징과 적합한 사용 환경에 대해 알아보겠습니다.1. 데이터베이스 레벨 관리 (columnDefinition)1.1 구현 방식@Column(name = "created_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")@Generated(event = EventType.INSERT)private Instant createdAt;@Column(name = "updated_a..

DB/JPA 2025.01.20

Java Pattern 클래스 사용 시 반드시 알아야 할 주의점

Java에서 정규 표현식을 다룰 때 Pattern 클래스는 매우 중요한 역할을 한다. 하지만 Pattern을 잘못 사용하면 성능 저하나 예상치 못한 동작이 발생할 수 있다. 나는 실제로 프로젝트에서 정규식을 사용할 때 이러한 문제로 지적을 받은 경험이 있었고, 이를 해결하기 위해 Pattern 사용 시의 몇 가지 주의사항을 정리하게 되었다.   Pattern 클래스란 무엇인가?Pattern 클래스는 Java에서 정규 표현식을 다루기 위한 클래스이다. 주로 Pattern.compile(String regex) 메서드를 통해 정규식을 컴파일하고, 이를 기반으로 생성된 Matcher 객체를 사용해 문자열 매칭 작업을 수행한다. 예를 들어, 다음과 같은 코드로 정규식을 사용할 수 있다.Pattern patter..

Java 2025.01.13

효율적인 테스트 코드를 위한 도구 선택: AssertJ와 JUnit의 차이

테스트 코드를 작성할 때 사용하는 AssertJ와 JUnit의 기본 assert 메서드는 모두 검증 로직을 작성하기 위한 도구지만, 그 사용 방식과 기능, 제공하는 개발 경험에서 차이가 있다. 이 두 가지를 디테일하게 비교하여 설명하면 아래와 같다. AssertJAssertJ는 플루언트 API 스타일과 체이닝 방식으로 구성된 검증 라이브러리로, 테스트 코드의 가독성을 높이고, 복잡한 데이터 타입 검증을 쉽게 처리할 수 있도록 설계되었다. 1-1. 주요 특징플루언트 인터페이스: 메서드를 체이닝으로 연결하여 가독성이 높다. 테스트 코드의 의도를 자연스럽게 드러낼 수 있어 읽기 쉽다.데이터 타입 지원: 기본 데이터 타입뿐만 아니라 리스트, 맵, 배열, 날짜, 예외 등 다양한 데이터 타입을 위한 검증 메서드를 ..

Java 2025.01.10

Spring Boot 'InvalidConfigDataPropertyException' 해결하기

org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-dev.yml]' is invalid in a profile specific resource [origin: class path resource [application-dev.yml] - 3:13] 이 에러는 Spring Boot의 설정 파일 관리에서 잘못된 위치에 특정 프로퍼티를 정의했을 때 발생한다. 특히 spring.profiles.active와 관련된 설정 문제일 가능성이 크다.   에러 원인 분석spr..

error-log 2024.12.22

Hashtable의 동기화(synchronization)

Hashtable의 동기화(synchronization)는 주로 메서드 수준에서의 동기화를 통해 이루어진다. 이는 Hashtable의 메서드들이 synchronized 키워드로 선언되어 있기 때문이다. 이 동작 방식에 대해 좀 더 구체적으로 살펴보면 다음과 같다 메서드 수준 동기화Hashtable의 대부분의 메서드가 synchronized 키워드를 사용하여 구현되어 있다. 이는 동시에 여러 스레드가 동일한 메서드에 접근하는 것을 차단함으로써 데이터의 일관성을 보장한다.예를 들어, 데이터를 삽입하거나 검색할 때 사용하는 put과 get 메서드의 구현은 아래와 같다. put 메서드의 구현public synchronized V put(K key, V value) { // Null 값 처리 if (k..

Java 2024.12.10

Hashtable의 정의와 구조

Hashtable은 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조이다. 내부적으로는 배열과 해시 함수를 기반으로 동작하며, 빠른 데이터 검색과 삽입을 지원한다. Java에서는 java.util.Hashtable 클래스로 제공되며, 동기화를 기본적으로 지원한다는 점에서 HashMap과 차이가 있다.  잠깐, 여기서 Hashtable 의 동기화란?https://hgggny.tistory.com/entry/Hashtable%EC%9D%98-%EB%8F%99%EA%B8%B0%ED%99%94synchronizationHashtable의 구조Hashtable은 해시 함수(hash function)를 이용하여 데이터를 저장할 위치를 결정한다.키를 해시 함수에 전달하여 해시값을 생성한다.생성된 해시..

Java 2024.12.04