DB 설계 시 자식 테이블에 부모의 PK를 소유하고 있고, 부모 삭제 시 여러 가지의 제약조건을 통해 PK의 값을 null로 변경해 주거나, PK를 소유한 자식의 데이터를 삭제 등... 여러 동작을 할 수 있다. 하지만 jpa에서는 자식 데이터를 조회해 값을 수정한 다음 저장하는 방식으로 동작해야 한다. 이에 변경감지에 의한 업데이트, 벌크 업데이트에 대해 알아보자. 변경감지 업데이트변경감지란 엔티티가 조회 또는 저장시 영속성 컨텍스트의 1차 캐시에 저장이 되고 트랜잭션 전 flush 동작시 1차 캐시에 저장된 값과 현재의 값을 비교해 업데이트 쿼리를 생성 후 실행하는 것을 의미한다.List todos = todoRepository.findAllByProjectAndStatusOrderByEndDateA..
프로젝트 중 동일한 게시글을 여러 유저가 동시에 접근했을 때 조회수의 증가값이 유저의 수만큼 나오지 않는 문제가 생겼습니다. 해당 문제의 원인과 해결과정에 대해 공유합니다. 테스트 세팅 어떤 문제가 발생했는지 코드와 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..
엔티티 매니저는 CRUD작업을 수행하는 관리자 역할을 수행하고, 엔티티를 저장하는 일련의 가상 데이터베이스라고 한다. 엔티티란 엔티티는 관계형 데이터베이스에 매핑한 객체를 말한다. 엔티티 생명주기 비영속 : 엔티티가 영속성 컨텍스트와 연관이 없는 상태를 의미합니다. Member member = new Member 객체만 생성된 상태 영속 : 엔티티가 영속성 컨텍스트에 저장된 상태입니다. `em.persist(member) 준영속 : 엔티티가 영속성 컨텍스트에 있다가 분리된 상태입니다. em.detach(member), em.clear(), em.close() 삭제 : 엔티티가 영속성 컨텍스트와 데이터베이스에서 삭제된 상태입니다. em.remove(member) 엔티티 팩토리 && 엔티티 매니저 엔티티 팩..
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 ..