DB
-
insert into B테이블 SELECT UNIX_TIMESTAMP(NOW()) -68, project_key ,segment_key, tenant_id , sum(active_user), sum(waiting_user), max(concurrent_user) from A테이블 where uts>= UNIX_TIMESTAMP(now()) -68 and uts< UNIX_TIMESTAMP(now()) -8 group by tenant_id, project_key, segment_key 회사에서 기존에 H2 Database를 사용해서 실제 운영환경에 적용했습니다. 그러다가 새로운 서비스로 마이그레이션 하면서 MariaDB 를 활용하게 되었는데, 기존에 없었던 데드락 문제가 발생했습니다. 데드락이 발생한 쿼..
[DB] 통계 테이블에서 데드락 해결하고 성능 개선하기insert into B테이블 SELECT UNIX_TIMESTAMP(NOW()) -68, project_key ,segment_key, tenant_id , sum(active_user), sum(waiting_user), max(concurrent_user) from A테이블 where uts>= UNIX_TIMESTAMP(now()) -68 and uts< UNIX_TIMESTAMP(now()) -8 group by tenant_id, project_key, segment_key 회사에서 기존에 H2 Database를 사용해서 실제 운영환경에 적용했습니다. 그러다가 새로운 서비스로 마이그레이션 하면서 MariaDB 를 활용하게 되었는데, 기존에 없었던 데드락 문제가 발생했습니다. 데드락이 발생한 쿼..
2023.12.24 -
토이프로젝트는 항상 신규 서비스를 만들다 보니, 메인페이지의 피드에 대한 구현 요구사항이 항상 있는 것 같습니다. 덕분에 1년동안 4개 서비스의 피드를 만들었네요. 아래 게시글은 제가 1년 조금 전에 처음으로 개발했던 피드에 대한 게시글입니다. [DB] QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 Pagination 피드를 만들어보자. [DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based 1년이 지난 지금은 조금 더 다양한 관점에서의 분석이 가능할 것 같다는 생각이 들어서, 다음과 같은 내용을 중점으로 분석해보고자 합니다. 기능상 장단점은 무엇인가? 선택의 기준? 성능상 이점 (실행계획) 유명..
[DB] Pagination 실행계획 분석 (Offset Pagination vs Cursor Pagination)토이프로젝트는 항상 신규 서비스를 만들다 보니, 메인페이지의 피드에 대한 구현 요구사항이 항상 있는 것 같습니다. 덕분에 1년동안 4개 서비스의 피드를 만들었네요. 아래 게시글은 제가 1년 조금 전에 처음으로 개발했던 피드에 대한 게시글입니다. [DB] QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 Pagination 피드를 만들어보자. [DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based 1년이 지난 지금은 조금 더 다양한 관점에서의 분석이 가능할 것 같다는 생각이 들어서, 다음과 같은 내용을 중점으로 분석해보고자 합니다. 기능상 장단점은 무엇인가? 선택의 기준? 성능상 이점 (실행계획) 유명..
2023.07.21 -
App Store에 심사를 올리게 되면서, "유저가 불쾌할 수 있는 게시글에 대해서 즉각적인 조치가 가능하게 하라" 라는 피드백을 받았습니다. 아무래도 소셜네트워크 서비스이다 보니까, 조금 민감한 부분이라고 생각이 됩니다. [요구사항] 그래서 유저가 게시글 신고 이후에 즉각적인 조치를 하기 위해서 다음과 같은 기능 요구가 생겼습니다. 기능: 유저가 신고처리를 했던 게시글은, 유저에게 보이지 않는다. 성능: 신고 처리 테이블을 스캔하는 비용을 최소화 전체 코드는 접어두었습니다. 더보기 @Override public List findNextPageByCommmand(PostFetchCommand command) { Map resultMap = queryFactory.from(post) .join(post.u..
[DB] 쿼리 개선 일지 - MySQL 커버링 인덱스 (Using Index)App Store에 심사를 올리게 되면서, "유저가 불쾌할 수 있는 게시글에 대해서 즉각적인 조치가 가능하게 하라" 라는 피드백을 받았습니다. 아무래도 소셜네트워크 서비스이다 보니까, 조금 민감한 부분이라고 생각이 됩니다. [요구사항] 그래서 유저가 게시글 신고 이후에 즉각적인 조치를 하기 위해서 다음과 같은 기능 요구가 생겼습니다. 기능: 유저가 신고처리를 했던 게시글은, 유저에게 보이지 않는다. 성능: 신고 처리 테이블을 스캔하는 비용을 최소화 전체 코드는 접어두었습니다. 더보기 @Override public List findNextPageByCommmand(PostFetchCommand command) { Map resultMap = queryFactory.from(post) .join(post.u..
2023.05.28 -
작년과 올해 프로젝트를 진행하면서 겪었던 문제들과, 이번 Real MySQL 북스터디를 하면서 습득했던 지식들로 문제를 해결해보았습니다. 시나리오 많은 서비스들이 본인이 보았던 컨텐츠에 반응하거나 저장하기 위해 좋아요, 북마크 등의 기능을 가지고 있습니다. 이런 기능들은 다음과 같은 문제점들을 주의 해야 합니다. 중복 요청 문제 (일명 따닥..) 해당 로직과 관련된 쿼리의 성능 문제 준비 도메인은 다음과 같이 User, Post, Likes 를 준비했습니다. @Entity @AllArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "..
[DB] 좋아요 성능 문제와 동시성 문제 해결하기 - 다중 유니크 키, 실행계획, JMeter작년과 올해 프로젝트를 진행하면서 겪었던 문제들과, 이번 Real MySQL 북스터디를 하면서 습득했던 지식들로 문제를 해결해보았습니다. 시나리오 많은 서비스들이 본인이 보았던 컨텐츠에 반응하거나 저장하기 위해 좋아요, 북마크 등의 기능을 가지고 있습니다. 이런 기능들은 다음과 같은 문제점들을 주의 해야 합니다. 중복 요청 문제 (일명 따닥..) 해당 로직과 관련된 쿼리의 성능 문제 준비 도메인은 다음과 같이 User, Post, Likes 를 준비했습니다. @Entity @AllArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "..
2023.03.05 -
이번에 프로젝트를 진행하며, orphanremoval = true 로 엔티티 삭제를 구현해볼까? 라는 생각이 들었습니다. 그런데 실제로 적용해보고 쿼리가 나가는 것을 확인해보며 이런저런 문제가 있다는 것을 느끼게 되었습니다. 상황 게시글(Post) 엔티티는 해시태그(Hashtag) 엔티티를 자식으로 가지고 있습니다. (OneToMany) 게시글(Post) : 게시글 정보를 담고 있음 해시태그(Hashtag) : OneToMany, 해시태그 여러개를 담고 있음 요구사항 : 게시글을 지우면, 게시글에 있는 여러개의 해시태그도 모두 삭제해야 합니다. 간소화된 엔티티 코드는 다음과 같습니다. Post.java public class Post { @Id @GeneratedValue(strategy= Generat..
[DB] JPA의 orphanremoval 또는 CascadeType.REMOVE 에서 발생할 수 있는 성능 문제와 버그(?)이번에 프로젝트를 진행하며, orphanremoval = true 로 엔티티 삭제를 구현해볼까? 라는 생각이 들었습니다. 그런데 실제로 적용해보고 쿼리가 나가는 것을 확인해보며 이런저런 문제가 있다는 것을 느끼게 되었습니다. 상황 게시글(Post) 엔티티는 해시태그(Hashtag) 엔티티를 자식으로 가지고 있습니다. (OneToMany) 게시글(Post) : 게시글 정보를 담고 있음 해시태그(Hashtag) : OneToMany, 해시태그 여러개를 담고 있음 요구사항 : 게시글을 지우면, 게시글에 있는 여러개의 해시태그도 모두 삭제해야 합니다. 간소화된 엔티티 코드는 다음과 같습니다. Post.java public class Post { @Id @GeneratedValue(strategy= Generat..
2023.02.19 -
전편 보러가기 - QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 pagination 구현하기 이번에는 전편에 이어서, 페이징을 구현하기 위한 쿼리를 작성해보겠습니다. 서비스 특성상 특별하게 '피드에 정렬 옵션이 있다' 라는 조건 때문에 조금 복잡합니다. 그리고 이런 이유 때문에 cursor based 를 사용해도 정확도가 조금 떨어지며, 조금이나마 이 문제를 해결해봅시다. Offset Based Pagination JPA 에서는 offset paging을 pageable이라는 객체를 사용하여 편리하게 지원합니다. 또한 Spring Data JPA 에서는 인터페이스 만으로도 페이징을 사용할 수 있습니다. QueryDSL과 함게 사용하려면 다음과 같이 코드를 작성합니다. .offset(..
[DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based전편 보러가기 - QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 pagination 구현하기 이번에는 전편에 이어서, 페이징을 구현하기 위한 쿼리를 작성해보겠습니다. 서비스 특성상 특별하게 '피드에 정렬 옵션이 있다' 라는 조건 때문에 조금 복잡합니다. 그리고 이런 이유 때문에 cursor based 를 사용해도 정확도가 조금 떨어지며, 조금이나마 이 문제를 해결해봅시다. Offset Based Pagination JPA 에서는 offset paging을 pageable이라는 객체를 사용하여 편리하게 지원합니다. 또한 Spring Data JPA 에서는 인터페이스 만으로도 페이징을 사용할 수 있습니다. QueryDSL과 함게 사용하려면 다음과 같이 코드를 작성합니다. .offset(..
2022.10.13