JPA

JPA

JPA: 알람 기능과 댓글 기능, 도메인 로직과 서비스 로직의 트랜잭션 분리 작업

0. 배경작성된 게시글에 댓글을 작성하는 기능을 추가하였고, 알람 기능이 존재하지 않아 실시간으로 확인이 불가능하여 불편함을 겪는 사용자가 존재한다고 생각했습니다. 요구사항에 따라 알람 기능을 추가하면서 문제가 발생했습니다. 현재 제가 짠 로직은 댓글 작성 로직과 알람 발송 로직이 하나의 트랜잭션 안에서 처리되었습니다.외부 API - FCM과, Alarm Entity저장 그리고 댓글 작성을 하나로 처리하였을 때 발생할 수 있는 문제는 FCM과 알람 저장 기능에 문제가 생겼을 때 댓글 저장도 롤백되어버리는 문제입니다. 비즈니스 중요도를 고려하면 사용자 편의를 위한 부가적인 알림 기능(서비스 로직)이 댓글 작성(도메인 로직)이라는 메인 기능에 영향을 미치는 것이 부자연스럽다고 판단해 트랜잭션 분리를 고려하게..

JPA

JPA: 페이징이 필요한 이유와 페이징 성능 개선하기 - No Offset 사용

0. 배경JPA로 개발을 하면서, 페이징을 사용하지 않았을 때 성능 저하, 서비스 장애로 이어질 수 있는 부분을 깨닫고 정리하였습니다. 1. Paging을 사용하지 않고 모든 게시글을 불러왔을 때 문제 발생데이터가 많으면 장애 발생프로젝트에서 사용한 코드@Query(value = "select p.*, COUNT(pl.post_like_id) as LikeCount " + "from post p " + "inner join post_like pl on p.post_id = pl.post_id " + "group by p.post_id " + "order by LikeCount Desc, p.post_id Desc", nativeQuery = true)Li..

JPA

JDBC, JPA) 싱글벙글 JPA 프로젝트에서 이미지 업로드 쿼리를 최소화 해보자

배경 개인 SNS 프로젝트에서 글쓰기 기능과 함께 사진을 여러장 올릴 수 있는 상황입니다. 이미지 첨부X 먼저 이미지 없이 작성했을 때 걸리는 시간과 발생하는 쿼리에 대해 보겠습니다. 이미지 첨부O 사진을 약 8장을 첨부해서 같이 올린다고 가정하겠습니다. 프로젝트 규모 자체가 작고, 서버에 이미지를 업로드 하는 프로젝트지만 이런 사소한 부분 하나하나 고쳐나가고 효율적으로 짜고 싶어서 작성했습니다. 환경 Java 17 Spring 6.0.11 (Spring Boot 3.1.2) Gradle 8.2.1 Junit 5.9.3, Mockito 5.3.1 JWT 현재 로직 분석 먼저 글쓰기에 대한 로직을 간단하게 보겠습니다. @Transactional public PostCreateResponseDto creat..

JPA

Querydsl: OneToMany 관계에서 Projection DTO 값 List를 어떻게 갖고올까?

이 코드의 목적 제목, 글쓴이, 제목 + 내용 등을 통한 게시글 검색 기능입니다. 게시글 리스트를 불러올 때 해시태그도 보여줘야 하기 때문에 List값이 필요합니다. 이 오류는 왜 발생했을까? Entity입니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "post_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private Us..

JPA

JPA: 게시글 전체 조회 N + 1를 어떻게 처리할까?

0. 배경JPA로 개발하면서 N + 1 문제를 만나 헤맸던 부분과 제대로 처리하지 않으면 성능 저하, 장애로 이어질 수 있다는 부분을 깨닫고 정리하였습니다.  1. JPA: N + 1 문제정의N + 1 문제는 ORM 기술에서 특정 객체를 대상으로 수행한 쿼리가 해당 객체가 가지고 있는 연관관계를 조회하게 되면서 N번 추가적인 쿼리가 발생하는 문제입니다. 예시간단하게 구조를 살펴보겠습니다.1. POST는 LIKE, USER, COMMENT를 갖고 있습니다. 2. PostRepository에서 여러 Post를 조회하는 메소드를 호출하면 1개의 SELECT 쿼리로 POST가 조회 되고,FetchType.LAZY 설정으로 인해 LIKE, USER, COMMENT는 프록시 객체가 생성됩니다. 3. 해당 컬렉션을 ..

JPA/기본

값 타입

기본값 타입 = JPA의 데이터 타입 분류 = - 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 - 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 -값 타입 - int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 - 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 = 값 타입 분류 = - 기본값 타입 - 자바 기본 타입(int, double) - 래퍼 클래스(Integer, Long) - String - 임베디드 타입(embedded type, 복합 값 타입) - 컬렉션 값 타입(collection value type) ↓↓↓↓↓↓↓↓↓..

초보병일이
'JPA' 카테고리의 글 목록