728x90 반응형 웹개발/JPA13 JPQL JPQL(Java Persistence Query Language) 기본 문법과 기능 JPQL은 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL로 변환된다. select m from Member as m wehere m.age > 18 기본적인 문법은 SQL과 거의 동일하다. 유의할 점 - 엔티티와 속성은 대소문자를 구분한다. - 테이블 이름이 아닌 엔티티 이름을 사용한다. - 별칭이 필수이다. TypeQuery: 반환 타입이 명확할 때 Query: 반환 타입이 명확하지 않을 때 TypedQuery query = em.createQuery("select m from Member m", Member.class); TypedQuery query1 = em.createQuery("select m.usern.. 2023. 7. 22. JPA가 지원하는 다양한 쿼리 방법 JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발하는데, 검색을 할때도 테이블이 아닌 엔티티 객체를 대상으로 검색할 수 있어야한다. 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하므로 결국 검색 조건이 포함된 SQL이 필요하다. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL과 문법이 유사하지만 JPQL은 엔티티 객체를 대상으로 쿼리하고, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 점이 다르다 JPQL은 객체 지향 SQL이라고 말할 수 있다. List resu.. 2023. 7. 22. 값 타입 JPA는 데이터 타입을 엔티티 타입과 값 타입으로 분류한다. 엔티티 타입은 @Entity로 정의한 객체 엔티티의 속성이 변경되면 식별자(id)로 인식 가능함 ==> 데이터가 변경돼도 식별자로 추적 가능 값 타입은 int, Integer, String같은 기본타입 식별자가 없고 값만 있으므로 변경시 추적불가 값 타입의 분류 기본값타입 임베디드 타입 컬렉션 값 타입 기본값타입 자바 기본 타입(int, double), 래퍼 클래스(Integer,Long), String 생명주기를 엔티티에 의존함. 값 타입은 공유하면 안됨.(만약 회원1과 회원2가 속성으로 값타입을 공유하면 회원1이 속성을 변경했을 때 회원2도 같이 적용되겠지) (근데 래퍼클래스, String등은 변경이 불가능하기때문에 문제없음) 임베디드 타입.. 2023. 7. 19. 영속성 전이 CASCADE Cascade 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고싶을 때 사용한다. (부모 엔티티 저장시 자식 엔티티도 함께 저장) @Entity class Parent{ ... @OneToMany(mappedBy="parent") private List childList; void addChild(Child child){ this.childList.add(child); child.parent=this; } } @Entity class Child{ @ManyToOne private Parent parent; } Parent, Child 클래스가 있다고 하자. Child child1=new Child(); Child child2=new Child(); Parent parent=new.. 2023. 7. 19. 즉시 로딩과 지연 로딩 Member와 Team이 연관관계로 묶여있다고 할 때, Member를 조회할 때 Team도 조회해야할까? 프록시 개념 필요 2023.07.14 - [JPA] - 프록시 지연 로딩 @Entity public class Member { ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="TEAM_ID") private Team team; ... } FetchType.LAZY로 설정하면 프록시로 조회하게 된다. 예를들어 멤버1을 조회하면, 멤버1객체를 가져오고, 멤버1과 관련된 team은 프록시로 가져온다. 이후, team의 속성을 사용하는 시점에 프록시 객체가 초기화되면서 쿼리가 발생하고 team객체를 가져오게 된다. Member와 Team이 가끔씩만 함께 .. 2023. 7. 16. 프록시 em.find() vs em.getReference() em.find는 DB를 통해 실제 엔티티 객체를 조회 em.getRefrence()는 DB조회를 미루는 가짜(프록시)엔티티 객체 조회 프록시? 실제 클래스를 상속받아 만들어져서 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용해도 됨(이론상) 프록시 객체는 실제 객체의 참조 target을 보관하고 있음. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출함. 프록시 객체를 통해 메소드를 호출하면 다음과 같은 순서로 프록시 객체 초기화가 이루어진다. 1. 프록시 객체의 메소드를 호출 2.영속성 컨텍스트에 초기화 요청 3. 영속성 컨텍스트는 DB를 조회하여 실제 객체를 찾음. 4. 조회한 .. 2023. 7. 14. @MappedSuperclass 공통 매핑 정보가 필요할 때 사용할 수 있다. MappedSuperclass 어노테이션이 적용된 클래스는 엔티티로 직접 매핑되지 않으며, 데이터베이스 테이블로 생성되지 않는다. 대신, MappedSuperclass 어노테이션이 적용된 클래스를 상속하는 하위 클래스에서 해당 클래스의 속성과 매핑 정보를 상속받아 사용할 수 있다. MappedSuperclass로 지정된 클래스는 공통적으로 사용되는 속성이나 매핑 설정을 정의할 수 있다. 예를 들어, 여러 엔티티 클래스에서 공통적으로 사용되는 생성일자(createdDate)와 수정일자(modifiedDate)를 MappedSuperclass 클래스에 정의하고, 해당 클래스를 상속받는 엔티티 클래스에서는 추가적인 속성만 정의하여 사용할 수 있다. MappedSu.. 2023. 7. 7. 상속관계 매핑 관계형 데이터베이스에서 상속 관계를 구현하는 전략은 주로 다음과 같이 세 가지 방법이 사용된다. 1. 조인 전략 (Join Strategy): 조인 전략은 각각의 서브타입에 해당하는 테이블을 별도로 생성하고, 슈퍼타입과 서브타입 간의 관계를 조인을 통해 맺는 방식이다. 이 전략에서는 슈퍼타입과 서브타입의 속성을 각각의 테이블에 저장하며, 서브타입 객체를 조회할 때 조인을 사용하여 필요한 정보를 가져온다. 이 방식은 데이터베이스 정규화를 지원하며, 서브타입의 추가나 삭제가 용이하다. 하지만 매번 조인이 필요하기 때문에 성능에 영향을 줄 수 있다. 저장공간은 효율화되지만 쿼리가 복잡하다. @Entity @Inheritance(strategy=InheritanceType.JOINED) @Discrimiator.. 2023. 7. 7. 다양한 연관관계 연관관계 매핑시 고려사항 다중성 단/양방향 연관관계의 주인 다중성 @ManyToOne @OneToMany @OneToOne @ManyToMany (이 중 다대다는 실무에서 쓰지 않는다.) 단방향과 양방향 테이블은 외래키 하나로 양쪽 조인 가능(사실상 양방향) 그러나 객체는 참조용 필드가 있어야 참조가능하다. 한쪽만 참조하면 단방향, 양쪽 서로 참조하면 양방향이다.(사실 각각 단방향인것이긴 하지만..) 연관관계의 주인 테이블은 외래 키가 하나인데, 객체 양방향 관계는 참조가 두군데 있다. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야한다. 연관관계의 주인은 외래키를 관리할 수 있고, 주인의 반대편은 단순 조회만 가능하며 값을 관리할 수 없다. 다대일 이전 포스트를 참고. 다(Many)가 연관관계의 주인이.. 2023. 7. 3. 연관관계 매핑 일대다, 다대일 관계 예시 멤버, 팀 도메인이 있다고 가정하자. 멤버는 하나의 팀에 속할 수 있고, 한 팀에는 여러명의 멤버가 존재할 수 있다. 멤버-팀은 다대일, 팀-멤버는 일대다 관계가 된다. 데이터베이스 테이블에는 다가 되는 멤버쪽에 team_id를 FK로 가지고 있으면 된다. 이런 방식대로 객체를 모델링하면 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name="username") private String name; private Long teamId; } 이렇게 된다.(Long teamId에 주목) 이 방식은 객체 지향적인 방법이 아니다. 만약, em.find로 member 인스턴스를 가져온 후에, 해당 .. 2023. 6. 30. 엔티티 매핑 객체와 테이블 매핑 @Entity, @Table @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. 기본 생성자가 필수이다. @Entity 속성: name JPA에서 사용할 엔티티 이름을 지정한다. (지정하지 않으면 기본값으로 클래스 이름을 그대로 사용한다) @Table은 엔티티와 매핑할 데이터베이스 테이블을 지정한다. @Table(name=테이블명)으로 사용한다. 데이터베이스 스키마 자동 생성 JPA에서는 애플리케이션 로딩시점에 DB테이블을 생성하는 기능을 지원한다. hibernate.hbm2ddl.auto 속성: create,create-drop,update,validate,none 데이터베이스에 맞는 적절한 DDL을 생성한다. 이렇게 생성된 DDL는 개발에서만 사용(운영서버에서는 사용하지.. 2023. 6. 29. 영속성 컨텍스트 더보기 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻. 엔티티 매니저를 통해 접근할 수 있다. 엔티티의 생명주기 비영속 영속 준영속 삭제 영속성 컨텍스트의 이점 조회시에 1차캐시를 조회-> 캐시에 있으면 캐시에 있는 값을 바로 반환 ->캐시에 없으면 DB조회 후 1차캐시에 저장 후 객체반환 (그런데, 1차캐시는 한 트랜잭션 내에서만 유효하기때문에 성능상 약간의 이점을 갖는다) 영속 엔티티의 동일성 보장 똑같은 객체를 각각 find한 후, 두 객체를 비교하면 true가 나옴. 같은 트랜잭션 내에서 같은 객체는 동일하다. 트랜잭션을 지원하는 쓰기 지연 영속 컨텍스트 내에는 1차캐시 외에 쓰기 지연 SQL저장소가 있다. 어떤 객체를 영속하면 JPA가 객체를 분석해서 insert 쿼리를 만들어 쓰기 지.. 2023. 6. 29. JPA 기초 이미 JPA를 사용해봤지만 기초를 제대로 배우지 못했다는 생각이 들어 기초부터 다시 차근차근 배우고자 한다. (이번시간에는 간단한 실행만 해보았다) public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { // Member member = em.find(Member.class, 1L);//멤버클래스 PK1번 찾아옴 // Syste.. 2023. 6. 29. 이전 1 다음 728x90 반응형