2024년부터 진행해온 축제 SaaS 서비스 페스티맵은 고객(축제 운영팀)마다 하나의 축제를 등록하고, 각 축제의 메인페이지를 위젯 단위로 구성해 축제 분위기에 맞는 사이트를 만들어주는 서비스입니다.2024년 상반기, 메트릭 모니터링을 통해 `/home/{festivalId}` API의 응답 시간이 다른 API들보다 눈에 띄게 높다는 것을 발견했습니다. 이를 단일 테이블 상속 전략으로 개선했었는데, 이 글에서는 그 당시 왜 그런 선택을 했고, 그 선택이 어떤 새로운 문제를 낳았으며, 이를 어떻게 해결했는지를 다룰려고 합니다. 나아가 2025년 한 해 동안의 Google Analytics 통계를 기반으로 메인페이지 조회 성능을 한 단계 더 개선한 과정까지 함께 정리해 보겠습니다. 1. 단일 테이블 상속 전..
축제 SaaS 서비스 페스티맵(Festimap)은 고객마다 하나의 축제를 등록하고, 각 축제의 메인페이지를 위젯 단위로 구성해 축제 분위기에 맞는 사이트를 만들어주는 서비스입니다. 그러던 중 고객사로부터 티켓 예매 기능 요청이 들어왔고, 빠른 일정 안에 비관적 락 기반의 예매 시스템을 구현하여 실제 목포 W쇼 티켓팅에 도입했습니다.다행히 초과 발급은 발생하지 않았지만, 운영 과정에서 응답 지연과 커넥션 풀 고갈 문제가 드러났습니다. 이 글에서는 비관적 락을 선택한 배경부터, 기존 코드의 문제 분석, 그리고 두 번의 걸친 개선 과정을 정리해 보겠습니다. 1. 비관적 락 도입 배경축제 티켓 예매는 평소에는 트래픽이 거의 없다가, 오픈 시점에 수백 명이 동시에 같은 잔여 티켓을 두고 경쟁하는 구조다. 동시성 ..
Java로 코딩테스트 문제를 풀던 중, 2차원 배열을 clone() 메서드로 복제한 후 수정하는 로직에서 원본 배열까지 함께 변경되는 문제를 경험했다. 당시에는 "clone이 얕은 복사를 수행하기 때문"이라는 표면적인 이해만으로 넘어갔고, 2차원 배열은 무조건 2중 반복문으로 복사해야겠다는 생각만 가진 채 문제를 마무리했다. 최근 『이펙티브 자바』와 『이것이 자바다』를 읽으며 배열의 메모리 구조와 clone()의 동작 원리를 깊이 있게 학습할 기회가 있었다. 힙 메모리에서 1차원 배열과 2차원 배열이 각각 어떻게 관리되는지, 그에 따라 clone()이 어떻게 동작하는지를 이해하면서 가변 객체, 불변 객체, 깊은 복사, 얕은 복사의 개념을 명확히 정리할 수 있었다. 이 글에서는 학습한 내용을 바탕으로 cl..
Spring Boot로 개발하다 보면 @Builder, @Service같은 어노테이션을 너무나 자연스럽게 사용하게 됩니다. 하지만 문득 이런 생각이 들었습니다."만약 Lombok이나 Spring이 없다면 어떻게 구현해야 할까?" 그래서 이번에는 빌더 패턴과 싱글톤 패턴을 직접 구현하면서 이전까지 이론적으로만 학습해왔던 디자인 패턴들에 대해 자세하게 공부해 보며 직접 적용할 때는 어떤 점을 주의해야하는지 학습해 보았습니다. 1. 빌더 패턴 왜 필요할까?객체를 생성할 때 이런 코드를 본 적 있으신가요?Pizza pizza = new Pizza(12, "thin", "mozzarella", "tomato", "olive", "pepperoni", true, false); 매개변수가 8개나 되는데, 순서도 헷갈..
1. 기획 동기상반기 입사 지원을 하면서 자주 사용하는 파일이나 사진을 크롬 브라우저에서 업로드할 때마다 불편함을 느꼈다. 파일을 찾아가는 과정이 생각보다 귀찮고 번거로웠기 때문이다.위 화면은 내 노트북에서 파일 업로드 버튼을 클릭했을 때 나오는 파일 탐색기다. 여기서 원하는 파일을 찾아가는 시간을 줄일 수 있지 않을까? 이런 생각에서 '파일 경로 북마크' 프로젝트가 시작되었다. 크롬 우측 상단의 북마크 탭처럼, 내 노트북의 파일 경로를 북마크로 저장하면 파일 업로드 시 찾아가는 시간을 획기적으로 줄일 수 있을 것 같았다. 2. 요구사항 정리애플리케이션 개발에 앞서 가장 고민했던 지점은 "북마크를 정말 필요한 순간에 바로 사용할 수 있어야 한다"는 것이었다. 이상적인 시나리오를 그려보니, 크롬에서 파일 ..
책이랑 강의로 객체지향 패러다임에 대해 공부하며 직접적으로 문제 하나에 대해 처음부터 끝까지 코드를 작성하는 연습을 진행해야겠다는 생각이 들었다. 계속 개념적으로만 학습을 진행해 실제 구현을 해나갈 때 어떤 고민들과 문제점을 마주치는지 경험하고자 레스토랑 음식 주문 시스템을 구현해 보기로 결정했다. 관련 레포지토리는 아래 링크를 참고해 주세요. 문제의 요구사항은 생성형 AI가 일부 만들어줘서 제시된 스켈레톤 코드를 필수적으로 구현하려 하진 않았고, 핵심 기능에 해당하는 입출력 예시와 요구사항을 만족시키도록 코드를 작성하였습니다. GitHub - HeeChanN/oop-food-order-management-system: OOP 연습(2) - 레스토랑 주문 시스템OOP 연습(2) - 레스토랑 주문 시스템...