DB 인덱스와 캐시를 이용한 상품 목록 API 성능 개선 보고서
·
Concept/성능테스트
상품 목록 조회는 페이징과 정렬 조건이 적용된 상태로 제공되는 API입니다.브랜드 ID를 포함하지 않아 여러 브랜드의 상품을 한 페이지에서 볼 수 있으며 정렬 기준은 최신 순입니다.쇼핑몰에서 클릭 수가 많이 발생할 것을 대비해 먼저 정렬 조건에 맞춰 DB 인덱스를 적용했습니다.또한, 트래픽이 가장 많이 집중되는 1·2페이지에는 Redis를 활용한 글로벌 캐시를 도입하여 응답 속도를 높였습니다.세부 테스트 수치와 지표 해석은 보고서 링크에서 확인할 수 있습니다.목록 조회 시 적용한 DB 인덱스 전략상위 페이지에 적용한 글로벌 캐시 설계와 K6 성능 테스트 진행 결과
Aggregate 분리를 고민한 이유
·
Concept/클린코드
Aggregate 분리를 고민한 이유이커머스 개발을 위한 설계를 진행하면서 시퀀스 다이어그램을 그리는 과정에서 Aggregate에 대해 공부하고 고민하게 되었다.“이 도메인을 하나의 Aggregate로 묶을까, 아니면 분리할까?”시작은 “어떤 Service에 요청해야 할까?” 였다처음에는 단순히 기능 흐름을 정리하려고 시퀀스 다이어그램을 그리고 있었다.그런데 어느 순간 이런 의문이 들었다.“브랜드 정보를 가져올 때, ProductService에 요청해야 할까?아니면 BrandService에 직접 요청해야 할까?”예를 들어, 상품 목록을 조회할 때는 당연히 ProductService를 떠올린다.하지만 실제 화면에는 브랜드 이름과 설명 같은 정보도 함께 필요하다.그렇다면 ProductService가 Bran..
[TDD] 테스트 코드 작성
·
Concept/테스트코드
테스트 코드를 작성하면서 배운 것을 작성해봅니다. 단순히 “코드가 잘 돌아가는지 확인하는 용도”를 넘어서 리팩토링의 자신감을 얻고, 테스트 더블을 다루며 다양한 상황을 제어하는 방법을 익혔습니다.또한 Spy와 Mock을 직접 써보면서 둘 사이의 차이를 체감할 수 있었고, 그 차이가 단순한 동작 여부를 넘는다는 것도 알게 되었습니다.아래는 제가 테스트 코드를 작성하면서 정리한 주요 포인트들입니다.목차테스트 코드로 얻는 리팩토링의 안정감테스트 더블(Test Double)이란?Spy와 Mock을 구분하며 느낀 점Spy와 Mock, 단순히 “실제 동작 여부”만의 차이가 아니다 [1] 테스트 코드로 얻는 리팩토링의 안정감처음에는 API 요구사항만 만족하게 코드를 작성했다. 하지만 개발을 진행하며 여러 가지 사항들..
[클린코드] 단위테스트
·
Concept/클린코드
TDD 법칙 세 가지실패하는 단위 테스트 를 작성할 때까지 실제 코드를 작성하지 않는다.컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.테스트 코드와 실제 코드가 함께 나올 뿐더러 테스트 코드가 실제 코드보다 불과 몇 초 전에 나온다.이런 방식은 결과적으로 실제 코드를 거의 모두 테스트하게 되어, 테스트 코드의 관리가 어려워질 수 있다.따라서 테스트 코드에도 실제 코드와 동일한 품질 기준을 적용하는 것이 중요하다.이번 글에서는 유지보수가 쉬운, 클린한 테스트 코드를 작성하는 방법에 대해 살펴본다. 깨끗한 테스트 코드깨끗한 테스트 코드를 만들려면 가독성이 필요하다!1. 보조 메서드로 중복 제거: 세부구현을 없애고 의도 ..
id가 없는 상태의 객체 생성을 위한 편의 생성자
·
Concept/테스트코드
id가 없는 상태의 객체 생성을 위한 편의 생성자보통 DB에 저장되기 전, 즉 id가 아직 없는 상태의 엔티티를 표현할 때 id = 0L로 임시 값을 줘테스트 코드나 서비스 로직에서 빠르게 생성할 수 있도록 간편한 생성자를 만들어 놓는 거야//id 없이도 편하게 객체 생성 가능하도록 하기 위한 생성자 체이닝 기법 public Question(NsUser writer, String title, String contents) { this(0L, writer, title, contents); } public Question(Long id, NsUser writer, String title, String contents) { this.id = id; this..
내부 구조에 기대지 않고 외부에 드러나는 동작을 확인하자
·
Concept/테스트코드
자동차들이 "주어진 횟수만큼 이동 전략을 수행했는가?"에 대한 기능을 검증하려고 했다.이는 자동차들이 매 회차마다 move()를 호출하는지를 확인하는 테스트로,해당 로직은 자동차 경주 게임의 흐름을 제어하는 Game 클래스에서 수행된다.따라서 테스트의 대상은 Game 클래스이며, 각 클래스의 역할은 다음과 같이 정리할 수 있다.RaceCount는 단순히 반복 횟수를 관리하고Cars는 자동차들을 한 번 움직이는 동작만 담당하며Game은 Game은 RaceCount와 Cars를 조합하여 경주를 진행한다.즉, raceCount 횟수만큼 cars.move()를 호출하는 책임은 Game 클래스에게 있다. ✅ 검증할 코드 그런데 막상 검증할 코드를 볼 때는 Game.start() 내부에서 raceCount.pla..
NOFILE 설정 및 프로세스 limit 관리
·
Concept/성능테스트
보호되어 있는 글입니다.
시퀀스 다이어그램
·
Concept/설계
시퀀스 다이어그램이란 시퀀스 다이어그램은 특정 행동이 어떠한 순서로 어떤 객체와 어떻게 상호작용을 하는지 표현하는 행위 다이어그램 시퀀스 다이어그램 그릴 때 유념할 것백엔드 개발자로서 API의 시퀀스 다이어그램을 그릴 때 유념할 점을 정리해보면 아래와 같다. 다른 개발자도 비즈니스 로직의 설계와 흐름을 파악할 수 있도록 그리기도메인별 책임이 잘 드러나도록 도메인 중심으로 그리며, 추상적으로 그린다. (추상적: 구현 레벨이 표현되지 않아도 된다는 것)API 요청의 시작점이 사용자의 액션(curl) 일 때는,  Actor로 사용자를 둔다.USER 측 뿐 아니라 SYSTEM (내부 스케줄러) 도 표현한다.동시성 제어가 필요한 리소스에 트랜잭션, 락 등의 표현을 추가해주어도 좋다.도메인별 책임이 잘 드러나도록 ..
테스트주도개발(TDD) 시작하기
·
Concept/테스트코드
테스트 코드의 필요성복잡한 요구사항들이 나열되어 있는 코드와 부족한 문서의 환경에서 일하면서 아래 고민을 하였다. 도메인지식을 잘 정리해 놓는다는 것은 무엇일까?현업에서 복잡한 요구사항을 정리하고 이를 제대로 구현했는지 테스트하는 과정에서 테스트 코드의 중요성을 다시 한번 깨닫게 되었다.포스트맨에서 여러 케이스에 대해 다양한 파라미터를 설정해 응답을 확인하면서, 테스트코드가 도메인 지식을 정리하는 수단이 되는지 물어본다면, "그렇다"라고 말할 수 있다.테스트 코드는 이런 상황에서 훌륭한 문서 역할을 할 수 있을까?테스트 코드가 중요한 내용을 빠뜨리지 않도록 돕는 역할을 한다고 생각한다.개발 범위를 놓치지 않기 위해 테스트 코드를 작성하면, 그 자체로 비즈니스를 완성하는 데 기여할 수 있다.도메인 지식을 ..
JMeter GET, POST 요청 설정
·
Concept/성능테스트
부하테스트 도구 사용법 JMeter를 처음 사용해보면서 사용법 자체에 대한 검색도 많이 하게 되었습니다. JMeter 공식문서가 있으나 예시가 자세하지 않은 부분이 있어 방법을 찾고 적용하고 실행해보는데 시간이 꽤 걸렸습니다. 검색, 적용에 시간이 많이 걸렸던 부분 위주로 JMeter 사용법을 소개하려고 합니다. JSON 형식의 POST 메서드 API를 테스트할 때, 각 요청마다 다른 requestBody를 설정하는 방법에 초점을 맞추어 JMeter 사용법을 작성했습니다. 목차 부하테스트 공통 개념 JMeter GET 요청 JMeter POST 요청(json type) JMeter CLI모드로 서버에서 실행 JMeter 결과 확인 (Listener) 부하테스트 공통 개념 시나리오, 클라이언트 동시 가동수..
웹 서버 성능테스트 - 병목 해결을 위한 단계별 테스트
·
Concept/성능테스트
회사 프로젝트 오픈 전 얼마만큼의 사용자를 처리할 수 있는지 확인하고 사업 목표 TPS를 달성하기 위해 성능테스트를 진행하였습니다. 성능테스트를 진행하기 전 시나리오를 작성하고 API를 최적화한 작업과, 테스트를 진행하며 병목 포인트를 찾아간 방법과 해결한 과정들을 적어 보았습니다. 웹 서버 성능테스트 과정 목차 어떤 시나리오를 선택 했는지 시나리오 내 API 최적화 작업 사항 부하테스트 도구 사용법 : 개념, 설정방법, 결과 확인 병목 포인트 발견 방법과 해결 과정 1 읽기용 시나리오 작성과 API 최적화 작업 시나리오는 읽기용과 쓰기용으로 나눠서 작성 1-1 시나리오 선정 예약하기 전 사용자가 상품을 둘러보기 전에 가장 많이 접근하는 3개의 페이지를 선정했다. 각 페이지는 여러 API로 이루어져 있다..
[REST API]프로젝트에서 경험한 API 설계 - HATEOAS
·
Concept/REST API
프로젝트에서 경험한 사례로 REST API 의 조건인 HATEOAS에 대해 알아보겠습니다. HATEOAS란 먼저 REST API는 6가지 주요 제약 조건을 가지고 있습니다. 클라이언트 서버 아키텍쳐 STATELESS 캐시 가능성 계층화된 시스템 코드 온디맨드(옵션) 균일한 인터페이스(uniform interface) 그 중에서 균일한 인터페이스라는 조건은 서버와 통신하는 단일 방법이 있음을 나타내는 것으로, RESTful API의 핵심이고 4가지 측면을 갖고 있습니다. 그 중에 하나가 애플리케이션 상태 엔진으로서의 하이퍼미디어 라는 것입니다. 다시 말하면, 리소스를 할당한 후 REST 클라이언트가 하이퍼링크를 통해 현재 사용 가능한 다른 모든 작업을 찾을 수 있어야 하는 것입니다. 예를 들면, 주문 정보..