Spring
프로젝트 환경 설정
프로젝트 환경 설정 프로젝트 생성 및 세부 설정 1. 스프링 부트 스타터(https://start.spring.io/)에서 프로젝트 만들기 스프링부트 스타터는 스프링 부트에서 프로젝트를 쉽게 만들어주기 위해 제공한다. project: gradle springBoot: 2.4.10 버전 GroupId: jpabook Artifact: jpashop dependencies 설정 - Spring Web (스프링 스타터팩) - Thymeleaf (jsp 대체 프로그램, WEB) - Sptring Data JPA (JPA) - H2 Database (편한 실습을 위한 DB 설정) - Lombok (중복된 코드 줄여주는 자바 어노테이션기능) => GENERATE 버튼 눌러서 프로젝트 생성 ! 임포트해서 실행 ! J..
JPQL의 다형성 쿼리와 네임드 쿼리
다형성 쿼리 조회 대상을 특정 자식으로 한정할 수 있음 (type(), treat 이용) ex) Type 이용 Item - Album - Movie - Book JPQL select i from Item i where type(i) IN(Book, Movie) SQL select i from Item i where i.DTYPE in ('Book', 'Movie') treat 사용 -> 자바의 타입 캐스팅과 유사하다. -> 상속 구조에서 부모타입을 특정 자식타입으로 다룰때 사용 jpql select i from Item i where treat(i as Book).author = 'kim' Named 쿼리 • 미리 정의해서 이름을 부여해두고 사용하는 JPQL -> 재사용성 ↑ • 정적 쿼리 • 어노테이션..
JPQL의 Update, delete 사용, 벌크연산
벌크연산 update 예시) 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면 SQL UPDATE Product as p SET p.price = (p.price * 1.1) WHERE p.count SQL의 UPDATE문처럼 쿼리 한번으로 한번에 많은 데이터를 변경또는 삭제하고 싶다면 (벌크연산) executeUpdate()를 뒤에 붙여서 일괄 실행하면 된다. (executeUpdate()의 연산 결과는 변경된 엔티티 수를 반환한다.) (update, delete는 지원되고 insert는 하이버네이트에서 지원된다) 다시 올바른 코드로 변경해보자! 코드 // 멤버 Member member1 = new Member(); member1.setUsername("정석우"); em.persist(memb..
JPQL의 페치 조인 (Fetch Join)
페치 조인(Fetch join) 특징 • SQL의 조인 종류가 아니다. • JPQL에서 성능 최적화를 위해 제공하는 기능 => 관련 객체 그래프를 SQL 한번에 조회하는 개념이다. • 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 => 페지 조인을 사용할 때 연관된 엔티티도 함께 즉시 로딩해서 조회 • join fetch 명령어 사용 => 페치 조인 ::= [ LEFT [OUTER] | INNER ] JOIN FETCH 조인경로 지연로딩 참고: https://ggp03016.tistory.com/68 저번 시간에 지연로딩에 대해 공부했었다. 지연로딩은 하나의 엔티티를 조회할 때 연관된 객체 그래프의 엔티티까지 즉시 로딩하지 않고, 프록시 객체로 두어 그 연관된 객체의 속성값을 호출하기 전까..
JPQL 타입과 기타식, CASE 사용 방법, JPQL의 기본함수와 사용자 설정함수
JPQL 타입 표현 문자: "HELLO" 등 Boolean: TRUE, FALSE 숫자: 10L (Long), 10D (Double), 10F (Float) ENUM: jpql에서 ENUM 타입의 값을 조회할 때는 패키지명도 포함해서 작성 엔티티타입: 특정 엔티티 타입으로 조회 가능하다, 예를들어 Item을 상속한 Book, Album, Movie등이 있을때 특정 엔티티를 조회하기 위해서 엔티티타입을 이용할 수 있다. 예시) ex) 문자, boolean, 숫자 selet m.username, "HELLO", true, 10L from Member m ex) ENUM1 selet m.username, 'HELLO', true from Member m where m.type = jpql.MemberType...
JPQL 조인, 서브쿼리
조인 내부 조인 SELECT m FROM Member m [INNER] JOIN m.team t 외부 조인 SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 세타 조인 SELECT count(m) FROM Member m, Team t where m.username = t. name 조인 ON 절 ON의 기능 1. 조인 대상 필터링 2. 연관관계 없는 엔티티 외부 조인 기능 1번 예시) 예) 회원과 팀을 조인하면서 팀 이름이 A인 팀만 조인 SELECT m FROM Member m LEFT JOIN m.team t ON t = 'A'; 여기서 ON은 JOIN을 할때의 조건이다 즉, 팀 이름이 A인 애들만 left 조인하고 싶다. 라는 의미이다. 기능 2번 예시) 예..
JPQL를 통한 조회, 페이징
프로젝션(조회) - SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 기본데이터 타입 등) 엔티티 타입 예시) 엔티티 프로젝션 SELECT m FROM Member m; SELECT m.team FROM Member m; => team으로 조회할 때 Member에서 Team으로 자동으로 join쿼리를 날려 조회하는 것이다. 이를 알고 명시해주는 작업이 초보자들에겐 필요할 수 있는데, 따라서 "SELECT t from Member m join m.team t" 로 조회하는 것 더 이해하고 학습하기 좋을 것 같다. 임베디드 타입 예시) 임베디드 프로젝션 SELECT m.address FROM Member m; 생성한 임베디드 타입 address로 ..
객체지향 쿼리 언어 소개(JPQL, QueryDSL, NativeQuery)
JPA는 JPQL을 포함한 다양한 쿼리 방법을 지원한다. 필요성 JPA를 사용하면 테이블이 아닌 엔티티 객체를 중심으로 개발한다. => 문제는 검색쿼리 검색할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하고 싶은데, 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능. (find로 일일히 데이터 하나하나를 찾을 수 없기 때문) 결국 에플리케이션이 필요한 데이터들만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. => 쿼리 언어를 통한 조회 JPQL - SQL을 추상화한다. 그래서 특정 DB SQL에 의존하지 않는다. - 안심표준 SQL을 지원 - JPQL은 테이블이 아닌 엔티티 객체를 대상으로 하는 객체 지향 쿼리 - SQL은 DB 테이블을 대상으로 쿼리 => 하지만 String..