web/JPA 12

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

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

web/JPA 2018.11.04 (3)

@MappedSuperclass를 이용한 부모 매핑정보 사용하기

기존에는 부모의 엔티티에 접근해서 정보를 가져와서 사용했다. 하지만 그러면 너무 비용이 크기 때문에 이를 위해서 부모클래스의 매핑정보만 가지고와서 사용할 수 있는 방법이 있다.@MappedSuperClass 어노테이션을 사용하면 부모 엔티티 접근 없이 부모 클래스의 매핑정보를 사용할 수 있다. 예를들어 선생님과 학생을 담당하는 클래스에서 id와 name은 공통 속성이다. 이런 고유 속성을 부여해주는 부모클래스를 만들고 이를 상속받은 Student와 Teacher 클래스를 만들어보자. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/** * springboottest * * @author wedul *..

web/JPA 2018.11.03 (1)

JPA 상속관계 매핑 전략

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

web/JPA 2018.10.31

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..

web/JPA 2018.10.31

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

바로 앞에서 다대일 관계에서 단반향으로써 학생이 반을 접근하는 방식으로 진행했으나 이번에는 반에서 학생들을 접근하는 방식을 사용해보자. 그렇게 되면 학생 -> 반에서 반 -> 학생이 추가되어 결국 반 학생 이런 양방향 연관관계가 형성된다. 하나의 반에는 여러 학생이 포함되어 있다. 그렇기 때문에 반 클래스에 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 ..

web/JPA 2018.10.26

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

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

web/JPA 2018.10.23

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..

web/JPA 2018.10.13

JPA 매핑 어노테이션 - DDL

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

web/JPA 2018.10.12

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

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

web/JPA 2018.10.11