본문 바로가기

Spring/JPA10

@Converter 사이드 프로젝트 도중 회원이 프로필을 생성했는지 여부를 체크해주는 필드를 추가해야하는 경우가 발생했다. 필드를 추가하고 값으로 0,1을 저장해야할지.... true, false로 저장을 해줘야 할지 고민이 됐다. DB 입장으로 봤을때는 전자가 더 좋은 선택일거 같고 개발자 입장에서는 후자가 좋을거 같다는 생각이 든다. 그러다가 생각이 든게 개발자는 boolean 형태로 저장을하면 DB에는 0,1으로 저장해주는 방법이 있지 않을까라는 생각이 들어서 찾아보니 @Converter 를 발견했다. AttributeConverter 인터페이스 @Converter를 사용 할려면 AttributeConverter 인터페이스를 구현 해야 한다. AttributeConverter를 살펴 봐보자 [ 인터페이스 주석 ] 이 .. 2023. 6. 7.
JPA ) JPQL 문법 1 JPQL (Java Persistence Query Language)이란 ? 엔티티와 속성은 대소문자 구분한다. (Member != member) JPQL 키워드는 대소문자 구분하지 않는다. (SELECT, FROM, where) 엔티티(Member) 이름을 사용하고, 테이블 이름이 아니다. 별칭(m)은 필수이다. as는 생략가능하다. 1. 집합과 정렬 SQL 의 집합과 정렬관련 함수는 그대로 JPQL에서 사용 가능하다. EX ) COUNT, SUM, AVG, GROUP BY, HAVING ORDER BY 2. 파라미터 바인딩 - 이름 기준 - 위치 기준(사용 X) 3. TypeQuery, Query TypeQuery: 반환 타입이 명확할 때 사용 Query: 반환 타입이 명확하지 않을 때 사용 4. 쿼.. 2023. 4. 23.
JPA ) 객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원한다. JPA 쿼리 언어 종류 1. JPQL 2. JPA Criteria 3. QueryDSL 4. 네이티브 SQL 5. JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 1. JPQL 이란? JPA를 사용하면 엔티티 객체를 중심으로 개발할 수 있다. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다. - 가장 단순한 조회 방법이다. ex ) EntityManager.find() - SQL과 문법 유사하다. SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원한다. - JPQL은 엔티티 객체를 대상으로 쿼리 생성할수 있다. 실제 SQL은 데이터베이스 테이블을 대상으로 쿼리 .. 2023. 4. 23.
JPA ) 1:1 연관 관계 일대일 연관 관계란 예를 들어서 Member와 Locker 의 관계라고 보면 된다. 회원은 하나의 락커를 가질수 있고, 락커의 주인은 오로지 한명이다. 이럴때 사실 한곳에만 저장해도 되지만 정규화하면서 분리하기도 한다. jpa에서는 어떤식으로 일대일 관계를 맵핑하는지 살펴보자 일대일 관계는 반대로 봐도 일대일이다. 그렇기때문에 주테이블 또는 대상 테이블 중에 한곳에 외래키를 맵핑하면 된다. 외래키에 데이터베이스 유니크 조건 추가해야하는데 추가를 안해도 사용은 가능하다. 추가를 하지 않으면 에플리케이션에서 관리를 잘해야한다. 위의 그림은 회원을 주테이블로 보고 회원에 락커 외래키를 넣은 모습이다. 락커 안에 회원의 외래키를 넣어도 상관은 없다. 한곳에만 들어가 있으면 된다. 외래키가 있는 곳이 연관관계의 .. 2023. 4. 18.
JPA ) 연관관계 테이블에는 연관관계가 존재 한다. Member는 하나의 Team에 소속되어있어야 한다. Member와 Team은 서로 연관관계로 묶여있고, Member를 조회하면서 Team 과 조인하면 Team 값도 쉽게 알수 있다. 하지만 객체는 아니다. Member를 조회한다고 해서 쉽게 Member가 소속된 팀의 값을 알수없다. 하지만 JPA는 객체끼리도 연관관계를 맺는 기능을 제공하여 연관되어 있는 객체 정보를 쉽게 조회 할 수있게 해준다. 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계이다. 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계다. 2023. 2. 20.
JPA ) 플러시(Flush) 란? 플러시란 영속성 컨텍스트의 변경내용을 데이터 베이스에 반영하는 작업이다. flush가 발생하면 일어나는 일 1. 변경 감지 2. 변경 된 엔티티를 쓰기 지연 SQL 저장소에 등록 3. 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 등록 (등록, 삭제, 수정 쿼리) 주의 . 데이터 베이스에 등록한다고 커밋되는 것은 아님 주의. 영속성 컨텍스트가 비워지는 것이 아님 영속성 컨텍스트를 flush 하는 방법 1. em.flush : 직접 호출 2. 트랜젝션 커밋 : flush 자동 호출 3. JPQL 쿼리 실행 : flush 자동 호출 JPQL 쿼리 실행 영속성 컨텍스트에 엔티티를 저장하고 flush를 안한 상태에서 member를 조회 한다면 우리 생각에는 아무것도 조회가 안되어야하지만 쿼리를 날리기전에 플.. 2022. 12. 13.