본문 바로가기

JPA

(9)
패스트캠퍼스 챌린지 9일차 - 임베디드 타입, Converter (커스텀 컨버터) 📌 임베디드 타입 ✔️ 임베디드 타입 사용 상황 주문시 가격에 대한 필드 (공급가, 부가세, 합계 ...) 주소필드 (도, 시(군,구), 우편주소, 상세주소 ...) ✔️ 집주소, 직장주소 구성 임베디드 타입 적용전 ❌ private String homeCity; private String homeDetail; private String homeZipcode; private String companyCity; private String companyDetail; private String companyZipcode; 임베디드 타입 적용 후 👍 코드의 양은 오히려 늘었지만 한 클래스를 재사용하는 효과를 볼 수 있다. @Embedded @AttributeOverrides({ @AttributeOverride..
패스트캠퍼스 챌린지 8일차 - Native Query, N+1 📌 Native Query @Query("select * from user", nativeQuery = true); List findAllUser(); 실제 테이블의 필드명과 매핑시켜줘야 한다. (엔티티의 필드명이 아님) Dialect를 사용하지 않기 때문에 특정 DB에 의존성을 가진다. DB 변경시 자동으로 migration되는 JPA의 기능이 적용되지 않는다. ✔️ Native Query 사용 이유 성능이슈 해결 ( update ) delete의 경우 delete, deleteById 등을 대신해서 deleteInBatch, deleteAllInBatch를 제공해서 일부 조건에서 성능이슈를 해결 (select 없이 바로 delete) update의 경우 JPA에서 batch쿼리를 제공하지 않기 때문에..
패스트캠퍼스 챌린지 7일차 - 트랜잭션 @Transactional 📌 트랜잭션 ✔️ ACID [A] Atomicity 원자성 [C] Consistency 일관성 [I] Isolation 독립성 [D] Durability 지속성 ✔️ Transactional 메서드 or 클래스에 설정시 메서드의 시작과 끝이 트랜잭션의 생명주기가 된다. 메서드 내 DML명령 호출 메서드들을 한 개 트랜잭션으로 묶어준다. ✔️ CheckedException, UncheckedException CheckedException (컴파일에러) Exception, IOException, FileNotFoundException ... 트랜잭션 중 예외가 발생하여도 롤백하지 않음 (커밋까지 모두 수행) 반드시 예외에 대한 처리가 명시적으로 필요 (try-catch or throw or throws) U..
패스트캠퍼스 챌린지 6일차 - 엔티티 생명주기, 영속성 컨텍스트 📌 엔티티 생명주기 ✔️ 비영속 영속성 컨텍스트가 관리하지 않는 상태 @Transient: 엔티티의 매핑정보에서 제외, 영속성 컨텍스트의 관리 대상에서 제외 new 를 통해 엔티티 객체를 생성한 시점 (엔티티보다는 그냥 객체인 상태) ex) User user = new User("kim", 10); ✔️ 영속 EntityManager.persist(); 엔티티가 영속성 컨텍스트에 의해 관리되는 상태 엔티티가 영속성 컨텍스트에 의해 관리되므로 쓰기지연, 캐싱 등이 가능한 상태이다. ✔️ 준영속 EntityManager.detach(); 한 번 영속화 되었던 엔티티를 영속성 컨텍스트로부터 분리 📌 영속성 컨텍스트 ✔️ 1차 캐시 따로 캐싱에 대한 설정없이 없다면 한 트랜잭션 내 동일한 PK에 대해 캐싱 처리..
패스트캠퍼스 챌린지 5일차 - JpaRepository, @Query 📌 JpaRepository ✔️ findById 와 getOne의 차이 findById는 Eager전략을 사용한다. em.find() 를 통해 실제 엔티티를 바로 조회한다. getOne은 Lazy전략을 사용한다. em.getReference() 를 통해 프록시 객체를 조회해서 반환한다. 이후 실제 사용시 세션을 초기화해서 값을 얻어온다. ✔️ existsById id를 조건으로하는 count 집계쿼리를 이용해서 유무를 확인한다. count 집계쿼리의 결과가 1 이상이라면 해당 id를 PK로 하는 row가 존재하는 것 id로 엔티티를 가져와서 유무를 확인하는 것이 아니다. ✔️ deleteAll 삭제하고자 하는 row만큼의 select 쿼리가 나간 후 각 row마다 delete 쿼리를 날린다. 내부적으로..
패스트캠퍼스 챌린지 4일차 - EntityListener 📌 Entity Listener 이벤트에 따른 엔티티의 전처리, 후처리 JPA에서 제공되는 7가지 이벤트 전처리 Listener @PrePersist (persist 호출 전) @PreUpdate (merge(update) 호출전 ) @PreRemove (delete 호출전) 후처리 Listener @PostPersist @PostUpdate @PostRemove @PostLoad select(조회) 후에 호출 엔티티에 직접 정의하는 방식 @PrePersist public void prePersist() { log.info("prePersist 호출"); } @PostPersist public void postPersist() { log.info("postPersist 호출"); } @PostLoad p..
패스트캠퍼스 챌린지 3일차 - Entity, 관계 📌 Entity ✔️ GenerationType @GeneratedValue(strategy = GenerationType.) IDENTITY MySQL에서 사용하는 전략 (AUTO_INCREASEMENT) SEQUENCE ORACLE, PostgreSQL, H2에서 사용하는 전략 TABLE DB 종류에 관계없이 ID를 관리하는 테이블을 생성하여 ID를 관리 AUTO (default) 각 DB에 알맞는 전략을 선택 ✔️ @Table name: 테이블 이름 지정 ex) @Table(name = TBL_USER) indexes = {@Index(columnList = "name")} uniqueConstraints = {@@UniqueConstraint(columnName={"email"})} 인덱스, 제약..
패스트캠퍼스 챌린지 2일차 - Query Method 페이징 / 정렬 📌 Query Method Paging ✔️ Page 인터페이스 Slice 인터페이스를 상속한다. Slice는 잘라진 조각에 대한 정보를 갖고있다. Page는 Slice를 상속하므로 조각에 대한 정보와 전체에 대한 정보까지 갖고있다. ✔️ Pageable 구현체로 PageRequest 사용 PageRequest.of(int page, int size, Sort); page: 0부터 시작 (0=첫번째 페이지) size: 페이지 당 요소수 Sort.by(Order.desc("필드")); getContent() 메서드로 실제 내부의 값 확인 가능 ✔️ Slice 인터페이스 메서드 getNumberOfElements(); getSize() hasContent(); isFirst(); isLast(); hasNe..