본문 바로가기

전체 글157

Batch Fetch Size를 통해 페이징 문제 해결 1. 문제 발생 Folder Entity @Entity @Getter @Builder(toBuilder = true) @Table(name = "folder") @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Folder extends BaseDateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Size(max = 50, message = "폴더의 이름은 50자 이하로 입력해주세요") @Column(name = "title", nullable = false, columnDefinition = "varch.. 2022. 8. 20.
계층형 Category 구현 (Enum으로의 전환) 1. 문제 발생 (1) 서비스 이해 프로젝트에서 Tag를 2가지 형태로 나누어서 표현하였습니다. 게임 RootTag에는 FPS, RPG, TPS 등의 여러 Tag들이 존재합니다. 서비스에서 생성되는 폴더에 여러 Tag들을 붙일 수 있습니다. (2) 기존 구현 방식 데이터베이스 Table을 사용해서 Tag와 RootTag 들의 값들을 관리하였습니다. Tag RootTag (3) Tag 조회 성능 문제 프론트에게 태그 리스트를 보내 주기 위해 항상 테이블 조회 쿼리가 나가야만 했습니다. 서비스 로직 상 해당 Tag가 들어왔을 때 Tag가 어떤 RootTag에 속하는 지 찾기 위해서는 DB에 조회 쿼리를 날려야만 했습니다. 태그 이름으로 검색 Tag, RootTag 테이블의 조인이 필요하였습니다. @Query.. 2022. 8. 19.
쿼리 성능 개선 (MySQL Optimizer 실행 계획 분석) 1. 문제 설명 Jmeter를 이용하여 예약 가능한 시간 조회 성능을 테스트하였습니다. Jmeter를 통해서 서비스의 트래픽 가용성을 확인하였습니다. 시나리오 하루 이용자 수 9000명 하루 트래픽 180만 ⇒ 2분 동안 300명 사용자가 총 60000의 트래픽 발생시킨다. Number of Threads (users) : 300 Ramp-up period (seconds) : 120초 Loop Count : 200 평균 TPS : 약 240 실패율: 0.1% 분석 DB 서버의 CPU Utilization이 100%에 가깝습니다. HikariCP Connection Timeout이 발생하였습니다. 전체 트래픽을 처리하는데 4:14초가 소요되었습니다. 예약 시스템 특성상 예약 가능한 시간 조회 트랜잭션이 .. 2022. 7. 17.
HikariCP Dead Lock 해결 1. 문제 발생 Jmeter를 통해 예약 생성 성능 테스트를 하던 도중 Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection Exception 이 발생하였습니다. Timeout 발생이 난 것을 확인하고 가장 처음 든 생각 처리할 수 없는 너무 큰 부하를 주었나? "hikariCP Connection Pool의 크기가 너무 작은가?" hikari의 maximum-pool-size를 default(10)에서 20으로 증가시켜주었습니다. datasource: hikari: maximum-poo.. 2022. 7. 17.
JPA 영속성 컨텍스트 주의점 1. 문제 발생 JPQL을 통해서 Designer를 조회할 때 fetch join을 통해서 OneToMany 관계를 맺고 있는 ReservationTime까지 정보를 가져오려고 시도하였다. 이때 Designer 정보는 잘가져오지만 Designer에 속하는 List 정보는 계속 size가 0인 문제가 발생하였다. 코드를 통해서 자세히 살펴보자. Entity @Entity @Getter @Table(name = "designer") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Designer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(.. 2022. 7. 17.
N + 1 문제 해결 (Fetch Join, DISTINCT) 1. 문제 발생 designer 조회 시에 designer select 문 이외에 reservationTime 조회 쿼리가 추가적으로 발생하였습니다. Entity [DESIGNER] @Entity @Getter @Table(name = "designer") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Designer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false, columnDefinition = "varchar(20)") private String name; @Column(na.. 2022. 7. 17.
반응형