[Spring Boot] JPA 복합키 조인 및 식별자 클래스 - @ManyToOne, @IdClass

[Spring Boot] JPA 복합키 조인 및 식별자 클래스 - @ManyToOne, @IdClass

반응형

문제점 : 게시판 프로젝트를 진행 중에 로그인과 게시판 기능을 일부 완성하고 연결하려하니 JPA 관련 오류가 발생했다.

이유는 Entity객체에 JPA 사용을 위한 복합키 처리와 조인 처리를 안했던 것이었다.

해결 : 데이터베이스 설계를 다음 링크와 같이 바꾸었다. https://black-mint.tistory.com/21

그 후 기존 Entity클래스(Member, Board)에 @IdClass 어노테이션을 적용하기 위해 [Member, MemberID, Board] 3개의 클래스로 만들었다.

@Data @Entity @DynamicUpdate @DynamicInsert @Table(name = "tb_userinfo") @IdClass(MemberID.class) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Id @NotNull(message = "username을 입력하세요.") @Size(min = 1, max = 20, message = "username은 1자 이상 20자 이하입니다.") private String username; @NotNull(message = "암호를 입력하세요.") @Size(min = 6, max = 100, message = "암호는 6자 이상 100자 이하 입니다.") private String password; @NotNull @Size(min = 6, max = 45, message = "이메일은 6자 이상 45자 이하 입니다.") @Email private String email; @Column private String role; }

@Data : lombok을 설치해야 사용 가능. Getter/Setter 등 자동 생성

@IdClass(식별자 클래스) : 식별자 클래스 지정 (복합키를 넣을 클래스)

@Data @AllArgsConstructor @NoArgsConstructor public class MemberID implements Serializable { @Column(name = "id") private long id; @Column(name = "username") private String username; }

식별자 클래스는 public 이어야 하며, Serializable 인터페이스를 구현해야 한다. 또한, 기본 생성자 필수!

Entity객체와 필드명 같게 작성

@Data : 식별자 클래스는 equals(), hashCode()를 필수적으로 작성해줘야 한다. 이를 자동 생성

@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 생성

@NoArgsConstructor : 파라미터가 없는 생성자 생성

@Entity @Data @Table(name = "tb_board") public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @Size(min = 2, max = 30, message = "제목은 2자 이상 30자 이하입니다.") private String title; @NotNull @Size(min = 1, message = "내용을 입력하세요.") private String content; @ManyToOne(targetEntity = Member.class, fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "writer", referencedColumnName = "username"), @JoinColumn(name = "writer_id", referencedColumnName = "id") }) private Member member; private String image; }

게시판 - 사람 이기때문에 ManyToOne으로 구현. (여러 관계가 있으나, 주인 쪽이 FK를 관리하도록 설계하는 것이 좋다고 한다.)

@ManyToOne : 게시판 - 사람 관계이므로 @ManyToOne을 사용

@JoinColumns : 복합키 일 때 사용

@JoinColumn : 그림과 같이 참조하는 필드명과 참조받는 필드명을 작성

from http://black-mint.tistory.com/22 by ccl(A) rewrite - 2021-12-19 00:01:50