[order] JPA N+1 문제 개선: FETCH 조인과 IN
N+1 문제가 발생했다. 주문 시스템을 개발하며 주문 내역 조회 API를 구현했다. 기능이 정상적으로 동작하는 것을 확인한 후, 실제 쿼리가 어떻게 발생하고 있는지 성능을 점검해 보기로 했다. 이를 위해 애플리케이션 속성에 다음 설정을 추가하여 쿼리 발생량을 확인했다. spring.jpa.show-sql: true / spring.jpa.p...
N+1 문제가 발생했다. 주문 시스템을 개발하며 주문 내역 조회 API를 구현했다. 기능이 정상적으로 동작하는 것을 확인한 후, 실제 쿼리가 어떻게 발생하고 있는지 성능을 점검해 보기로 했다. 이를 위해 애플리케이션 속성에 다음 설정을 추가하여 쿼리 발생량을 확인했다. spring.jpa.show-sql: true / spring.jpa.p...
왜 동시성 문제에 관심을 가졌는가? 기존 프로젝트에서는 트랜잭션이 내부적으로 어떻게 동작하는지 깊이 이해하지 못한 채, 하나의 작업을 원자적으로 처리하기 위한 용도로만 @Transactional을 사용해 왔다. 그래서 여러 트랜잭션이 동시에 동일한 데이터를 수정할 때도 의도한 대로 데이터 무결성이 지켜지는지 확신할 수 없었다. 그래서 이번 주문 프...
주문 시스템을 구현하면서 결제 완료 후 배송 정보를 생성하는 기능을 추가하고 있었다. 처음에는 같은 서비스 내부에서 배송 생성 메서드를 호출하는 단순한 구조를 생각했다. 기능적으로는 문제가 없었지만, 트랜잭션 학습 과정에서 객체가 자기 자신의 메서드를 직접 호출하는 셀프 인보케이션 개념을 알게 되었다. payment.complete(); create...
나는 코드를 잘 짜고 있는 줄 알았다 과거 프로젝트를 진행할 때, 나의 1순위 목표는 가독성이었다. 그래서 서비스 로직을 메인 메서드와 여러 개의 private 서브 메서드로 쪼갰다. 그리고 메인 메서드에서 private 메서드를 호출하여 로직을 처리하도록 만들었다. 이렇게 했더니 자잘한 기능별로 분리되어 코드가 한눈에 들어왔고, 관련된 로직이 하나...
5. ERD 설계 처음에는 주문과 결제를 식별관계로 설정하려고 하였다. 주문과 결제는 1:1 관계이며 결제는 주문이 존재해야만 생성될 수 있기 때문에 식별관계로 모델링하는 것이 자연스럽다고 생각하였다. 하지만 실무에서는 유지보수성과 확장성을 고려하여 비식별관계를 사용하는 경우가 많다. 그리고 식별관계로 설정하면 주문 ID가 결제 테이블에서 PK와...
1. 왜 주문 시스템을 선택했는가 트랜잭션, 이벤트, 동시성과 같은 백엔드 핵심 주제를 학습할 수 있는 프로젝트를 고민하였다. CRUD 프로젝트에서도 이러한 문제는 발생할 수 있지만, 주문 시스템은 주문 생성부터 결제, 배송, 취소까지 상태 변화가 명확하게 존재하고 여러 도메인 객체의 데이터 일관성을 유지해야 하는 상황이 발생하기 때문에 해당 주제들...
1. 학습 계기 김영한님의 스프링 입문 강의를 통해 학습을 하는 중에 테스트 케이스를 작성하는 과정을 진행했다. 김영한님이 테스트 어노테이션을 사용하시면서 실무 개발에서 대량의 코드가 있을때 유용하게 사용된다고 하셨다. 그러나 나는 기존에 사용했던 테스트 사용은 API 메서드를 사용하기 전에 데이터가 제대로 요청되고 응답 받는지를 미리 확인하기 위해...
1. 문제 핵심 요약 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12945?language=java 핵심 요구사항: N번째 피보나치 수를 1234567로 나눈 값을 리턴 제한 조건: $2 \le N \le 100,000$ 2. 접근 방식 0, 1번 배열 값을 적어두면 ...
과제 내용 지난 과제의 echo{영어이름} command를 개선합니다. 응답 앞에 echo2_ 가 붙도록 수정합니다. client *c 안의 c->argv[1] 을 이용합니다. sds , sdscatfmt() , sdsempty() , addReplyBulkSds() 를 사용해 봅니다. branch를 만들고 PR로 보내주시면 됩니다. 해당...
과제 내용 1. echo와 동일한 echo{아이디}로 echoCommand 추가 1-1 commands.def 에 새 명령어 등록 1-2 새 명령어가 호출할 command 함수 구현 1-3 서버 시작 시 command table에 등록 클라이언트 요청 시 lookup 후 c->cmd->proc(c) 에서 실행 2. ossca-2...