LaohLog
close
프로필 배경
프로필 로고

LaohLog

  • 분류 전체보기 (34)
    • Spring Boot (3)
    • DevOps (10)
    • JPA (6)
    • DB (6)
    • CS (2)
      • Network (2)
    • Java (0)
    • Data Structure (0)
    • Algorithm (5)
  • 홈
  • 글쓰기
[JPA] 부모-자식 데이터 삭제(+성능)

[JPA] 부모-자식 데이터 삭제(+성능)

DB 설계 시 자식 테이블에 부모의 PK를 소유하고 있고, 부모 삭제 시 여러 가지의 제약조건을 통해 PK의 값을 null로 변경해 주거나, PK를 소유한 자식의 데이터를 삭제 등... 여러 동작을 할 수 있다. 하지만 jpa에서는 자식 데이터를 조회해 값을 수정한 다음 저장하는 방식으로 동작해야 한다. 이에 변경감지에 의한 업데이트, 벌크 업데이트에 대해 알아보자. 변경감지 업데이트변경감지란 엔티티가 조회 또는 저장시 영속성 컨텍스트의 1차 캐시에 저장이 되고 트랜잭션 전 flush 동작시 1차 캐시에 저장된 값과 현재의 값을 비교해 업데이트 쿼리를 생성 후 실행하는 것을 의미한다.List todos = todoRepository.findAllByProjectAndStatusOrderByEndDateA..

  • format_list_bulleted JPA
  • · 2024. 2. 26.
  • textsms
[JPA] 비관적 락으로 동시성 이슈 해결하기

[JPA] 비관적 락으로 동시성 이슈 해결하기

프로젝트 중 동일한 게시글을 여러 유저가 동시에 접근했을 때 조회수의 증가값이 유저의 수만큼 나오지 않는 문제가 생겼습니다. 해당 문제의 원인과 해결과정에 대해 공유합니다. 테스트 세팅 어떤 문제가 발생했는지 코드와 JMeter를 통해 보여드리겠습니다. Post 엔티티 public class Post extends BaseEntity{ //... private Long view; public void increaseView() { this.view++; } } PostService @Transactional public PostResponseDto getPost(Long postId) { Post post = postRepository.findById(postId) .orElseThrow(()-> new..

  • format_list_bulleted JPA
  • · 2024. 2. 11.
  • textsms
[JPA] cannot simultaneously fetch multiple bags 해결 방법

[JPA] cannot simultaneously fetch multiple bags 해결 방법

문제상황 해당 문제는 영속성 전이 기능을 이용하고자 코드를 수정하면서 발생하게 되었다. 초기의 UserAccount는 다음과 같이 구성되어있고 회원가입시 UserAccount 정보, Interests, Questions 총 3번을 저장하는 코드를 작성했었다. 이 부분을 UserAccount 엔티티를 저장함으로써 한번에 저장되도록 수정하면서 발생하게 되었다. public class UserAccount extends BaseEntity{ .... @OneToMany(mappedBy = "userAccount", fetch = FetchType.EAGER) @ToString.Exclude @Setter private Set interests; @OneToMany(mappedBy = "userAccount",..

  • format_list_bulleted JPA
  • · 2024. 2. 11.
  • textsms
[JPA] LazyInitializationException

[JPA] LazyInitializationException

서론 프로젝트 진행 중 로컬환경에서는 예외가 발생하지 않았지만, 배포 환경에서는 LazyInitializationException이 발생했고 둘의 차이점을 확인해 보니 로컬은 OSIV 즉 Open Session In Veiw를 true로 설정하고 배포 환경에는 적용이 안된 것을 확인했다. 이를 통해 스프링 컨테이너에서 적용되는 영속성 컨텍스트의 범위에 대해 알아보자. 스프링 컨테이너의 전략 스프링은 트랜잭션 범위의 영속성 컨텍스트 전략을 사용하는데, 이는 트랜잭션이 실행되면 영속성 컨텍스트가 생성되고, 종료되면 그전에 플러시를 통해 DB와 동기화한 후에 DB 트랜잭션 커밋을 수행한 뒤 영속성 컨텍스트를 종료한다. 스프링을 통해 개발을 하면 주로 서비스 로직의 메서드에 트랜잭션을 적용하게 된다. 이는 서비..

  • format_list_bulleted JPA
  • · 2024. 2. 7.
  • textsms
[JPA] 영속성 관리

[JPA] 영속성 관리

엔티티 매니저는 CRUD작업을 수행하는 관리자 역할을 수행하고, 엔티티를 저장하는 일련의 가상 데이터베이스라고 한다. 엔티티란 엔티티는 관계형 데이터베이스에 매핑한 객체를 말한다. 엔티티 생명주기 비영속 : 엔티티가 영속성 컨텍스트와 연관이 없는 상태를 의미합니다. Member member = new Member 객체만 생성된 상태 영속 : 엔티티가 영속성 컨텍스트에 저장된 상태입니다. `em.persist(member) 준영속 : 엔티티가 영속성 컨텍스트에 있다가 분리된 상태입니다. em.detach(member), em.clear(), em.close() 삭제 : 엔티티가 영속성 컨텍스트와 데이터베이스에서 삭제된 상태입니다. em.remove(member) 엔티티 팩토리 && 엔티티 매니저 엔티티 팩..

  • format_list_bulleted JPA
  • · 2024. 1. 18.
  • textsms
[JPA] JPA를 사용해야 하는 이유

[JPA] JPA를 사용해야 하는 이유

1. 반복 및 생산성 저하 기존에 JPA를 사용하기 전에는 개발자가 SQL문을 직접 작성하고 JDBC Api를 통해 SQL을 실행시킨 뒤 해당 결과를 객체에 매핑하는 역할을 수행했습니다. 이런 일련의 과정을 통해 기능 개발을 위해 추가적인 작업이 많은 단점이 있습니다. 또한, 기능이 추가될 때 마다 아래와 같은 코드를 반복해서 추가 작업해야합니다. 예시 // sql 작성 String sql = SELECT MEMBER_ID, NAME FROM MEMBER M WHERER MEMBER_ID = ?; // sql 실행 ResultSet rs = stmt.executeQuery(sql); // 조회 결과 객체에 맵핑 String memberId = rs.getString("MEMBER_ID"); String ..

  • format_list_bulleted JPA
  • · 2024. 1. 17.
  • textsms
  • navigate_before
  • 1
  • navigate_next
공지사항
전체 카테고리
  • 분류 전체보기 (34)
    • Spring Boot (3)
    • DevOps (10)
    • JPA (6)
    • DB (6)
    • CS (2)
      • Network (2)
    • Java (0)
    • Data Structure (0)
    • Algorithm (5)
최근 글
인기 글
최근 댓글
태그
  • #mysql
  • #Spring Security
  • #ubuntu
  • #JPA
  • #비관적 락
  • #MultipleBagFetchException
  • #알고리즘
  • #security
  • #batchsize
  • #백준
전체 방문자
오늘
어제
전체
Copyright © 쭈미로운 생활 All rights reserved.
Designed by JJuum

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.