Ch10. 객체지향 쿼리 언어1(기본 문법) - 페이징 JPA는 페이징을 다음 두 API로 추상화 setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작) setMaxResults(int maxResult) : 조회할 데이터 수 데이터베이스 방언으로 실행된다. DB에 종속적이지가 않다(구체적 레벨은 프레임워크가 해주는 것이다) 사용자는 MySql, Oracle,.. 에 따라 페이지 쿼리를 다르게 작성할 필요가 없다 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.17
Ch10. 객체지향 쿼리 언어1(기본 문법) - Projection(SELECT) SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) 엔티티 프로젝션 Select 절로 조회해온 대상이 Entity이다. 임베디드 타입 프로젝션 Select 절로 조회해온 대상이 값 타입인 임베디드이다. 스칼라 타입 프로젝션 DISTINCT로 중복 제거 Select 절로 조회해온 대상이 스칼라 타입이다. 프로젝션 - 여러 값 조회 SELECT m.username, m.age FROM Member m 1. Query 타입으로 조회 2. Object[] 타입으로 조회 3. new 명령어로 조회 단순 값을 DTO로 바로 조회 SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Mem.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.17
Ch10. 객체지향 쿼리 언어1(기본 문법) - 기본 문법과 쿼리 API JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리 한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. JPQL 문법 select_문 :: = select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절 [where_절] delete_문 :: = delete_절 [where_절] select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분O (Member, age) JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) 엔티티 이.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.17
Ch10. 객체지향 쿼리 언어1(기본 문법) - 객체지향 쿼리 언어(JPQL) 소개 JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 SQL을 짜더라도 테이블이 아닌 엔티티 객체를 대상으로 해야 된다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JP.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.17
Ch09. 값 타입 - 실전 예제(값 타입 매핑) Address 값 타입 추가 @Embeddable public class Address { @Column(length = 10) private String city; @Column(length = 20) private String street; @Column(length = 5) private String zipcode; public String fullAddress(){ return getCity() + " " + getStreet() + " " + getZipcode(); } public String getCity() { return city; } private void setCity(String city) { this.city = city; } public String getStreet() { re.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16
Ch09. 값 타입 - 값 타입 컬렉션 값 타입을 하나 이상 저장할 때 사용 @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요함 값 타입 컬랙션 예제 Test TEST ================Start============ Hibernate: select member0_.MEMBER_ID as member_i1_6_0_, member0_.city as city2_6_0_, member0_.street as street3_6_0_, member0_.zipcode as zipcode4_6_0_, member0_.USERNAME as username5_6_0_ from Member member0_ where member0_.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16
Ch09. 값 타입 - 값 타입의 비교 값 타입: 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 함 동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용 동등성(equivalence) 비교: 인스턴스의 값을 비교, equals() 사용 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 함 값 타입의 equals() 메서드를 적절하게 재정의(주로 모든 필드 사용) 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16
Ch09. 값 타입 - 값 타입과 불변 객체 값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 따라서 값 타입은 단순하고 안전하게 다룰 수 있어야 한다 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함 부작용(side effect) 발생 만약 이렇게 의도해서 쓴 것이라면 값 타입을 쓰면 안 되고 엔티티를 사용해야 한다. 값 타입 복사 값 타입의 실제 인스턴스인 값을 공유하는 것은 위험 대신 값(인스턴스)을 복사해서 사용 객체 타입의 한계 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다. 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다. 자바 기본 타입에 값을 대입하면 값을 복사한다. 객체 타입은 참조 값을 직접 대입하는 것을 .. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16
Ch09. 값 타입 - 임베디드 타입 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type)이라 함 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 int, String과 같은 값 타입 (추적 X, 변경하면 끝이다) EX) 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다. 회원 엔티티는 이름, 근무 기간, 집 주소를 가진다. -> 이렇게 추상화해서 설명한다. 임베디드 타입 사용법 @Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하는 곳에 표시 기본 생성자 필수 장점 재사용 높은 응집도 Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메서드를 만들 수 있음 임베디드 타입을 포함한 모든 값.. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16
Ch09. 값 타입 - 기본값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 기본값 타입 - ex) String name, int age 생명주기를 엔티티의 의존 예).. 자바 ORM 표준 JPA 프로그래밍(인프런) 2021.12.16