JPA_Basic
10 posts
JPA 기본 강의 정리 - 10. JPQL 정리_02

JPQL 프로젝션 페이징 조인 서브 쿼리 JPQL 타입 표현 조건식 기본 함수와 사용자 정의 함수 1. 프로젝션 SELECT 절에 조회할 대상을 지정하는 것. 1) 대상 타입 예시 엔티티 프로젝션 SELECT m FROM Member m SELECT m.team FROM Member m 임베디드 타입 프로젝션 SELECT m.address FROM Member m 스칼라 타입 프로젝션 (기본 데이터 타입) SELECT m.username, m.age FROM Member m 2) 여러 타입 값 조회 Query 타입 Query는 Object를 반환하기에 타입 캐스팅이 필요하다. Object[] 타입 위의 Query 타입을 앞서 타입캐스팅하는 것과 동일한 이치로 보면 된다. new 명령어 조회 위와 같이 DTO로 조회 결과를 SQL문에서 매핑하는 것이 가능하다. new 생성자로 매핑 시, 패키지 명을 모두 써야하는 것이 눈여겨 봐야하는 점이다. 이 과정은 꽤 불편하기에 단축하는 과정…

January 17, 2022
JPA_Basic
JPA 기본 강의 정리 - 09. JPQL 정리_01

JPQL 1. JPA에서 SQL을 사용할 수 있는 방법 방법 설명 1. JPQL * 가장 단순한 조회 방법* 엔티티 객체를 중심으로 개발* 문제는 검색할 때이며, 테이블이 아닌 엔티티 객체를 대상으로 검색. 2. Criteria * 자바 코드로 JPQL을 작성할 수 있다.* JPA 공식 기능* 단, 너무 복잡하고 실용성이 없다. 3. QueryDSL * 컴파일 시점에 문법 오류를 찾을 수 있다.* 동적 쿼리 작성 편리하며, 단순하고 쉽다.* 실무 사용 권장 4. Native SQL * JPA가 제공하는 SQL을 직접 사용하는 기능.* JPQL로 해결할 수 없는 특정 DB의 의존적인 기능 사용 가능 ex) 오라클 Connect By, 특정 DB만 사용하는 SQL 힌트 번외 - JDBC API, MyBatis, SpringJDBCTemplate * JPA를 사용하면서 기존의 JDBC, MyBatis, SpringJDBCTemplate 등을 함께 사용 가능하다.* 단, 영속성 컨텍스트…

January 16, 2022
JPA_Basic
JPA 기본 강의 정리 - 08. 값 타입

값 타입 JPA 최상위 값 타입 분류 기본 값 타입 임베디드 타입 (복합 값 타입) ** 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 ** 1. JPA 최상위 값 타입 분류 1) 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 2) 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 2. 기본 값 타입 생명 주기를 엔티티에 의존 값 타입은 절대 공유하지 말 것! 3. 임베디드 타입 ** 복합 값 타입이며, 객체를 코드로 명확하게 표현하기 위한 수단이라는 느낌으로 받아들이는 것이 편하다. * 임베디드 타입 사용법 Annotation 설명 @Embeddable 값 타입을 정의하는 곳에 표시 @Embedded 값 타입을 사용하는 곳에 표시 @AttributeOverrides 컬럼명 중복 시 사용. @AttributeOverride 컬럼명 중복 시…

January 15, 2022
JPA_Basic
JPA 기본 강의 정리 - 07. 영속성 전이(Cascade)

영속성 전이 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용. ex: 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장. * 영속성 전이 예시 위 이미지 Parent와 Child 샘플 엔티티 코드다. Parent.java에서 childList라는 연관 관계에서 cascade 속성을 준 것을 확인할 수 있다. 1) 객체 코드 예시 2) Main.java 예시 위의 Main 코드에서 생성한 Parent, Child1, Child2를 모두 DB에 저장하기 위해서는 Cascade 속성이 없다면 총 3개의 Entity Manager 객체에 영속시켜야 한다. ex: em.persist(parent); em.persist(child1); em.persist(child2); 하지만 1) 객체 코드 예시에서 Parent에서 지정한 것과 같이 Cascade 속성을 준 것으로 Parent 객체만 엔티티 매니저에 등록 후 실행시키면 모두 DB에 저장되…

January 14, 2022
JPA_Basic
JPA 기본 강의 정리 - 06. 프록시와 지연로딩

프록시 프록시 단독으로 쓰이는 경우는 실무적으론 많이 없다고 한다. 그러면 “왜 배워야 할까?” 라는 의문이 들텐데, 바로 뒤에서 배울 지연 로딩 개념을 이해하기 위해서 라고 정리할 수 있다. 1. 프록시 기초 em.find( ) VS em.getReference( ) em.find() : DB를 통해 실제 엔티티 객체 조회. em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회 2. 프록시 특징 프록시 객체는 실제 객체의 참조(target)를 보관. 처음 사용할 때 한 번만 초기화. 프록시 객체가 초기화 되면 프록시 객체를 통해 실제 엔티티에 접근 가능. 영속성 컨텍스트에 찾는 엔티티가 이미 존재하는 경우, em.getReference() 를 호출해도 실제 엔티티를 반환한다. 반대로, 영속성 컨텍스트에 찾는 엔티티가 없는 경우엔 HibernateProxy 클래스 객체를 갖게 된다. 이 때 em.getReference()로 먼저 호출 후, em.f…

January 14, 2022
JPA_Basic
JPA 기본 강의 정리 - 05. 상속 관계 매핑

상속 관계 매핑 1. 관계형 DB에서의 상속 관계? 결론부터 얘기하면, 관계형 DB에서 상속 관계는 존재하지 않는다. 다만, 슈퍼 타입 / 서브 타입 관계라는 모델링 기법이 객체 상속과 유사하다. 그래서 JPA에서의 상속 관계 매핑은 DB에서의 슈퍼 타입, 서브 타입 관계를 매핑하는 것으로 약칭하며 구체적인 방법은 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 3가지가 있다. 2. 주요 Annotation Annotation 설명 @Inheritance(strategy = InheritanceType.XXX) 사용할 전략 방법을 명시하며, 3가지가 존재한다.1) JOINED: 조인 전략2) SINGLE_TABLE: 단일 테이블 전략3) TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name = “DTYPE”) DTYPE, 즉, 상속 받은 객체의 타입이 무엇인지 부모 테이블에서 설명하는 컬럼 (Default - DTY…

January 10, 2022
JPA_Basic
JPA 기본 강의 정리 - 04. 다양한 연관 관계 매핑 핵심 요약

다양한 연관 관계 매핑 * 연관 관계 매핑 시 고려사항 3가지 다중성 단방향, 양방향 연관 관계의 주인 1. 다중성 유형 Annotation 다대일 @ManyToOne 일대일 @OneToOne (1) 다대일 (@ManyToOne) 외래 키가 있는 쪽이 연관 관계의 주인. 양쪽을 서로 참조하도록 개발 대상 테이블(@OneToMany) 쪽은 mappedBy 속성 필수. (2) 일대일 (@OneToOne) 일대일 관계의 반대는 일대일 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 다대일 양방향 매핑과 동일하게 외래 키가 있는 곳이 연관 관계의 주인. 반대편은 mappedBy 속성 적용. 외래 키에 데이터베이스 유니크 (UNI) 제약 조건 추가 주 테이블에 외래 키 대상 테이블에 외래 키 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음 대상 테이블에 외래키 존재 객체 지향 개발자 선호 전통적인 데이터베이스 개발자 선호 JPA 매핑 편리 …

January 09, 2022
JPA_Basic
JPA 기본 강의 정리 - 03. 다양한 연관 관계 매핑 기초

다양한 연관 관계 매핑 기초 들어가기 전에 프로그래머스에서 JPA가 아닌 JDBC Template를 이용한 과제관이 있다. 과제관을 다 풀진 못 했었지만, JPA를 사용하는 근본 목적과 동일한 생각을 경험했다. → JDBC Template을 사용하면 객체 중심적인 프로그래밍이 아닌 SQL 매퍼로서의 프로그래밍을 하겠끔 된다? 위의 경험으로 이 상황을 연관 관계로 풀어낼 수 있는 지가 JPA를 사용하는 숙련도 판단 근거일 것이라 생각한다. (물론 그 배경으로 관계형 DB 모델에 관한 숙련도가 있겟지만..) 그래서 이번 강의 시간과 차후 강의인 고급 매핑, 상속관계를 나만의 방식으로 체득해야겠다고 다짐했다. 1. 객체와 테이블 연관 관계의 차이 다음과 같은 Member, Team 객체가 있고, DB(테이블)에 맞춘 모델링을 한 것이라 가정하자. * 의문점 Member를 통해 Team 객체의 정보를 얻어오려면 어떤 방식을 거치게 될까? 연관 관계를 생성하지 않고, 객체 모델링이 테이…

January 08, 2022
JPA_Basic
JPA 기본 강의 정리 - 02. 엔티티 기본 매핑

엔티티 매핑 - 기본 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 1. @Entity JPA를 사용해서 테이블과 매핑할 클래스에 사용 필수. !주의 2. @Table Entity와 매핑할 테이블 지정 시 사용. 3. Entity의 속성 (테이블 컬럼) 어노테이션 정리 어노테이션 설명 @Column 컬럼 매핑 @Temporal 날짜 타입 매핑 @Enumerated enum 타입 매핑 @Lob BLOB, CLOB 매핑 @Transient 특정 필드를 컬럼에 매핑하지 않음(매핑 무시) 1) @Column 속성 설명 기본값 name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름 insertable,updatable 등록, 변경 가능 여부 TRUE nullable(DDL) null 값의 허용 여부를 설정. false로 설정하면 DDL 생성 시에 not nu…

January 07, 2022
JPA_Basic
JPA 기본 강의 정리 - 01. JPA 사용 이유 & 영속성

JPA ? JPA의 등장 배경 → Java와 DB(RDBMS) 의 정보 저장 방식의 차이 (1) Java - Java에서 객체는 참조를 사용해 연관 데이터 조회 (2) RDBMS - 테이블에 외래 키를 사용. 즉, 기존의 JDBC Template, Mybatis 등의 기술이 있었음에도 객체 지향적인 프로그래밍이 아닌 SQL 중심적인 개발이 많은 시간과 노력을 들이게 됐다. 앞서 나온 기술들의 SQL 중심적인 개발 요소를 줄이고자 Java Persistence API(이하 JPA) 가 등장하게 됐다. JPA의 특징 1. 영속성 컨텍스트 엔티티를 영구 저장하는 환경 (컨테이너) 1차 캐시 동일성 보장 트랜잭션을 지원하는 쓰기 지연 변경 감지 지연 로딩 1) 1차 캐시 em.persist() 로 객체가 1차 캐시에 저장되지만, DB에 저장된 것은 아니다. → 이후 트랜잭션을 커밋해야 실제로 DB에 객체 관련 쿼리가 입력되고, 그 때 저장된다. 즉, 저장되기 전까진 객체의 상태와 관…

January 06, 2022
JPA_Basic