목록Database (26)
ecsimsw
소개 이 글은 PIC-UP 프로젝트에 데이터가 쌓였을 때 조회 성능이 어떻게 되고, 어떤 개선 포인트가 있을지 확인했던 과정을 적어보았다. DB 쿼리 빈도를 줄여 조회 성능을 개선하는 캐싱이나 DB 부하 분산은 다루지 않는다. 대신 데이터를 만드는 방법부터 DB 엔진에 넣는 데 걸리는 시간, 인덱스나 쿼리 수정 고민 과정을 적어볼 생각이다. 다루는 내용은 아래와 같다.
JpaAuditing / 컬럼 생성일, 수정일 자동 저장 1. @EntitiyListeners(AuditingEntityListener.class) @Entity @Getter @EntityListeners(AuditingEntityListener.class) public class Post{ @Id @GeneratedValue private Long id; private String category; private String writer; private String title; private String content; @CreatedDate private LocalDateTime createdDateTime; @LastModifiedDate private LocalDateTime modifiedDa..
변경 감지와 병합 JPA는 영속성 context에 테이블 형태의 1차 캐시를 두고 엔티티를 저장해서, Transaction commit 시, 1차 캐시의 영속된 값과 현재 entity 값을 비교하여 변경이 된 것을 알아서 적용해준다. 준영속 상태의 엔티티 아래 코드를 가볍게 보면, PostMapping으로 "members/memberId/editName" 요청을 받아 파라미터로 넘겨 받은 MemberNameEditForm의 form데이터로 item 값을 넣어줘서 form의 id에 해당하는 member의 Name을 set했다. 이후에 transaction이 commit되면, 알아서 변경 감지가 일어날 것이라고 생각한 잘못된 코드이다. // 준영속 상태를 생각하지 않은 엔티티 값 수정 @PostMapping..
질문 1. 현재 member의 소속 여부에 대한 처리 이를 테면 "Order" 엔티티 클래스에서, member가 orders에 현재 속하고 있는지 확인하고 만약 그렇다면 해당 Orders에서 member를 제거 후 변경된 member를 추가해야하는 것은 아닌지. public void setMember(Member member){ /* if(this.member.getOrders() != null){ this.member.getOrders().remove(this); } */ this.member = member; member.getOrders().add(this); } 그렇지 않으면 특이사항 이겠지만, Order의 member를 변경할 때 member.orders에서 문제가 생기지 않은가 싶어서 주석 부..
순수 객체를 고려한 양방향 연관 아래 코드에서 출력되는 member는 0개이다. 매니저를 flush하기 전에는 버퍼에 sql이 저장되어만 있기 때문이다. Member memberA = new Member(); memberA.setName("memberA"); memberA.setTeam(teamA); for(Member m : teamA.getMembers()){ System.out.println(m.getName()); } 객체를 고려하여 양방향 연관을 구현하려면 teamA에도 member를 넣어줘야한다. 물론 그게 멤버 엔티티의 수정을 만들지는 않지만. Member memberA = new Member(); memberA.setName("memberA"); memberA.setTeam(teamA); ..
보호되어 있는 글입니다.
"T아카데미 / JPA 프로그래밍 기본기 다지기 - 김영한 " 강좌를 듣고 정리한 글입니다. 변경 감지 아래 코드에서 SQL 버퍼, 쓰기 지연으로 memberA의 team 조회가 sql 쿼리보다 빠르고, INSERT table 쿼리가 한개 뿐이며, sql쿼리보다 탐색이 빠름에도 불구하고 1차 캐시로 memberA의 팀 조회가 가능하다는 것을 알 수 있다. Team teamA = new Team(); teamA.setName("TeamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("TeamB"); em.persist(teamB); Member member_A = new Member(); member_A.setName("memberA"); m..
"T아카데미 / JPA 프로그래밍 기본기 다지기 - 김영한 " 강좌를 듣고 정리한 글입니다. 영속성 컨텍스트를 영속성 컨텍스로 관리하면 어떤 이점을 갖을까 1. 1차 캐시 / 엔티티 동일성 보장 2. 쓰기 지연 4. 로딩 지연 5. 변경 감지 1차 캐시 / 엔티티 동일성 보장 영속성 컨텍스트는 내부에 캐시를 갖고 있다. (id, instance)의 맵 형태를 갖고 엔티티들이 저장된다. 트렌젝션 단위의 굉장히 짧은 메모리 공간이다. em.persist(member)로 member가 영속성 컨텍스트에 영속되면, 1차 캐시는 이를 담는다. 이후 조회 시, DB에 접근해서 member1를 탐색하는 것이 아니라 1차 캐시를 먼저 훝어 member1을 바로 찾을 수 있고, 캐시에 없다면 DB에서 검색 후 해당 객체..