728x90

개발 304

JPA - 경로 표현식

- 경로 표현식 1. .(점)을 찍어 객체 그래프를 탐색하는 것이다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A - 경로 표현식 용어 정리 1. 상태 필드(state field): 단순히 값을 저장하기 위한 필드 - ex) m.username 2. 연관 필드(association field): 연관관계를 위한 필드 2.1. 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 (ex: m.team) 2.2. 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 (ex: m.orders)..

개발/JPA(KYH) 2023.07.18

JPA - 기본 문법 (조건식(CASE 등등), JPQL 함수)

- 조건식 - CASE 식 - 기본 CASE 식 // 기본 case문 String query = "select " + "case when m.age = 60 then '경로요금' " + " else '일반요금' " + "end " + "from Member m"; List result = em.createQuery(query, String.class) .getResultList(); for (String s : result) { System.out.println("s = " + s); } - COALESCE : 하나씩 조회해서 null이 아니면 반환 //coalesce String query = "select coalesce(m.username, '이름 없는 회원') from Member m"; List..

개발/JPA(KYH) 2023.07.18

JPA - 기본 문법 (조인, 서브쿼리, 타입 표현과 기타식)

- 조인 1. 내부 조인 : SELECT m FROM Member m [INNER] JOIN m.team t 2. 외부 조인 : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 3. 세타 조인 : select count(m) from Member m, Team t where m.username = t.name - 조인 - ON 절 1. 조인 대상 필터링 2. 연관관계 없는 엔티티 외부 조인 1. 조인 대상 필터링 - ex) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인 - JPQL SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A' - SQL SELECT m.*, t.* FROM Member m LEF..

개발/JPA(KYH) 2023.07.18

JPA - 기본 문법과 기능 (기본 문법, 프로젝션, 페이징)

- JPA는 다양한 쿼리 방법을 지원한다. 1. JPQL 2. QueryDSL 3. JDBC API 직접 사용, MyBaits, SpringJdbcTemplate 함께 사용 - JPQL 1. JPA를 사용하면 엔티티 객체를 중심으로 개발한다. 2. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 3. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. 4. SQL과 문법이 유사하다. SELECT, FROM, WHERE GROUP BY, HAVING, JOIN 지원 5. JPQL은 엔티티 객체를 대상으로 쿼리 6. SQL은 데이터베이스 테이블을 대상으로 쿼리 //검색 String jpql = "select m From Member m where m.name like ..

개발/JPA(KYH) 2023.07.18

JPA - 값 타입 컬렉션

- 값 타입 컬렉션 - 값 타입을 하나 이상 저장할 때 사용한다. - 값 타입 컬렉션은 관계형 데이터 베이스에 담을 수 없다. 값만 넣을 수 있다. - 컬렉션을 저장하기 위한 별도의 테이블이 필요하다. - 값 타입, 엔티티를 구분해야 한다. - 클래스 타입으로 컬렉션을 매핑하면 해당 속성들을 컬럼명으로 사용하고, String과 같이 데이터가 단일일 경우 해당 필드명을 컬럼명으로 사용하는 것이 기본이고 예외적으로 @Column(name = "XXX")를 통해 컬럼명을 지정할 수 있다. - @ElementCollection, @CollectionTable 사용한다. - 값 타입 컬렉션 사용 1. 값 타입 저장 2. 값 타입 조회 - 값 타입 컬렉션도 지연 로딩 전략 사용한다. 3. 값 타입 수정 - 참고: ..

개발/JPA(KYH) 2023.07.17

JPA - 값 타입과 불변 객체, 값 타입의 비교

- 값 타입과 불변 객체 - 값 타입 공유 참조 1. 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 2. 부작용(side effect) 발생한다. Address address = new Address("city", "street", "zipcode"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setHomeAddress(address); em.persist(member2); member1.get..

개발/JPA(KYH) 2023.07.17

JPA - 임베디드 타입

- 임베디드 타입 1. 새로운 값 타입을 직접 정의할 수 있다. 2. JPA는 임베디드 타입이라고 한다. 3. 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다. 4. int, String과 같은 값 타입을 사용한다. - 임베디드 타입 사용법 1. @Embeddable: 값 타입을 정의하는 곳에 표시 2. @Embedded: 값 타입을 사용하는 곳에 표시 3. 기본 생성자 필수 - Member @Entity public class Member extends BaseEntity{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; //기..

개발/JPA(KYH) 2023.07.17

JPA - 영속성 전이(CASCADE)와 고아 객체

- 영속성 전이 : CASCADE 1. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장한다. - 영속성 전이 : 저장 @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) - 주의 할 점 1. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. 2. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다. - CASCADE 종류 1. ALL : 모두 적용 2. PERSIST : 영속 3. REMOVE : 삭제 - Parent @Entity public class Parent { @Id @GeneratedValue @Col..

개발/JPA(KYH) 2023.07.17

JPA - 즉시 로딩, 지연 로딩

- 지연 로딩 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Team team; - fetch = FetchType.LAZY로 설정하게 되면 지연 로딩으로 변경된다. - 지연 로딩이란 해당 객체를 프록시 객체를 생성하여 객체를 참조하는 것이다. Member member = new Member(); member.setUsername("member1"); member.setTeam(teamA); em.persist(member); em.flush(); em.clear(); Member m = em.find(Member.class, member.getId()); - 지연 로딩으로 설정했을 경우 Member를 조회 했을 때 Member 객체에 대해서만 쿼리를 ..

개발/JPA(KYH) 2023.07.17

JPA - 프록시

- 프록시 기초 - em.find() vs em.getReference() 1. em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 2. em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 - 프록시 특징 1. 실제 클래스를 상속 받아서 만들어진다. 2. 실제 클래스와 겉 모양이 같다. 3. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 4. 프록시 객체는 실제 객체의 참조(target)를 보관한다. 5. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. - 프록시 객체의 초기화 Member findMember = em.getReference(Member.class, member.getId())..

개발/JPA(KYH) 2023.07.17
728x90