springframework/Spring Data JPA 41

JPA 생성 쿼리 파라미터 로깅, Spring Data JPA 사용시 명심해야 할 것들

하이버네이트의 쿼리는 반드시 계속 보고 파라미터를 체크하자. 그래야만 쿼리를 튜닝하고 하이버네이트에 대해서 깊이 이해할 수 있다. 하이버네이트가 원하는 만큼의 데이터를 가져오는지. 하이버네이트가 원하는 쿼리를 발생시키는지. 하이버네이트가 발생시키는 쿼리의 파라미터를 체크하자. logging.level.org.hibernate.descriptor.sql=trace #최소한의 데이터 소스 설정 spring.datasource.url=jdbc:postgresql://localhost:5432/datajpa spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.username=postgres spring.datasource.pas..

Spring Data JPA 의 원리와 소개

지금까지는 JPA 에 대한 설명. 학습한 EntityManager 를 이용해서 @Repository 클래스를 만들어 실행 할 수 있으며 형태는 이러하다. @Repository public class OldPostRepository { @PersistenceContext EntityManager entityManager; @Transactional public Post add(Post post){ entityManager.persist(post); return post; } @Transactional public void delete(Post post){ entityManager.remove(post); } @Transactional public List findAll(){ return entityMana..

Query

JPQL , HQL JPQL : Java Persistence Query Language HQL : Hibernate Query Language SQL 과 비슷하나 큰 차이점은 Entity 기준으로 질의를 한다는 것 select 다음의 p 는 Entity 를 의미하며, FROM 절 뒤의 이름은 테이블이아니라 Entity 명으로 기입한다. @Component @Transactional public class JpaParentChileRunner implements ApplicationRunner { @PersistenceContext private EntityManager entityManager; @Override public void run(ApplicationArguments args) throws ..

Fetch 전략

Fetch : 연관 관계에 있는 Entity 를 어떻게 가져올 것인지에 대한 설정 Eager : 지금 가져온다. Lazy : 나중에 가져온다. @OneToMany 의 Fetch 정보는 Lazy 이다. Eager 일 경우 1 릴레이션의 Entity 정보를 가져올때 N 정보를 모두 가져와 불필요한 정보를 객체에 로딩하게 될 가능성이 높아서이다. @Entity public class Post { @Id @GeneratedValue private Long id; private String title; // Entity 를 관리할 때 참조하는 Comment Entity 도 Persistent 상태로 관리해주렴. @OneToMany(mappedBy = "post", cascade = {CascadeType.ALL}..

Cascade, Entity 상태

Cascade = Entity의 상태변화를 전파하는 옵션 Entity 에서 참조하는 다른 Entity 에 Entity 상태의 변화를 같이 전이시키는 것 Account 엔티티 의 변화가 A -> B 로 갈 때 참조하는 Study 의 변화도 A -> B 로 변화하도록 전이시키는 것 기본 값은 "없음" 이다. Entity 의 상태 Transient : JPA 가 모르는 상태 Persistent : Session.save() , 해당 Entity 를 영속화 하여 JPA 가 알고 있는 상태, 관리 중이며 데이터베이스에 insert 할 때에 일어난다. ( 1차 캐시 : PersistenceContext에 해당 Entity가 관리되는 경우 Entity 정보를 캐싱, 캐싱정보 사용 시 데이터베이스에 접근하지 않음 / ..

관계 맵핑, 1 : N

엔티티들의 관계 하나는 Owner 이며 하나는 Non-owning 이다. 관계의 레퍼런스를 가지고 있는 쪽이 Owner 다. 1 = @OneToMany N = @ManyToOne N 테이블이 Owner 일 경우 1 에 대한 FK 가 생성 된다. @Entity public class Study { @Id @GeneratedValue private Long id; private String name; // 1 : N >> N @ManyToOne private Account owner; // // @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Study study = (St..

Value 타입 맵핑

Entity 타입이란 고유한 식별자를 가진다. 다른 Entity 에서 독립적으로 참조한다. Value 타입이란 Entity 를 통해 참조되는 타입을 말한다. Entity 에 종속적이다. Composite Value 타입 기본 Value 타입보다 포괄적인 범위의 Value 타입이다. Composite Value 타입의 멤버변수 또한 @Column 이 생략되어 있는 것과 같다. Composite Value 타입을 선언할 때에는 @Embeddable 을 사용한다. Composite Value 타입을 사용할 때에는 @Embedded 을 사용한다. 하나의 Composite Value 타입을 재정의 할 때에는 @AttributeOverrides 를 사용하며 @AttributeOverride 의 배열을 사용하여 기존..

엔티티타입 맵핑

도메인 모델을 어떻게 테이블에 맵핑시킬지 하이버네이트에게 알려주는 작업이다. 2가지로 분류되며, 어노테이션, xml 설정으로 나뉜다. @Entity 엔티티는 객체 세상에서 부르는 이름이다. @Table 이라는 어노테이션이 생략되어있는 것과 같다. 속성 값의 이름은 객체의 이름이며, @Table 의 속성 값으로 이름을 변경해야한다. 아무런 설정을 주지 않을경우 엔티티 이름이 테이블 이름이 된다. @Entity 에서 아무런 속성 값을 주지 않을 경우 클래스이름이 객체의 이름이 된다. 즉 @Entity 에서 이름을 주거나 주지 않을 경우 객체의 이름이 정해지며, 객체의 이름이 @Table에 아무런 속성 값을 주지 않을 경우 테이블의 이름이 된다. @Id 엔티티의 PK 를 맵핑할때 사용 자바의 원시 타입과 랩퍼..

JPA 실행하고 적용하기

필요의존 jdbc 구현체와 Spring-Data-Jpa org.springframework.boot spring-boot-starter-data-jpa org.postgresql postgresql application.properties #최소한의 데이터 소스 설정 spring.datasource.url=jdbc:postgresql://localhost:1235/datajpa spring.datasource.username=postgres spring.datasource.password=postgres spring.jpa.open-in-view=true # 자동 쿼리 생성 , validate 는 검증. create 는 언제나 드랍하고 새로만듬. create-drop 실행 시 생성 종료시 드랍. upda..

ORM 패러다임 불일치

밀도 객체 : 다양한 타입과, 크기를 설정 가능 릴레이션 : 테이블, 기본데이터 타입만이 존재 서브타입 문제 객체 : 상속구조로 서브타입을 만들기 쉬움. 다형성을 가짐 릴레이션 : 테이블상속은 없다. 상속기능을 구현하더라도 표준기술이 아니며, 다형성을 표현할 수 없다. 식별성의 문제 객체 : 인스턴스 비교 가능( equals , == ) 릴레이션 : PK 만을 사용 관계 문제 객체 : 객체 참조로 관계표현, 다대다 관계도 표현가능 릴레이션 : FK 로 관계표현, Join 으로 방향성 없이 묶을 수 있다. N : M 관계 표현 불가 링크테이블 필요 데이터 네이게이션 객체 : 참조 값을 이용해서 다른 객체로 이동 가능, 컬렉션 순회가능 릴레이션 : 데이터 베이스에 요청을 적게 할 수 록 성능 상의 이점을 보..