JPA

JPA

    QueryDsl에서 delete limit 문법을 사용할 수 없는 이유

    mariadb를 사용하여 서비스 개발 중 delete로 필요한 row를 지울 때 limit을 줘서 지우려고 시도를 했었다. mariadb 문법에서는 정상적으로 동작이 가능한 문법이기 때문에 당연히 제공할거라고 생각했다. 하지만 JPADeleteClause에서는 limit을 찾아볼 수 없어 사용할 수 없었다. http://www.querydsl.com/static/querydsl/4.1.4/apidocs/com/querydsl/jpa/impl/JPADeleteClause.html 그 이유는 jpa의 dialect 때문이었다. target DBMS가 변경되어도 쿼리를 수정할 필요가 없는 장점을 제공해주는 jpa의 dialect 때문에 공통 문법이 아닌 특정 specific한 dbms 문법은 제공하지 못하는 ..

    [번역] 2-2. Domain 모델 (Enum, UUID, Date, Attribute, Generated Properties)

    2.3.7 Enums 매핑 Hibernate는 기본값 유형으로써 다양한 방법으로 Java Enum의 매핑을 지원한다. @Enumrated 기본적인 JPAdml enums의 매핑 방법은 @Enumrated 또는 @MapKeyEnumrated 애노테이션을 통해 javax.persistence.EnumType에 표시된 두 가지 전략 중 하나에 따라 enum 값이 저장된다는 원칙에 따라 동작한다. ORDINAL - java.lang.Enum#ordinal에 기재된대로 Enum 클래스 내에서 Enum값의 순서에 따라 저장된다 STRING - java.lang.Enum#name 방식에 기재에 따라 Enum값의 이름에 따라서 저장된다. 아래 예시로 PhoneType이라는 Enum이 있다고 가정해보자. public e..

    [번역] 2-1. Domain 모델 (매핑 타입, 네이밍 전략, Basic Type - 1)

    2. 도메인 모델 도메인 모델이라는 단어는 데이터 모델링이라는 영역에서 비롯된다. 이것은 작업을 하고 있는 도메인의 모델로 묘사되기도 하고 때때로 이를 persistent classes라고 부른다. 궁극적으로 애플리케이션 도메인 모델은 ORM에서 중심이 되는 단어이다. 이것들은 매핑하고 싶은 클래스들로 구성된다. Hibernate는 POJO/JAVA Bean 프로그래밍 모델을 따를 때 가장 잘 동작한다. 그러나 이런 규칙은 어려운 요구사항은 아니다. 게다가 Hibernate는 persistence 객체의 특성에 대해 매우 조금만 담당하고 있다. 사실 Map 인스턴스 트리등을 사용하여 다른 방법으로도 domain 모델 구현이 가능하다. 2.1 매핑 타입 Hibernate는 Java와 JDBC 애플리케이션의..

    [번역] Hibernate Document 서문, 시스템 요구사항, 아키텍처

    서문 객체 지향 소프트웨어와 관계형 데이터베이스를 함께 쓰는 것은 귀찮고 시간이 많이 소비된다. 데이터가 관계형 데이터베이스와 객체 사이에서 표현되는 방식의 패러다임 불일치로 인해 개발 비용이 증가하게 된다. Hibernate는 자바 환경에서 객체/릴레이션 매핑의 솔루션이다. 객체/관계형 매핑이라는 말은 객체 모델 표현 방식으로 부터 관계형 데이터를 매핑하는 기술을 의미한다. Hibernate는 자바 클래스로 데이터베이스를 매핑하는 것 뿐 아니라 데이터 쿼리 및 탐색 기능을 제공한다. 이는 SQL과 JDBC로 데이터를 핸들링하는 시간을 상당히 줄여줄 수 있다. Hibernate의 디자인 목표는 SQL과 JDBC로 데이터를 처리하는 필요성을 제거함으로써 개발다의 데이터 관련 프로그램 작업의 95% 감소 시..

    [토이프로젝트] TimeLine 개선

    한동안 잠시 멈췄다가 다시 열면서 내용을 추가 하고 싶었다. 타임라인의 목적은 개발에 관련 블로그 내용들과 채용 뉴스등을 한번에 보기 위해서 만든 서비스이다. 사실 내가 한번에 보고 싶은 욕구가 있어서 만들게 되었다. 그런데 채용이나 회사 블로그 뉴스등은 넣었는데 개인 블로그를 볼 수 있는 기능이 없어서 불편했는데 추가했다. 개인블로그 추가 그리고 메인 화면이 없어서 첫 화면을 설정하기가 애매했다. 그래서 메인화면도 summary해서 볼 수 있도록 추가했다. 메인화면 추가하면서 잘못된 @Transaction 어노테이션 사용으로 문제가 많았었다. 에러내용은 아래와 같다. org.hibernate.AssertionFailure: null id in entry (don't flush the Session af..

    JPA 다양한 Join 방법 정리 (N+1, queryDSL, fetch join)

    JPA를 사용하다 보면 join을 할 때가 많아진다. join을 어떠한 방법으로 하느냐에 따라서 수행되는 쿼리가 달라지고 성능에 문제가 발생하는 경우도 종종있다. 그래서 다양한 방식의 join 방식을 알아보고 방식에 따라 작업을 진행해 보자. 우선 사용될 entity 두 개를 설명하면 다음과 같다. @Getter @Entity @Table(name = "wedul_classes") @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor @Builder public class WedulClasses extends CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY..

    DDD. 애거리루트 정리

    애그리거트는 관련된 객체를 하나의 군으로 묶어주는 것 으로 상위수준에서 모델을 조망하는 방법 중 하나이다. 애그리거트는 비슷한 속성을 가진 객체를 묶어놓은 것을 의미한다. 예를 들어 주문 시스템에 주문 관련 애그리거트는 Order, Receiver, OrderLine.. 등이 있고 회원정보에는 Member, MemberInfo등으로 나눌 수 있다. 각 애그리거트에 연관된 객체를 담고 있으며 유사하고 동일한 라이프 사이클을 보유하고 있다. 애거리거트 루트 애그리거트에서 가장 핵심이 되는 주체 즉, 애그리거트 전체를 관리하고 책임지는 주체를 애그리거트의 루트 엔티티라고 한다. 애그리거트내에 존재하는 모든 엔티티는 루트 엔티티와 직간접적으로 연결되어있다. 애거리거트 루트의 핵심 역할은 애거리거트의 일관성을 유..

    스프링 부트에서 사용하는 JPA 기능 정리

    스프링 프레임워크에서 제공하는 JPA는 별도의 구현 클래스 없이 인터페이스만을 사용할 수 있도록 제공한다. 제공되는 인터페이스 JpaRepository는 실행시점에 자동으로 인터페이스 내용을 연결하는 엔티티에 맞게 자동으로 구현해준다. 만약 스프링 JPA 인터페이스에서 제공하지 않는 기능을 사용하고 싶을 때는 메서드명을 특정한 규칙대로 만들어서 사용하면 인터페이스가 알아서 그 이름에 맞는 JPQL을 만들어서 실행해준다. 스프링 JPA 인터페이스는 Mysql같은 RDBMS 뿐만 아니라 Mongodb, Redis와 같은 NoSQL에도 동일한 인터페이스를 사용해서 기능을 사용할 수 있도록 제공해준다. 공통으로 사용할 수 있기에 아주 편리하다. 우선 스프링 부트에 JPA를 사용하기 위해서 Gradle에 라이브러..

    JPA 상속관계 매핑 전략

    객체 지향으로 데이터베이스 중심 매핑을 변경하기 위해서 가장 애매한게 상속이다. 이런 상속관계속에서 테이블로 구현할 때 3가지 방법을 선택할 수 있다. 1) 각각의 테이블로 변환 : 각각을 모두 테이블로 만들고 조회할 때 조인을 사용. 2) 통합 테이블로 변환 : 테이블을 하나만 사용해서 통합 3) 서브타입 테이블로 변환 : 서브 타입마다 하나의 테이블을 만드는 방식. 순서대로 하나씩 정리해보자. ㅁ 각각의 테이블로 변환 (조인전략) - 부모와 각각의 자식 엔티티를 모두 각자의 테이블로 만들고 부모의 기본키와 자식의 외래키를 사용하여 조인하여 사용한다. - 자식 엔티티의 타입을 구별하기 위한 DTYPE 컬럼을 구분컬럼으로 추가하여 사용한다. (없어도 무관) 1234567891011121314@Entity..

    JPA 관계 유형별 엔티티 설정 방법

    JPA에서 관계 유형별로 엔티티를 설정하는 방법을 정리해보자. 1. 다대일 (단방향) -> 다쪽에 @ManyToOne 으로 설정 12345678910111213141516171819202122232425262728@Entity@Table(name = "student")@Data@NoArgsConstructor@AllArgsConstructorpublic class Student { @Id @Column(name = "STUDENT_ID") private String id; @Column(name = "name") private String name; @ManyToOne @JoinColumn(name = "CLASSES_ID") private Classes classes; public void setCla..

    연관관계 매핑 (다대일 - 양방향)

    바로 앞에서 다대일 관계에서 단반향으로써 학생이 반을 접근하는 방식으로 진행했으나 이번에는 반에서 학생들을 접근하는 방식을 사용해보자. 그렇게 되면 학생 -> 반에서 반 -> 학생이 추가되어 결국 반 학생 이런 양방향 연관관계가 형성된다. 하나의 반에는 여러 학생이 포함되어 있다. 그렇기 때문에 반 클래스에 List 객체를 추가한다. 1 2 @OneToMany(mappedBy = "classes") private List students; cs @OneToMany(mappedBy = "classes") - 일대다 매핑을 정보를 추가하고 학생쪽에서 사용되는 반 필드명을 mappedBy에 값으로 추가해준다. 조회 반에 포함되어 있는 학생들을 조회한다. 1 2 3 4 5 6 7 8 9 10 @Override ..

    연관관계 매핑 - 다대일 매핑 (단반향)

    연관관계 매핑을 해야하는 경우가 많다. 예를 들어 학생을 가지고 학생에 소속 반을 찾거나 반을 사용해서 학생들을 찾거나 할 때가 있다. 이 때 양방향과 단방향 관계가 존재하는데 아래의 객체 형태를 보면 이해가 더 쉽다. 단방향 class Student { Class class; } class Class {} 양방향 class Student { Class class; } class Class { Student student; } 이중에서 먼저 단방향 연관 관계에 대해 먼저 공부해보자. 단방향 연관관계 학생과 반이있다. 학생은 하나의 반에 소속된다. 학생과 반은 다대일 관계이다. (학생이 다, 반이 일) 학생 테이블을 담는 객체는 Student, 반 테이블을 담는 객체는 Classes를 사용한다. 학생 테이..

    JPA 매핑 어노테이션 - DDL 2

    엔티티 매핑에서 사용될 컬럼의 필드 유형을 설정하는 매핑 어노테이션을 정리해보자. @Column 테이블에서 사용 되는 컬럼이라는 필드를 지정해줄때 사용하며 name, nullable(기본이 true) 등의 설정을 해줄 수 있다. 12@Column(name = "NAME", length = 10, nullable = true)private String userName;cs @Enumerated 자바의 enum 타입을 매핑할 때 사용한다. 속성으로 EnumType.ORDINAL과 EnumType.STRING이 존재하는데 이름 그대로 ORDINAL은 순서를 STRING은 Enum의 이름을 저장한다12345678910111213141516171819202122232425262728public class Memb..

    JPA 매핑 어노테이션 - DDL

    JPA 매핑에 사용되는 어노테이션은 크게 유형에 따라 4가지로 나누어진다.유형어노테이션객체와 테이블 매핑@Entity, @Table 기본 키 매핑@Id필드와 컬럼 매핑@Column연관관계 매핑@ManyToOne, @JoinColumn @EntityJPA를 사용해서 테이블과 매핑할 클래스에는 무조건 붙혀야하는 어노테이션이다. 속성으로 name을 지정할 수 있다. 안할 시 기본 클래스 이름으로 한다.1@Entity(name = "Member")cs - 기본 생성자가 필수로 있어야 한다. - final 클래스와 private 생성자는 할 수 없다. @Table엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑하는 엔티티이름으로 대신한다. -name, catalog, schema, uniqueConstraints..

    JPA 영속성 컨테이너에서 엔티티 사용하기

    JPA에서 사용하는 영속성 컨테이너에서 사용되는 엔티티에 대해 정리해보자. 엔티티 생명주기영속성 컨테이너(Persistent Context)에서 존재하는 엔티티의 생명주기를 정리해보자. 엔티티는 4가지 상태가 존재한다. 이름 특징 비영속 영속성 컨텍스트와 전혀 관계가 없는 상태 (엔티티 객체가 생성만 되고 컨텍스트와 아무런 연관이 없는경우) 영속 영속성 컨텍스트에 저장된 상태 (엔티티 매니저를 통해서 영속성 컨텍스트에 저장되고 영속성 컨텍스트가 관리한다.) 준영속 영속성 컨텍스트에 저장되었다가 분리된 상태 (영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다. close(), clear(), detach() 메소드를 사용하면 준영속 상태가 된다. 삭제 삭..

    JPA persistence 설정 및 Entity manager 설명

    JPA를 사용하기 위해서는 persistence.xml을 이용하여 사용 설정을 해야한다. persistence-unit에 이름을 설정하고 각종 데이터베이스를 설정한다. 구조는 다음과 같이 되어있다.12345

    JPA 기본 어노테이션 설명

    JPA에서 사용되는 기본적인 어노테이션 몇개를 정리해보자. @Entity- 클래스와 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용될 클래스를 엔티티 클래스라고 한다. @Table- 엔티티 클래스에 매핑할 테이블 정보를 알려준다. (이 어노테이션을 생략하면 클래스 이름을 테이블정보로 매핑한다.) @Id- 엔티티 클래스의 필드를 테이블에 기본키로 매핑한다. (데이터베이스는 엔티티를 구별할때 이 키값으로 구분한다.) @Column- 필드를 컬럼에 매핑한다. 매핑 정보가 없는 필드- @Column을 생략하면 필드명을 사용해서 컬럼명과 매핑하게 된다. 만약 대소문자를 데이터베이스가 구분할 경우에는 꼭 위에 @Column어노테이션을 사용해서 진행해야한다. #Dialect(방언)- 데이터베이스..

    JPA(Java Persistence Api)의 장점과 단점 및 사용해야 하는 이유.

    국내에서는 Mybatis를 사용하지만 대기업과 여러 스타트업에서는 JPA를 사용하고 있는 추세이다. 그리고 세계적으로 JPA 특히 ORM 프레임워크인 하이버네이트 사용률이 더 높다.그래서 더 자세한 부분을 이해하기 위해서 공부를 시작했다. 공부 시작하기전에 왜 JPA가 좋은지 정리해봤다. 생산성- 개발자가 일일히 CRUD용 쿼리를 작성해줘야하던 Mybatis와 같은 Mapper방식은 컬럼이 추가되거나하면 수정해주어야하는 부분이 상당히 많았다. 이로 인해서 자바를 사용하지만 객체중심 개발이 아니라 데이터베이스 흐름으로 개발을 하게되는 문제가 있다. JPA를 사용하게 되면 쿼리를 직적 생성하는 것이 아니고 만들어진 객체로 데이터베이스를 다루기 때문에 객체 중심으로 개발을 진행할 수 있다. 유지보수- SQL을..

    Spring boot hibernate jpa에서 Auditing 사용 - update, create 시간 자동 변경

    엔티티를 만들고 데이터를 삽입하고 조작할 때 create date와 last modified date를 별도로 업데이트 해주면서 관리하였다. 하지만 이번에 JPA를 공부하면서 별도의 작업 없이 JPA의 Auditing 기능을 사용하면 데이터를 삽입하고 수정할 때 자동으로 날짜를 수정하도록 할 수 있는 기능이 있는 것을 확인했다. 1. ConfigurationJPA Auditing을 사용하기 위해서는 기능을 자동으로 활성화 해주는 어노테이션을 붙혀주면 된다. 처음에는 @Configuration을 사용하는 클래스에 함께 선언해주었는데 정상적으로 적용이 되지 않아서 @SpringBootApplication을 사용하는 곳에 적용했더니 성공적으로 적용되었다. 123456789101112131415161718192..