본문 바로가기

Spring/JPA34

JPQL - Query타입, 결과조회, 파라미터, 프로젝션, 페이징, 조인 JPQL( Java Persistence Query Language ) JPQL 은 객체지향 쿼리 언어로, 테이블이 대상으로 하는 것이 아닌, 엔티티 객체를 대상으로 쿼리한다 JPQL 은 작성하고 실행하면 SQL 로 변환된다. Member 은 엔티티이다. Member m 처럼 별칭은 필수이다. String jpql = "select m From Member m where m.name like ‘%hello%'"; TypeQuery : 반환 타입이 명확할 때 사용한다. 아래의 코드는 Member.class 로 반환타입이 명확하다. TypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class); Query : 반환 타입이 명확하지 않을때 .. 2022. 9. 27.
즉시로딩 지연로딩 즉시로딩과 지연로딩에 관련해서, JPA 강의에서는 프록시와 마찬가지로 첫 시작을 아래와같은 질문으로 시작한다. Member를 조회할때 Team을 함꼐 조회해야할까? 비즈니스 로직에 따라 다르겠지만, 보통은 항상 함께 조회하지 않고 필요할때만 조회하기를 원할 거라 생각한다. 이 주제의 핵심은, 즉시로딩을 사용하지 않는다 라고 정리할 수 있다 왜 사용하지 않을지 알아보자. - 가급적 지연로딩만 사용하기 - 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생한다. - 즉시 로딩은 JPQL 에서 N + 1 문제를 일으킨다. * 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 + 아주아주 간단한 프로젝트에서는 즉시로딩을 사용해도.. 2022. 9. 27.
JPA 프록시 지연로딩을 이해 하기 위해서는 프록시에 대해 이해해야 쉽게 다가갈 수 있다. 강의에서는 시작을 해당 질문으로 시작한다. " Member 엔티티를 조회할 때 Team 도 함께 조회해야 할까 ? " 해당 질문에 대한 답은 정해져있지 않다. 실제로 비즈니스 로직이 Member 엔티티를 조회할 때 꼭 Team 을 필요로 해야할 수도 있기 때문이다. 하지만, 보통은 같이 사용하지 않는 것이 일반적이다. - 비즈니스 로직에 꼭 필요하지 않다면 Team을 같이 조회할 필요가 없다. - 쿼리 등 낭비가 발생한다. - 해당 낭비를 줄이기 위해, 지연로딩과 프록시로 해결한다. JPA 에서는 em.find () 뿐만 아니라, em.getReference() 메서드도 제공하고 있다. em.find는 DB 를 통해서 실제 엔티.. 2022. 9. 26.
상속관계 매핑 ( @Inheritance , @DiscriminatorColumn ) 관계형 데이터 베이스에서는 상속 관계라는 것은 없다. 다만 슈퍼타입, 서브타입 관계라는 모델링 기법이 있으며 상속관계와 비슷하다. 아래와 같은 관계를 상속관계 매핑으로 나타내는 3가지 방법에 대해 알아보자. 상속관계 매핑의 방법 3가지 매핑방법 어노테이션 설명 조인전략 @Inheritance(strategey = InheritanceType.JOINED) 각각 테이블 단일 테이블 전략 @Inheritance(strategey = InheritanceType.SINGLE_TABLE) 통합 테이블 구현 클래스마다 테이블 전략 @Inheritance(strategey = InheritanceType.TABLE_PER_CLASS) 서브 타입 테이블 1. 조인 전략 - 공통된 부분을 부모처럼 사용하며 extend.. 2022. 9. 23.
연관 관계 매핑 연관관계에서 고려해야할 점은 아래와 같다 1. 다중성 - 일대다 / 다대일 / 다대다 / 일대일 2. 방향 - 단방향 / 양방향 3. 연관 관계의 주인 다중성 - 일대다 ( 1: N ) @OnetoMany - 다대일 ( N:1 ) @ManytoOne - 다대다 ( N:M ) @ManytoMany - 일대일 ( 1:1 ) @ OnetoOne 방향 - 단방향 : 한쪽으로 가는 방향 - 양방향 : 양쪽으로 가는 방향 DB 테이블에서는 외래키(FK) 하나로 조인을 사용해서 양방향으로 쿼리가 가능하다. ** DB 에서는 방향이라는 개념이 없다 객체는 방향의 개념이 존재한다. 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다. ?? 무조건 양방향 관계를 하면 안될까 ?? - 일반적인 비즈니스에서 엔티.. 2022. 9. 22.
연관 관계가 필요한 이유 연관관계가 필요한 이유 : 협력 공동체를 만들 수 없다. Member.class - 현재 teamId 를 Long 타입으로 가지고 있다. @Entity public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @Column(name = "username") private String name; @Column(name = "team_id") private Long teamId; Team.class @Entity public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String name; 객체를 테이블에.. 2022. 9. 21.
필드와 컬럼 매핑 필드에 컬럼 매핑을 통해 DB 에 제약조건을 줄 수 있다. * JPA 의 실행 로직에는 영향을 주지 않으며, DDL을 자동생성 할 때만 사용한다 예로 들어보자 @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Lob pri.. 2022. 9. 20.
데이터베이스 스키마 자동 생성 DDL ( Data Definition Language ) : 데이터 정의어 - 데이터를 생성하거나 수정, 삭제 등 데이터의 전체 골격을 결정한다 - JPA 를 사용 및 @Entity를 붙여주면 DDL을 애플리케이션 실행 시점에 자동으로 생성한다. @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType... 2022. 9. 20.
객체와 테이블 매핑 객체와 테이블을 매핑하기 위해서는 @Entity를 클래스 위에 작성한다. JPA 를 사용해서 테이블과 매핑할 클래스는 필수로 작성해주어야 한다. @Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 부른다. @Entity public class Member { @Id private Long id; private String name; 주의할 점 1. 기본생성자는 필수 2 . final 클래스를 사용해서는 안된다 -> JPA 구현체들은 엔티티를 내부에서 다양한 방식으로 사용 @Entity 의 속성정리 name() - JPA에서 사용할 엔티티 이름을 지정 - 기본값은 클래스의 이름을 그대로 사용 - 같은 클래스 이름이 없으면 가급적 기본값을 사용 @Entity(name = "MBR") public cla.. 2022. 9. 20.