관리 메뉴

nalaolla

SpringBoot JPA 예제(결합 인덱스) 본문

JPA

SpringBoot JPA 예제(결합 인덱스)

날아올라↗↗ 2020. 2. 12. 15:06
728x90

JPA Repository 구성하는 법을 알아봅니다.

1. 준비

JPA 대해 기본적인 사용 방법을 설명해 놓았습니다.

또한 이번 포스팅에서 사용하는 DB MariaDB입니다.

2. 예제

실제 소스 코드를 하나씩 구성해 보면서 알아가 봅시다.

2.1. DB Table

CREATE TABLE `member` (

               `id` INT(10) NULL,

               `name` VARCHAR(50) NULL,

               `age` INT NULL,

               PRIMARY KEY (`id`, `name`)

)

COLLATE='utf8_general_ci'

ENGINE=InnoDB;

MariaDB 위와 같은 member 테이블을 구축합니다. 테이블은 id, name, age 컬럼으로 가지고 있으며 id name 묶어서 결합 인덱스(PK) 가집니다. 이제 테이블을 자바 JPA Entity 바꿔봅시다.

2.2. EntityPK

먼저 결합 인덱스를 표현할 클래스를 하나 만듭니다. 클래스 이름은 MemberPK입니다. 소스 코드는 아래와 같습니다.

package jpa2;

 

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Embeddable;

 

@Embeddable

public class MemberPK implements Serializable {

 

               private static final long serialVersionUID = 1L;

 

               @Column(name="id", nullable=false)

               private Long id;

              

               @Column(name="name", nullable=false)

               private String name;

              

               public MemberPK(){}

              

               public MemberPK(long id, String name) {

                               super();

                               this.id = id;

                               this.name = name;

               }

}

여기서 @Embeddable 어노테이션을 정의해야 합니다. 그리고 내부 멤버 변수로는 결합할 컬럼들을 넣어줍니다. 그리고 "기본 생성자" 넣어주세요.

2.3. Entity

그리고 MemberPK 가진 Member Entity 클래스를 만듭니다. 소스 코드는 아래와 같습니다.

package jpa2;

 

import javax.persistence.Column;

import javax.persistence.EmbeddedId;

import javax.persistence.Entity;

 

@Entity

public class Member {

 

               @EmbeddedId

               private MemberPK pk;

 

               @Column

               private int age;

 

               public Member() {}

 

               public Member(MemberPK pk, int age) {

                               this.pk = pk;

                               this.age = age;

               }

 

               public MemberPK getPk() {

                               return pk;

               }

 

               public void setPk(MemberPK pk) {

                               this.pk = pk;

               }

 

               public int getAge() {

                               return age;

               }

 

               public void setAge(int age) {

                               this.age = age;

               }

}

여기서 결합 인덱스와 age 컬럼을 가지는 Member Entity 만들었습니다. 하지만 별도로 id, name 컬럼을 넣으면 컬럼이 반복되었다는 오류가 나오니 넣지 않습니다. 결합 인덱스를 나타내기 위해 일반 @Id 어노테이션이 아닌 @EmbeddedId 어노테이션을 선언합니다.

2.4. Repository

마지막으로 Member Repository 인터페이스를 만듭니다. 소스 코드는 아래와 같습니다.

package jpa2;

 

import org.springframework.data.repository.CrudRepository;

 

public interface MemberRepository extends CrudRepository<Member, MemberPK> {

}

CrudRepository 상속 받았지만 JpaRepository 상속 받아도 됩니다. Repository 차이점은 JpaRepository CrudRepository PagingAndSortingRepository 포함하고 있습니다. 따라서 일반적인 CRUD 기능만 사용한다면 CrudRepository 상속받고 기능이 필요하면 JpaRepository 상속 받으세요.

한번 정리하면 아래처럼 되어 있습니다.

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID>

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID>

public interface Repository<T, ID extends Serializable>

2.5. 실행

스프링 부트 어플리케이션이니 실행시키기 위해 아래와 같은 소스 코드를 짰습니다.

package jpa2;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.CommandLineRunner;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

 

@SpringBootApplication

public class Jpa2Application implements CommandLineRunner {

              

               @Autowired

               MemberRepository memberRepository;

 

               public static void main(String[] args) {

                               SpringApplication.run(Jpa2Application.class, args);

               }

 

               @Override

               public void run(String... args) throws Exception {

                               memberRepository.save(new Member(new MemberPK(1, "Jung"), 25));

               }

}

소스 코드는 결합 인덱스키를 가진 Member 테이블에 새로운 Row 삽입하는 예제입니다. 프로그램을 실행 시키고 DB 데이터를 확인해 보면 예쁘게 들어가 있는 것을 확인 있습니다.

 

728x90