JPA

    [Jpa] JPQL

    💡 JPQL 이란 JPQL 이란 SQL을 추상화한 객체 지향 쿼리 언어를 말한다. 테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리한다. ✔︎ 예시 String jpql = "select m from Member m where m.age > 18"; List result = em.createQuery(jpql, Member.class).getResultList(); // 실행된 SQL select m.id as id, m.age as age, m.USERNAME as USERNAME, m.TEAM_ID as TEAM_ID from Member m where m.age > 18 ✔︎ 특징 SQL 을 추상화했기 때문에 특정 데이터베이스 SQL 에 의존하지 않는다. 결국 SQL로 변환되어 사용..

    [Jpa] 값 타입 컬렉션

    [Jpa] 값 타입 컬렉션

    값 타입 컬렉션을 알아보기 이전에 값 타입의 비교에 대해서 알아보자. 💡 값 타입의 비교 값 타입에서는 인스턴스가 달라도 그 안에 값이 같다면 같은 것으로 보아야 한다. primitive type 비교 int a = 10; int b = 10; // a == b (true) 임베디드(인스턴스) 비교 Address a = new Address("서울시") Address b = new Address("서울시") // a == b (false) 임베디드 타입에서는 왜 false 일까? 인스턴스가 다르기 때문에 다른 객체로 인식이 되기 때문이다. ✔︎ 동일성 비교 (identity) == 를 사용하고, 인스턴스의 참조값을 비교한다. ✔︎ 동등성 비교 (equivalence) equals( ) 를 사용하여 인스턴..

    [Jpa] 값 타입과 불변 객체

    [Jpa] 값 타입과 불변 객체

    값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이기 때문에 단순하고, 안전하게 다룰 수 있어야 한다. 임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유할 경우에는 위험하다. 대신 값(인스턴스)를 복사해서 사용할 수 있다. 하지만 누군가 실수로 값 복사를 하는 것이 아닌 기존 값을 넣는다면? ‼️ 객체 타입의 한계 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있지만 ,임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아닌 객체 타입이다. 자바 기본 타입에 값을 대입할 경우 값을 복사하지만 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없어서 객체의 공유 참조는 피할 수 없다. 기본 타입 (primitive type) int a = 10; ..

    [Jpa] 기본 값 타입

    [Jpa] 기본 값 타입

    💡 기본 값 타입 1️⃣ 엔티티 타입 @Entity 로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능하다. ex ) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다. 2️⃣ 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경시 추적이 불가능하다. ex ) 숫자 100 을 200 으로 변경하면 완전히 다른 값으로 대체되기때문에 추적이 불가능. 생명주기를 엔티티에 의존 회원을 삭제하면 이름, 나이 필드도 함께 삭제 값 타입은 공유하면 안된다. 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안됨. (사이드 이펙트 발생 - 부수 효과 발생) ✔︎ 값 타입의 분류 기본 값 타입 자바 기본 타입..

    [Jpa] 영속성 전이(CASCADE) 와 고아 객체

    [Jpa] 영속성 전이(CASCADE) 와 고아 객체

    💡 영속성 전이 (CASCADE) 와 고아 객체 특정 엔티티를 영속 상태로 만들때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. CASCADE 란? 예를 들어 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶다면 사용하는 옵션이다. 부모를 저장할 때 연관된 자식도 함께 persist로 자동 호출하고 싶을 때 사용 @OneToMany (mappedBy="parent", cascade=CascadeType.PERSIST) ✔︎ 결과 💡CASCADE 의 종류 ALL: 모두 적용(모든 곳에서 사용할 때 사용) PERSIST: 영속(저장할 때만 사용할때 사용) REMOVE: 삭제 MERGE: 병합 REFRESH DETACH ‼️ 영속성 전이 사용시 주의사항 전이 되는 대상이 한 군데에서만 ..

    [Jpa] 즉시로딩과 지연로딩

    [Jpa] 즉시로딩과 지연로딩

    💡 지연 로딩 지난 시간 프록시를 설명하면서 들었던 예시에서 Member 를 조회할 때 Team 도 같이 조회되는 비효율적인 상황을 개선하기위해서 JPA 에서는 지연로딩이라는 옵션을 제공해준다. ✔︎ fetch = FetchType.LAZY fetch = FetchType.LAZY 로 옵션을 걸어주게 되면 team 을 프록시 객체로 조회한다. 이 말은 Member 크래스만 DB에서 조회한다는 말과 같다. member 를 조회할 때는 member 만 가져오게 되고 team 은 프록시 객체로 가져오는 것을 확인할 수 있다. 그리고 team에 어떤 속성을 사용하는 시점에 프록시 객체가 초기화 되면서 (쿼리가 나가면서) 값을 가져온다. 💡 즉시 로딩 반대로 Member 와 Team 을 같이 조회해야 하는 경우가..

    [Jpa] 프록시란

    [Jpa] 프록시란

    💡 프록시란 프록시란 무엇일까? 예를 들어 우리가 Member 를 조회해야 할 때 Team 도 함께 조회해야 할까? 같이 땡겨와서 같이 사용해야 한다면 상관없지만 사용하지 않는데 땡겨와서 쓴다는 것은 최적화가 되지 않는 다는 것이다. ❗️ 프록시 기초 jpa 에서는 em.getReference( ) 라는 메소드를 제공한다. em.find( ) : 데이터베이스를 통해서 실제 엔티티 객체를 조회한다. em.getReference( ) : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회한다. DB에 쿼리가 나가지 않지만, 객체가 조회된다. 껍데기는 똑같지만 텅텅 빈 것이고, target 은 진짜 레퍼런스를 가리킨다. ✔︎ 프록시 특징 실제 클래스를 상속받아서 만들어진다. 실제 클래스와 겉 모양이 ..

    [Jpa] 상속관계 매핑

    [Jpa] 상속관계 매핑

    관계형 데이터베이스에는 상속관계가 존재하지 않는다. 하지만 슈퍼타입 서브타입 관계라는 모델링 기법이 존재하여, 객체 상속과 유사하게 사용할 수 있다. 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것을 상속관계 매핑이라고 한다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현해야 한다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 JPA 에서 사용하려면 @Inheritance(strategy=InheritanceType.XXX) 를 설정해주어야 한다. InheritanceType 종류 조인 전략 단일 테이블 전략 구현 클래스 마다 테이블 전략 1️⃣ 조인 전략 @Entity @Getter @Setter @DiscriminatorColumn // 부모 클래스에 선언하여..