SpringBoot JPA 예제(@ManyToOne, 단방향)

@ManyToOne 어노테이션을 이용한 단방향 JPA 관계 예제입니다.

1. 준비

이 포스트는 SpringBoot JPA 예제(@OneToMany, 단방향)에서 파생 되었습니다. 예제 코드도 링크를 클릭해서 확인 해보시면 됩니다.

2. @ManyToOne

@ManyToOne 어노테이션은 @OneToMany와 크게 다르지 않습니다. 다만 @OneToMany가 1:N이라고 한다면 @ManyToOne은 N:1 관계라고 보면 됩니다. 예를 들머 회원과 핸드폰의 관계에서 핸드폰을 보면 됩니다. 핸드폰은 자신을 소유한 회원이 있습니다. 하지만 이 회원은 핸드폰을 여러개 소지할 수도 있고 하나만 소지할 수도 있겠죠. 회원쪽에서 핸드폰을 바라본다면 @OneToMany 관계지만 핸드폰이 회원을 바라본다면 @ManyToOne이 되는겁니다.

2.1. @ManyToOne 속성

@ManyToOne 속성에는 다음과 같은 것들이 있습니다.

  • targetEntity
  • cascade
  • fetch
  • optional

@OneToMany에서 못보던 optional이라는 항목이 있네요.

2.1.1. optional

이 항목은 false로 설정했을 때 해당 객체에 null이 들어갈 수 있습니다. 반대로 반드시 값이 필요하다면 true가 들어갑니다. 기본값은 true입니다.

2.2. 단방향 @ManyToOne 예제

단방향 @ManyToOne 예제를 진행합니다.

2.2.1. Table

테이블은 아래처럼 구성 되어있습니다. MariaDB입니다.

CREATE TABLE `member` (
	`seq` INT(10) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`seq`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
CREATE TABLE `phone` (
	`seq` INT(10) NOT NULL AUTO_INCREMENT,
	`member_id` INT(10) NULL DEFAULT NULL,
	`no` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`seq`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

2.2.2. Entity

회원 Entity 및 핸드폰 Entity를 만듭니다.

2.2.2.1. Member Entity
package jpa3;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Member {

	@Id
	@Column(name="seq")
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int seq;

	@Column(name="name")
	private String name;

	public Member(){}

	public Member(String name){
		this.name = name;
	}

	public int getSeq() {
		return seq;
	}

	public void setSeq(int id) {
		this.seq = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		String result = "[member_"+seq+"] " + name;
		return result;
	}
}

회원 Entity는 그다지 특별한 것은 없습니다. 일반적인 Entity 구성을 따릅니다.

2.2.2.2. Phone Entity
 
  1. package jpa3;
  2.  
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.FetchType;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.GenerationType;
  8. import javax.persistence.Id;
  9. import javax.persistence.JoinColumn;
  10. import javax.persistence.ManyToOne;
  11.  
  12. @Entity
  13. public class Phone {
  14.  
  15. @Id
  16. @Column(name="seq")
  17. @GeneratedValue(strategy=GenerationType.AUTO)
  18. private int seq;
  19.  
  20. @Column(name="no")
  21. private String no;
  22.  
  23. @ManyToOne(targetEntity=Member.class, fetch=FetchType.LAZY)
  24. @JoinColumn(name="member_id")
  25. private Member member;
  26.  
  27. public Phone() {}
  28. public Phone(String no){
  29. this.no = no;
  30. }
  31.  
  32. public int getSeq() {
  33. return seq;
  34. }
  35.  
  36. public void setSeq(int seq) {
  37. this.seq = seq;
  38. }
  39.  
  40. public String getNo() {
  41. return no;
  42. }
  43.  
  44. public void setNo(String no) {
  45. this.no = no;
  46. }
  47.  
  48. public Member getMember() {
  49. return member;
  50. }
  51.  
  52. public void setMember(Member member) {
  53. this.member = member;
  54. }
  55.  
  56. @Override
  57. public String toString() {
  58. String result = "[phone_"+seq+"] " + no;
  59. return result;
  60. }
  61.  
  62. }

23번째 라인에 @ManyToOne 어노테이션이 붙어 있습니다. 여기에서 관계를 설정할 매핑 정보를 넣습니다. 이 포스트에서는 LAZY 전략을 사용합니다. 그리고 Member Entity를 사용한다고 명시적으로 정의를 했습니다. 24번째 라인에 @JoinColumn 어노테이션이 있는데 여기에 현재 Entity에서 관계할 Entity에 매핑할 키 값을 정의합니다. 즉, phone 테이블의 member_id 컬럼이 member 테이블 seq로 정의 됩니다. member entity에서 seq가 @Id 어노테이션으로 정의가 되어 있음을 살펴보세요.

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

2.2.3. Repository

Repository는 간단하게 코드만 보고 넘어가겠습니다.

package jpa3;

import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Integer>{}
package jpa3;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PhoneRepository extends JpaRepository<Phone, Integer> {}

2.3. Application

실제로 위의 코드를 돌려보는 프로그램을 작성합니다.

 
  1. package jpa3;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.transaction.Transactional;
  6.  
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.CommandLineRunner;
  9. import org.springframework.boot.SpringApplication;
  10. import org.springframework.boot.autoconfigure.SpringBootApplication;
  11.  
  12. @SpringBootApplication
  13. public class Jpa3Application implements CommandLineRunner{
  14.  
  15. @Autowired
  16. private MemberRepository mr;
  17.  
  18. @Autowired
  19. private PhoneRepository pr;
  20.  
  21. public static void main(String[] args) {
  22. SpringApplication.run(Jpa3Application.class, args);
  23. }
  24.  
  25. @Override
  26. @Transactional
  27. public void run(String... args) throws Exception {
  28.  
  29. Member first = new Member("Jung");
  30. Member second = new Member("Dong");
  31. Member third = new Member("Min");
  32.  
  33. mr.save(first);
  34. mr.save(second);
  35. mr.save(third);
  36.  
  37. Phone p = new Phone("010-XXXX-YYYY");
  38. p.setMember(first);
  39. pr.save(p);
  40.  
  41. List<Phone> phone = pr.findAll();
  42.  
  43. for( Phone e : phone ){
  44. System.out.println(e.toString() +" "+ e.getMember().toString());
  45. }
  46.  
  47. mr.deleteAll();
  48. pr.deleteAll();
  49. }
  50. }
[phone_111] 010-XXXX-YYYY [member_155] Jung

29~36번째 라인은 새로운 회원을 생성합니다. 그리고 33~35번째 라인에서 해당 정보를 DB에 저장합니다. 37~39번째 라인에서 새로운 핸드폰 하나를 만들고 한 회원의 소유로 정의하고 저장합니다. 41 ~ 45번째 라인에서는 핸드폰의 전체 목록을 가져와서 하나씩 자신의 정보와 소유주를 출력합니다.

2.3.1. 참조

지난 번 포스팅과는 다르게 이번엔 LAZY 전략을 사용하면서 @Transactional 어노테이션 정의를 이용했습니다.

3. 마무리

@ManyToOne 단방향 예제에 대해 알아봤습니다. 다음번엔 1:N 양방향 관계에 대해 알아보아요. :)

 

[출처] http://jdm.kr/blog/142

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED