본문 바로가기

728x90
반응형

공부 정리/DB

(46)
JPA를 이용해 페이징 만들기 [ 개요 ] Paging은 각 회사마다, 각 프로젝트마다 환경에 맞게 구성되어 있다. 따로 페이징을 위한 클래스를 구분하기도 하고, 엔티티가 페이징 클래스를 상속받도록 만들기도 한다. 새로운 프로젝트를 짤 때 특이사항이 아니라면 다른곳에서 사용하던 것을 그대로 사용한다. 사실상 핵심 비지니스도 아니고 복사 붙여넣기를 많이하다보니 굉장히 귀찮고 번거로운 작업이다. 이 작업을 JPA Data가 제공하는 기능을 통해 간편하게 만들어 줄 수 있다. [ 목표 ] Spring JPA에서 제공하는 페이징 쿼리 기능을 시작으로 Data에서 제공하는 @PageableDefault 기능을 알아본다. 1. 순수 JPA 페이징 기능 이용하기 public List findByPage(int age, int offset, int..
JPA를 이용해 자동으로 시간, 작성자 추가하기 개요 DB 테이블에는 생성시간, 수정시간, 작성자, 수정자의 정보가 공통적으로 많이 사용됩니다. 이 공통 칼럼은 핵심 칼럼들은 아니지만 매번 일일이 만들어주어야 합니다. 따라서, 굉장히 번거롭고 귀찮은 일인데, JPA에서는 자동으로 INSERT, UPDATE를 수행하도록 방법을 만들어 두었습니다. 자동 설정을 위한 Spring Data의 핵심은 "Audit"입니다. Spring Data는 Audit이라는 용어를 사용하여 어노테이션과 클래스들을 만들 수 있습니다. Audit의 사전 뜻은 "감시하다"입니다. 예를 들어, 경찰은 차량 검문소에서 음주여부 측정을 하고 음주가 적발되면 벌금을 부과합니다. 마찬가지로 JPA의 조회, 생성, 수정, 삭제 등을 감시하다가 저장을 했을 때, 생성시간, 수정시간을 추가합니..
다형성 쿼리 다형성 쿼리를 날리는 JPQL과 SQL을 비교한다. *목차 1. IN절 사용 2. TREAT 사용 1. IN절 사용 String query = "select i from Item i where type(i) IN (Book, Album)"; List items = em.createQuery(query, Item.class).getResultList(); //JPQL select i from Item i where type(i) in (Book, Album); //SQL select i from Item i where i.DTYPE in (Book, Album); Hibernate: /* select i from Item i where type(i) IN ( Book, Album ) */ select it..
MERGE INTO(oracle) 오라클 DB를 사용하다보면, 특정 테이블을 수정해야 할 때가 있다. 테이블 수정하려는데, 해당 케이스가 없다면 추가해야되는 상황도 있다. 이처럼 특정 테이블에 UPDATE와 INSERT를 같이하는 경우 ORACLE에서 MERGE INTO를 사용하여 해결할 수 있다. * 테이블, 데이터 생성 CREATE TABLE BEFORE_SCORE ( STUDENT_ID VARCHAR2(100), SCORE NUMBER(5,2) CONSTRAINT PK_BEFORE_SCORE PRIMARY KEY (STUDENT_ID) ) 과거 점수 테이블 BEFORE_SCORE를 생성한다. (현재 점수 테이블 NOW_SCORE도 똑같은 칼럼과 기본키를 가진다.) INSERT INTO BEFORE_SCORE(STUDENT_ID, S..
서브쿼리 서브쿼리란, SQL 쿼리 안에 있는 또다른 SQL 쿼리를 뜻한다. 또한 검색할 데이터를 추가로 제한하는 조건으로 main 쿼리에서 사용할 데이터를 반환할 때 사용한다. 서브쿼리는 SELECT, INSERT, UPDATE, DELETE문을 사용할 수 있다. 또한 대표적으로 SELECT의 경우, SELECT, WHERE, FROM 3군데에서 사용한다. *서브쿼리 특징 - 만약 main 쿼리에서 여러개의 칼럼이 필요하지 않다면, SELECT 에서는 1개의 칼럼값만 가질 수 있다. - main 쿼리에서 ORDER BY를 사용할 수 있더라도, 서브쿼리에서는 ORDER BY를 사용할 수 없다. - main 쿼리에서 GROUP BY를 사용하듯이, 서브쿼리에서 GROUP BY를 사용할 수 있다. - 1개 이상의 데이터..
조인 *목차 1. 내부조인 2. 외부조인 3. 세타조인 4. JPA 조인 - ON 절 - 1.조인 대상 필터링 - 2.연관관계 없는 조인 내부조인 SELECT m FROM Member m [INNER] JOIN m.team t Member는 있고 Team이 없으면 포함안된다 List resultList = em.createQuery("select m from Member m INNER JOIN m.team") .getResultList(); Member result = resultList.get(0); System.out.println(result.getName()); System.out.println(result.getAge()); Hibernate: /* select m from Member m INNER..
프로젝션(엔티티, 임베디드, 스칼라타입) SELECT 절에 조회할 대상을 지정한다. 일반 SQL 조회는 단순히 원하는 칼럼을 조회하지만, JPA는 엔티티, 임베디드, 스칼라타입등 다양한 리턴타입이 조회대상에 올 수 있다. *목차 1. 프로젝션 종류 2. 연관 컬렉션 조회와 한계 - 명시적 내부 조인 권장 3. 프로젝션 여러 값 조회 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) 1. 프로젝션 종류 //엔티티 프로젝션 SELECT m FROM Member m //엔티티 프로젝션(내부조인 발생) SELECT m.team FROM Member m //임베디드 타입 프로젝션 SELECT m.address FROM Member m //스칼라 타입 프로젝션 SELECT m.username, m.age FROM ..
경로 표현식 * 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 상태필드, 단일 값, 컬렉션 값 3가지의 경로 표현식이 있다. select m.username //상태필드 from Member m join m.team t //단일 값 연관필드 join m.orders o //컬렉션 값 연관필드 where t.name = '팀A'; 상태필드 연관 엔티티 연관 컬렉션 SELECT 문법 m.username m.team t.members 리턴타입 String Team Collection 추가 경로조회 불가능 가능 불가능 특징 단순한 값 엔티티 1개 엔티티 여러개 * 쿼리 비교 1. 상태 필드 경로 검색 //JPQL SELECT m.username, m.age FROM Member m //SQL SELECT m.u..

728x90
반응형