0. Spring-Data-JPA 개요 기본 형태는 다음과 같습니다. public interface MemberRepository extends JpaRepository { } 위 코드에서 상속받는 JpaRepository의 상속 관계도는 다음과 같습니다. (모두 인터페이스) JpaRepository ---> PagingAndSortingRepository ---> CrudRepository ---> Repository JpaRepository 인터페이스에는 다음의 메서드가 정의되어 있습니다. findAll() findAllById() saveAll() getOne() 1. 쿼리 메서드 기능 Spring-Data-JPA에는 쿼리 메서드라고 하는 기능이 있습니다. 쿼리 메서드 기능은 총 세 가지가 있습니다..
1. 개요 JPA를 사용하면 Entity 객체를 중심으로 개발을 할텐데, 이때 문제는 검색 쿼리입니다. 따라서, 세심한 검색을 위해 쿼리를 짤 수 있어야 하고, JPA는 JPQL이라는 SQL을 추상화한 객체 중심 SQL을 제공합니다. JPQL은 테이블이 아닌 Entity 객체를 대상으로 검색합니다. JPQL은 ANSI 표준에 나와있는 모든 SQL을 지원합니다.(SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN) 2. 프로젝션 SELECT절에 조회할 대상을 프로젝션이라고 하고, Entity, Embedded 타입, 스칼라 타입(기본 데이터 타입)이 있습니다. SELECT m FROM Member m // 엔티티 프로젝션 SELECT m.team FROM Member m // 엔..
1. 개요 JPA는 데이터 타입을 크게 두 가지로 분류합니다. Entity 타입 Value 타입 이 중 Value 타입에 대해 살펴보겠습니다. 2. Value 타입 Value 타입은 값의 변경을 추적할 수 없는 타입을 말합니다. int, double와 같은 Primitive 타입뿐만 아니라, Integer, String과 같은 클래스도 참조는 가지지만 값의 변경을 추적할 수 없기 때문에 마찬가지로 Value 타입에 속합니다. (값의 변경을 추적할 수 없다는 말은 값을 변경할 수 없다는 의미입니다. Integer, String의 값을 변경하면 참조하는 주소가 바뀝니다.) JPA의 Value 타입은 세 가지로 나눠 생각해볼 수 있습니다. 기본 값 타입: int, double와 같은 Java의 Primitiv..
1. 프록시(Proxy) JPA의 Proxy 특징은 다음과 같습니다. 프록시 객체는 처음 사용할 때 한 번만 초기화합니다. 프록시 객체를 초기화할 때, 프록시 객체가 실제 Entity로 바뀌는 것은 아닙니다. (프록시 클래스의 필드로 Entity를 가집니다.) 초기화되면 Proxy 객체를 통해서 실제 Entity에 접근할 수 있습니다. Proxy 객체는 Entity 클래스를 상속받습니다. 따라서 타입 비교시 주의해야 합니다. (instance of 사용) 영속성 컨텍스트에 찾는 Entity가 이미 있으면 em.getReference()를 호출해도 실제 Entity가 반환됩니다. 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생합니다. (이 경우 Hibernate는..
[Spring Data JPA] 고급 매핑(상속 관계 매핑, @MappedSuperclass)
2021.11.16
1. 상속 관계 매핑 객체 모델에서 상속관계는 아주 흔합니다. 그런데 관계형 DB는 상속관계가 없는데 어떻게 해야 할까요? 관계형 DB에는 슈퍼타입-서브타입 관계라는 모델링 기법이 있는데, 이 모델로 객체의 상속관계와 매핑할 수 있습니다. 위 슈퍼/서브 타입 논리 모델을 가지고 설명해보겠습니다. 우선, 슈퍼/서브 타입 모델은 논리적인 데이터 모델에서만 이용되는 형태이기 때문에 물리적인 데이터 모델로 변환 작업이 필요합니다. 슈퍼/서브 타입 논리 모델을 물리 모델로 변환하는데에는 3가지 방법이 있습니다. 각각 테이블로 변환(JOINED 전략) - 위 형태 그대로 테이블을 만들어 item_id 와 같은 컬럼으로 JOIN하는 방법 통합 테이블로 변환(SINGLE_TABLE 전략) - 위의 예에서 ITEM 테이..
1. 개요 이전 포스팅에서 객체 연관관계에서의 단방향 관계, 양방향 관계에 대해 살펴봤습니다. 이제 DB 테이블 기준으로 경우의 수를 나눠서 생각해보겠습니다. DB 테이블의 관계는 총 4가지로 나뉩니다. 다대일 N:1 일대다 1:N 일대일 1:1 다대다 N:M 위 관계는 좌측 테이블을 기준으로 잡고 좌측에 외래 키가 있는 경우를 나타냈습니다. 예를 들어, N:1 관계는 N쪽에 외래 키가 있는 경우고, 1:N 관계는 1쪽에 외래 키가 있는 경우입니다. 위와 같은 4개의 DB 테이블 관계에 대해 나눠서 살펴보겠습니다. 2. N:1 이전 포스팅에서도 살펴봤듯이, 가장 일반적이고 대표적이고 직관적인 모델입니다. 아래 N:1 테이블을 기준으로 설명하겠습니다. 두 가지 경우로 나눠보겠습니다. Member->Team..
1. DB 테이블 중심으로 Entity 클래스를 설계했을 때의 문제점 다음과 같은 관계를 가지는 테이블을 가지고 설명하겠습니다. DB 테이블에 맞춰 Member Entity 클래스를 설계하면 다음과 같이 될 것입니다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long memberId; private String username; private Long teamId; } 보시면 테이블의 컬럼에 맞춰서 Entity 클래스의 필드를 정의했습니다. 이러면 멤버와 멤버가 속한 팀을 조회할 때 멤버를 우선 조회한 후, 가져온 teamId 값으로 다시 Team 테이블을 조회해야 합니다. Member..
1. Hibernate의 DB 테이블 자동 생성 들어가기에 앞서, 개발 및 로컬 환경에서 테스트를 용이하게 하는 DB 테이블을 자동으로 생성해주는 기능을 알아보겠습니다. 보통 개발할때 DB 테이블을 먼저 만드는데요, Hibernate에서 지원하는 DB 테이블 생성 기능을 사용하면 이 과정을 생략할 수 있습니다. /META-INF/persistence.xml 설정 파일에 다음과 같이 hibernate.hbm2ddl.auto 옵션을 설정해줍니다.
1. 영속성 컨텍스트 영속성 컨텍스트는 객체와 관계형 데이터베이스 사이에 위치하는 공간, 즉 중간 계층입니다. 영속성 컨텍스트라는 중간 계층을 둠으로써 얻는 이점은 다음과 같습니다. 1차 캐시 조회한 entity 객체의 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 위 5가지 이점을 차례로 살펴보겠습니다. 우선 1차 캐시부터 살펴보겠습니다. 1.1 1차 캐시 다음과 같이 entity 객체를 생성하고 .persist() 메서드를 이용해 entity 객체를 영속시킨다고 해보겠습니다. Member member = new Member(); member.setId("member1"); member.setUsername("회원..
1. JPA를 이용한 CRUD /META-INF/persistence.xml 파일에 JPA 설정값을 정의합니다. (어떤 DB를 사용할지, 계정 정보, Hibernate 관련 추가 속성) 다음으로 main 메서드에서 EntityManager를 이용한 코드입니다. public class Main { public static void main(String[] args) { // 파라미터는 /META-INF/persistence.xml 이라는 JPA 설정 파일에 정의해놓은 // 를 의미합니다. EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("hello"); // EntityManager가 DB 커넥션을 물고 있기 때문에 사용 후 ..
1. 개요 Java를 이용해 DB 작업을 할때 최초에는 가장 네이티브한 JDBC API를 이용했습니다. JDBC API를 사용해보신 분들은 아시겠지만, 항상 Connection 객체를 받아와서.. SQL 코드 적고, 실행한 후 마지막에는 .close() 로 자원을 해제해줘야 합니다. 중복 및 불필요한 코드 때문에 생산성이 너~무나 떨어졌습니다. 그래서 자원 관리는 누가좀 알아서 해주고 개발자는 SQL 코드만 신경쓸 수 있게하자 해서 나온게 MyBatis, Spring JDBC와 같은 SQL 매퍼입니다. SQL 매퍼를 사용하면 자원 관리를 알아서 해주니 너무 편리했습니다. 하지만 개발자가 SQL을 직접 작성한다는 것으로 인해 여전히 몇 가지 문제가 남아있었습니다. // 개발자가 SQL을 직접 작성해야한다면..