본문 바로가기

728x90
반응형

공부 정리/DB

(46)
JPA에서 Dirty Check 방지하기 JPA에서 업데이트 방식은 dirty check로, 모든 행에 대해서 하나씩 update 쿼리를 날려서 수정한다. 성능에 악영향을 줄 수 있다. 따라서 조회 전용이면 dirty check를 사전에 방지하는 것이 좋으며 @Transactional(readOnly = true)를 사용한다. @Transactional public void update() { List comments = commentRepository.findAll(); for (Comment comment : comments) { comment.setComment("별로에요"); commentRepository.save(comment); } } commentRepository.findAll()로 모든 comment를 조회하고 "별로에요"로 ..
영속성 컨텍스트로 발생하는 이슈 영속성 컨텍스트는 이슈는 JPA의 "동일성" 때문에 발생하는 문제이다. 왜냐하면 영속성 컨테스트에서 관리되는 객체들은 "==" true를 보장하기 때문이다. 따라서, 예상치 못한 문제가 발생할 수 있으니 영속성 컨텍스트를 주의해서 관리해야 한다. *주의* 1. 값을 조회해서 "수정"하는지, 새롭게 "생성"하는지 주의해서 확인한다. 2. @Transactional이 선언된 메서드는 모든 메서드가 "끝나는 시점"에 영속성 컨텍스트가 DB에 반영된다. 3. JPA에서 "조회"를 하면 DB에서 쿼리를 조회해오기 전에 영속성 컨텍스트에서 먼저 조회한다. 4. JPA에서 "save()"는 DB에 저장하는 것이 아니라 영속성 컨텍스트에 넣는 것이다. 1. 임베디드 타입 entityManger.clear() 유무에 따..
Converter 사용하기 쿼리를 통해서 가져온 결과를 엔티티 객체로 만들 때 일부 칼럼을 변환하는 방법을 알아본다. db데이터와 객체가 형식이 다른 경우 어떻게 매핑하는지 살펴본다. @Converter로 쿼리의 형식을 바꿔줄 수 있다. 다른 시스템을 연동하거나, 레거시 데이터는 원하지 않는 형태로 데이터를 저장해야 하거나 저장된 경우가 있다. 여기서는 int값으로 상태를 표현하고 있는 과거의 보편화된 개발 방식에 대해 커스터마이징하도록 한다. int형 코드를 의미가 있는 객체로 변환하여 어플리케이션에서 사용하는 것은 ORM 규칙에 살짝 어긋나있다. public class Book { .. @Convert(converter = BookStatusConverter.class) private BookStatus status; //판매..
@Embedded, @Embedabble @Embeddable @Data @AllArgsConstructor @NoArgsConstructor public class Address { private String city; //시 private String district; //구 private String detail; //상세주소 private String zipCode; //우편번호 } public class User { ... @Embedded private Address address; .... } Address를 @Embedded로 정의하고, @Embeddable로 사용한 경우, 칼럼에는 Address가 들어가는 것이 아니라, 해당 클래스가 가지고 있는변수들로 테이블 칼럼을 구성한다. @Embedded @AttributeOverride..
Native Query Native Query는 JPA와 무관하게, 실제 DB 쿼리문을 작성할 때 사용된다. @Query 맨 뒤에 nativeQuery=true라고 설정만 해주면 된다. 또한 엔티티를 조회하던 JPQL 문법과 달리 DB에서 사용하는 테이블 기준 쿼리를 작성하면 된다. @Query(value = "select * from book" , nativeQuery = true) List findAllCustom(); @Test void nativeQeuryTest() { booKRepository.findAll().forEach(System.out::println); bookRepository.findAllCustom().forEach(System.out::println); } @Query 메서드는 @Where을 감지해..
@Transactional 현재 있는 트랜잭션과 다른 클래스의 트랜잭션이 전파되는 현상을 정리한다. enum Propagation에서는 다음 7가지를 지원한다. REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED) SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS) MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY) REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW) NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED) NEVER(TransactionDefinition.PROPAGATIO..
고아제거 속성 알아보기 cascade의 삭제에 대해서 알아본다. 이전에 book 클래스는 PERSIST와 MERGE만 적용하고 있었다. public class Book { ... @ManyToOne(cascade = {cascade = CascadeType.PERSIST, cascade = CascadeType.MERGE}) @ToString.Exclude private Publisher publisher; ... } * cascade 제거 확인하기 ( Book N : 1 Publisher ) @Test void bookCascadeTest() { Book book = new Book(); book.setName("JPA 초격자 패키지"); Publisher publisher = new Publisher(); publisher..
Cascade 활용하기 cascade는 폭포라는 뜻으로, 폭포를 흘려보내듯이 하나의 영속성을 다른 객체로 전이하는 것이다. @OneToMany, @OneToOne, @ManyToMany에서 cascade 설정이 가능하다. cascade 종류 6가지는 다음과 같다. ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH ALL 모든 5개 종류 적용 PERSIST 저장 같이한다. MERGE 수정 적용한다. REMOVE 삭제 같이한다. REFRESH 재로딩 같이한다. DETACH 영속성 컨텍스트에서 같이 분리한다. * Book 1 : N publisher로 설정된 관계에서 테스트진행 @Test void bookCascadeTest() { Book book = new Book(); book.setName("J..

728x90
반응형