SpringBoot JPA 예제(결합 인덱스)

 

Springboot JPA 2탄입니다. Springboot나 Spring이나 JPA 적용하는 법은 같아요. 이번에는 PK가 하나가 아닌 2개인 경우의 테이블을 JPA Repository로 구성하는 법을 알아봅니다.

1. 준비

이 포스팅은 SpringBoot JPA 예제에서 파생되었습니다. 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 클래스를 만듭니다. 소스 코드는 아래와 같습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

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 데이터를 확인해 보면 예쁘게 들어가 있는 것을 확인 할 수 있습니다.

[출처] https://jdm.kr/blog/140

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
27 [java][maven] jar 파일 의존성 한번에 다운로드 maven 사용 졸리운_곰 2023.08.24 192
26 Prometheus + Grafana로 Java 애플리케이션 모니터링하기 file 졸리운_곰 2020.12.17 279
25 Blockchain Implementation With Java Code file 졸리운_곰 2019.06.16 338
24 Java 코드로 이해하는 블록체인(Blockchain) 졸리운_곰 2019.06.16 377
23 순수 Java Application 코드로 Restful api 호출 졸리운_곰 2018.10.10 415
22 WebDAV 구현을 위한 환경 설정 file 졸리운_곰 2017.09.24 268
21 [Java] Apache Commons HttpClient로 SSL 통신하기 졸리운_곰 2017.03.27 784
20 JSoup를 이용한 HTML 파싱 졸리운_곰 2017.03.04 320
19 jsoup을 활용해서 Java에서 HTML 파싱하는 방법 정리 file 졸리운_곰 2017.03.04 579
18 NSA의 Dataflow 엔진 Apache NiFi 소개와 설치 file 졸리운_곰 2017.01.23 630
17 wordpress-java-integration 자바와 워드프레스 통합 졸리운_곰 2016.12.30 298
16 Create New Posts in Wordpress using Java and XMLRpc 졸리운_곰 2016.11.14 268
15 자바로 POST 방식으로 통신하기, java httppost 클래스를 활용한 예제 졸리운_곰 2016.11.14 647
14 [Java]아파치 HttpClient사용하기 file 졸리운_곰 2016.11.14 301
13 Building a Search Engine With Nutch Solr And Hadoop file 졸리운_곰 2016.04.21 435
12 Nutch and Hadoop Tutorial file 졸리운_곰 2016.04.21 391
11 Latest step by Step Installation guide for dummies: Nutch 0. file 졸리운_곰 2016.04.21 305
10 Nutch 초간단 빌드와 실행 졸리운_곰 2016.04.21 681
9 Nutch로 알아보는 Crawling 구조 - Joinc 졸리운_곰 2016.04.21 536
8 A tiny bittorrent library Java: 자바로 만든 작은 bittorrent 라이브러리 file 졸리운_곰 2016.04.20 418
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED