jpa

· DB
프로젝트를 진행하던 중 배포를 한 뒤 에러가 발생해서 로그를 봤더니 데이터베이스에서 데드락이 발생하고 있었다. 따로 명시적인 락을 잡지 않았는데도 불구하고 데드락이 발생하니 처음엔 무슨 상황인지 이해할 수 없었다. 엔티티 구조 프로젝트의 핵심 도메인은 ‘지원서’이다. 동아리나 기업에 지원할 때 자소서나 지원서를 작성하게 되는데 지원서 작성과 보관을 도와주는 서비스기 때문이다. 하나의 ‘지원서’에는 여러 ‘문항’이 존재하기에 ‘지원 문항’과 그 ‘답변’을 하나로 묶은 ‘지원 항목’을 ‘지원서’와 일대다로 맺어주었다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class ApplicationForm { @Id @Gene..
· JPA
일대다 단방향 매핑은 쓰지 말자? 영한님의 JPA 기본편 강의를 보면 일대다 단방향 매핑을 지양해야 한다는 내용이 나온다. 자바 ORM 표준 JPA 프로그래밍 책에도 다음의 내용이 적혀 있다. 일대다 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래 키를 관리해야 한다. 이것은 성능 문제도 있지만 관리도 부담스럽다. … 다대일 양방향 매핑은 관리해야 하는 외래 키가 본인 테이블에 있다. … 상황에 따라 다르겠지만 일대다 단방향 매핑보다는 다대일 양방향 매핑을 권장한다. 양방향 참조는 객체지향적으로 손해 하지만 흔히 알고 있듯이 순환 참조, 양방향 참조는 객체지향 세계에서는 지양하는 편이다. 의존 관계나 연관 관계를 단방향으로 흐르게 하여 A가 변할 때 B는 영향을 받더라도 B가 변..
새로운 기능 추가에 대한 이야기 스모디 서비스는 사람들에게 동기부여를 해주는 서비스로, 챌린지에 도전하여 인증을 하는 것이 주 콘텐츠이다. 단순한 인증을 넘어, 조금 더 사용자들에게 동기부여를 해주기 위해 랭킹에 관한 기능을 추가하기로 했다. 랭킹 로직을 이벤트로 처리 회원이 챌린지를 인증하면 주간 랭킹 점수에 반영 된다.라는 기능을 추가하려고 한다. 챌린지 인증 → CycleService.increaseProgress() 랭킹 관련 로직 → RankingService 랭킹 로직과 챌린지 로직이 강한 결합을 갖는 것을 막고 랭킹에 장애가 발생해도 챌린지 인증은 정상 동작시키기 위하여 이벤트(@TransactionalEventListener) + 비동기 처리(@Async)를 하기로 선택했다. ( Cycle..
알림 적용기 1편 알림 적용기 2편 이것저것 알아봤으니 이제 프로젝트 코드에 알림 트랜잭션 분리를 적용해 보고자 한다. 챌린지 인증 임박 알림 트랜잭션 분리 테스트 작성 @DisplayName("알림 이벤트에 예외가 발생해도 새로운 사이클은 저장된다.") @Test void cycleCreate_pushEventException() throws InterruptedException { // given LocalDateTime now = LocalDateTime.now(); willThrow(new RuntimeException("알림 로직에 예상치 못한 예외 발생!")) .given(pushEventListener).handle(any(PushEvent.class)); // when Long cycleI..
더즈
'jpa' 태그의 글 목록