JPA

· BE/JPA
Spring Boot에서 JPA를 이용해 개발을 진행 시 로그에 쿼리들이 올라오는데, 이 때 쿼리 속 파라미터가 ?로 표시된다. 이 경우엔 크게 2가지 방법으로 파라미터를 알아낼 수 있다. 1) trace 설정 필자는 application.yml 기준이니 application.properties를 사용하는 경우 그에 맞게 작성하면 된다. (application.yml) logging: level: org.hibernate.SQL: debug org.hibernate.type: trace # JPA 쿼리의 파라미터가 표시되도록 (쿼리 뒤에 parameter를 알려줌) 적용 후) 2) 외부 라이브러리 사용 (p6spy) https://github.com/gavlyukovskiy/spring-boot-data..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. JPQL 소개 JPQL 은 객체 지향 쿼리 언어임. 따라서 테이블을 대상으로 쿼리를 날리는 것이 아닌 엔티티 객체를 대상으로 쿼리를 날려야함. JPQL은 SQL을 추상화해서 특정 DB에 의존하지 않음 작성한 JPQL은 결국 SQL로 변환됨 2. JPQL 문법 select m from Member as m where m.age > 18 (18살을 넘은 회원을 조회) 엔티티와 속성은 대소문자 구분 O JPQL 키워드는 대소문자 구분 X 엔티티 이름(@Entity)으로 사용해야함. 테이블 이름이 아님 별칭은 필수 (m) (as 생략 가능) TypeQuery : 반환 타입이 명확할 때 사용 Query :..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. JPA의 쿼리 JPA는 다양한 쿼리를 지원함 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API, MyBatis, SpringJDBCTemplate 와 함께 사용 가능 기존 단건 조회 방법 EntityManager.find() 객체 그래프 탐색 ex) schoole.getClass().getStudent() JPA를 사용하면 엔티티 객체를 중심으로 개발하는데, 조회 할 때 어떻게 할 것인가. 조회할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 애플리케이션이 필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL이 필요 2. JPQL JPA는 SQL을 추상화한..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 2. 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경되면 추적이 불가능 1) 기본값 타입 생명주기를 엔티티에 의존 값 타입은 공유하면 안됨. ex) 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String 2) 임베디드 타입 (복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입이라 함 주로 기본 값 타입을 모아 만들어서 복합 값 타입이라고도 불림 int, St..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. 프록시 DB 조회를 미루는 가짜 엔티티. (실제로 객체가 사용될 때. 그 때 조회함) 1) 프록시 기초 em.find() vs em.getReference() em.find() : DB를 통해서 실제 엔티티 객체 조회 em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 (실제로 객체가 사용될 때. 그 때 조회함) 2) 프록시 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지않고 사용하면 됨 프록시 객체는 실제 객체의 참조를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 ..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. 상속관계 매핑 관계형 DB에는 상속 관계가 없음 (대신, 슈퍼타입 서브타입 관계가 존재함) 상속관계 매핑 : 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 하나의 마스터 테이블과 각각의 서브테이블로 분리하여 변환 : 조인 전략 하나의 테이블로 합쳐서 변환 : 단일 테이블 전략 마스터 테이블의 컬럼을 서브타입 테이블에 넣어 서브타입 테이블로만 변환 : 구현 클래스마다 테이블 전략 마스터 테이블은 추상 클래스로 생성하는 것이 맞음 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. 연관관계 매핑 시 고려사항 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany (다대다의 경우, 실무에서 사용하지 않는 것이 좋음) 단방향, 양방향 테이블 외래 키 하나로 서로 다른 테이블에 조인이 가능함 방향이라는 개념이 없다고 보면 됨 객체 참조용 필드가 있는 쪽으로만 참조가 가능함 한쪽에서만 참조할 수 있으면 단방향 양쪽이 서로 참조할 수 있으면 양방향(단방향이 2개) 연관관계의 주인 객체 양방향 관계에서는 참조가 2군데 → 두 객체 중 외래키를 관리 할 곳을 지정 연관관계의 주인 : 외래 키를 관리하는 참조 주인의..
· BE/JPA
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다. 1. 플러시 - 영속성 컨텍스트의 변경 내용을 DB에 반영 - 트랜잭션이 커밋될 때 발생 (그 외에도 가능) - 쉽게 말해서, JPA와 데이터베이스를 서로 맞추는 과정 - 참고로 플러시를 해도 1차 캐시, 영속성 컨텍스트는 지워지지 않는다. 1) 플러시 호출 방법 직접 호출 : em.flush(); 트랜잭션 커밋(플러시 자동 호출) : tx.commit(); JPQL 쿼리 실행(플러시 자동 호출) 2) 플러시 모드 옵션 // 커밋이나 쿼리를 실행할 때 플러시 (기본값) em.setFlushMode(FlushModeType.COMMIT); // 커밋할 때만 플러시 (JPQL 시 자동 호출, 직접 호출 막..
멍목
'JPA' 태그의 글 목록