JPA를 사용하면 EntityManager.find(), 객체 그래프 탐색(member.getTeam())과 같은 기능만으로 개발하기는 어렵다. 그리고 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 엔티티 객체를 대상으로 하는 방법이 필요하다. JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. JPQL(Java Persistence Query Language) Criteria 쿼리(Criteria Query) : JPQL을 편하게 작성하도록 도와주는 API, 빌더 클래스 모음 네이티브 SQL(Native SQL) : JPA에서 JPQL 대신 직접 SQL을 사용할 수 있다. QueryDSL : Criteria 쿼리처럼 JPQL을 편하게 작성하도..
분류 전체보기
반응형

JPA의 데이터 타입을 가장 크게 분류하면 엔티티(Entity) 타입과 값(Value) 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다. DDD에서는 엔티티 + 값으로 애그리 거트를 구축한다. 값 타입은 다음 3가지로 나눌 수 있다. 기본값 타입(baisc value type) String, int, Integer처럼 자바가 제공하는 기본 데이터 및 래퍼 클래스 타입 임베디드 타입(embedded type) - 복합 값 타입 JPA에서 사용하가 직접 정의한 값 타입 컬렉션 값 타입(collection value type) 하나 이상의 값 타입을 저장할 때 사용 기본값 타..
고아 객체 제거 JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이것을 고아 객체(ORPHAN) 제거라 한다. 이 기능을 사용해서 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제한다. @Entiry public class Parent { @Id @GeneratedValue private long id; @OneToMany(mappedBy = "parent", orphanRemoval = true) private List childs; } Parent parent = em.find(Parent.class, id); parent.getChilds().remove(0); // 실제 데이터베이스에서 삭제 orphanRemoval = ..

2022.01.06 - [회고] - 아주 작은 습관의 힘(ATOMIC HABITS) - Part 1 인생은 생각하는 만큼 바뀐다. 인간의 뇌는 예측 기계다. 뇌는 지속적으로 환경을 받아들이고 정보들을 분석한다. 진품 감별사는 물건을 보고 진품인지 가품인지 골라낼 수 있고 의사들은 뇌 스캔 영상을 보고 뇌졸중이 생겨날 위치를 예측할 수 있다. 이처럼 뇌는 경험을 통해 배운 교훈들을 자동적으로 인코딩한다. 반대로 이는 습관이 위험한 이유가 될 수이다. 뇌에 너무 깊게 인코딩 되어 있어서 나도 모르게 무의식적으로 나쁜 행동을 할 수 있다. 새로운 습관을 효율적으로 세우기 전에 먼저 현재의 습관을 파악하고 의식적으로 행동 변화를 해야 한다. 의식하지 않으면 변화할 수 없다. 좋은 습관과 나쁜 습관을 구분하고 인..

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. @Entity @NoArgsConstructor public class Parent { @Id ... @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST , CascadeType.REMOVE}) // 영속성 전이 private List childrens = new ArrayList(); public void addChild(Child child) { // Child 추가 t..

21년도 후반부터 내가 게을러지는 게 느껴졌다. 회사에서 퇴근하고 집 가는 길이 만원 지하철에 1시간 반이 넘게 끼여서 오다 보니 집에 오면 너무나 지쳤고, 집에 도착하면 매일 누워서 유튜브만 보는 게 일상이었다. 그래서 22년부터는 공부하거나 지치면 책을 읽기로 다짐하였다. 그래서 눈에 들어온 것이 아주 작은 습관의 힘이라는 책이었다. 독서 후에 내가 조금이라도 바뀌었으면 하는 마음으로 한 섹션마다 읽고 정리를 하였다. 1%의 변화 저자는 행동의 조금 한 변화로 시작해서 습관으로 변하면서 모든 게 달라졌다고 한다. 1%의 변화는 단기간에서 보기에는 아무것도 아닌 것처럼 느낄 수 있지만 하루에 1%라도 변화한다면 며칠, 몇 달 후에는 엄청난 변화로 다가올 것이다. 반대로 1% 좋지 않은 변화가 있다면 며..

객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 프록시의 특징 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체를 생성하는데 이것을 프록시 객체, 프록시 클래스라고 한다. 프록시 객체는 실제 클래스를 상속받아서 만들어지므로 실제 클래스와 걷 모양이 같다. 따라서 사용하는 입장에서는 이것이 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체는 실제 객..

개발중에 진행되어야 하는 부분을 TODO기능을 사용해 나중에 확인할때가 있다. 하지만 모든 확인사항을 TODO로 사용하기엔 의미상 맞지도 않을 뿐더러 같은 TODO라도 다른 의미라면 구분하기 어렵다. 현재 로그인시 회원 데이터 동기화(레거시 -> 새로 개발한 서비스)하는 코드를 짜고있는데 나중에 동기화가 다 되었을때 동기화 하는 부분에 코드를 모두 지우든 주석처리하든 하려고 한다. 그래서 TODO 기능을 사용해 나중에 동기화가 완료된 후 제거해야할 코드를 구분하려고 한다. 인텔리제이 기준이다. 나는 LEGARCY라는 패턴을 사용해서 사용할 것 이다. 글자 배경, 색도 모두 변경할 수 있다. 요런식으로 사용해서 TODO를 확인하면 한눈에 구분하기 편하다

데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 조인 컬럼(외래 키) 사용 조인 테이블(브릿지 테이블) 사용 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 연결할 테이블이 많아 질수록 컬럼이 많아질 수 있다. 조인한 테이블이 필수일때는 INNER JOIN(NOT NULL)을, 필수가 아닐때는 OUTER JOIN(NULL)으로 조인한다. 조인 테이블 사용 조인 테이블을 생성해 연결할 테이블들의 기본 키들을 엮어서 연결한다. 나는 보통 브릿지 테이블로 부르고 다대다 연결을 할때, 다른 테이블에 조인이 추가될 가능성이 높을때 주로 사용한다. 테이블마다 필요한 정보만 저장할 수 있어서 이 방법을 선호하지만 조인 테이블이 많아져 SQL이 느려질 ..

복합키 JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들어 식별자를 구분해야 한다. JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 2가지 방법을 제공한다. @IdClass는 관계형 데이터베이스에 가까운 방법이고, @EmbeddedId는 좀 더 객체 지향에 가까운 방법이다. 복합키 매핑에 예제에서 확인해보자 복합 키: 식별 관계(Identifying Relationship) 매핑 식별 관계는 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계다. PARENT 테이블의 기본 키 PARENT_ID를 받아서 CHILD 테이블의 기본 키(CHILD_ID) + 외래 ..