관리 메뉴

bright jazz music

[bootBoard] N:1(다대일) 연관관계: 4. @ManyToOne 어노테이션 추가 본문

Framework/Spring

[bootBoard] N:1(다대일) 연관관계: 4. @ManyToOne 어노테이션 추가

bright jazz music 2022. 7. 26. 22:34

1. @ManyToOne 어노테이션

  • DB구조로 보면 앞으로 생성될 board 테이블과 member테이블에는 FK를 이용한 참조가 걸려있게 된다.
  • member 테이블의 email을 board에서 FK로 참조하는 구조이다.

  • JPA에서 관계를 고민할 때는 FK쪽을 먼저 해석해 보면 편리하다. 따라서 FK를 사용하는 board 먼저 살펴본다.
  • board와 member는 N:1(다대일)의 관계가 된다. 따라서 이를 의미하는 @ManyToOne을 적용해야 한다.

 

  • @ManyToOne은 DB상에서 외래키의 관계로 연결된 엔티티 클래스에 설정한다.
  • Board클래스는 작성자가 Member엔티티를 의미하므로 아래와 같이 FK를 참조하는 부분을 추가한다.

 

1-1. Board 클래스의 변경(Member writer 작성)

//Board.java

package com.example.bootboard.entity;

import lombok.*;

import javax.persistence.*;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Board extends BaseEntity{
    @Id
    @GeneratedValue
    private Long bno;

    private String title;

    private String content;
    
    @ManyToOne
    private Member writer; //FK 연관관계 지정
    
    //Board클래스는 Member클래스의 email(PK)를 FK로 참조하는 구조이다.

}

 

 

1-2. Reply 클래스의 변경(Board board 작성)

 

//Reply.java
package com.example.bootboard.entity;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

public class Reply extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long rno;

    private String text;
    
    @ManyToOne
    private Board board; //연관관계 지정
}

 

 

 

2. 프로젝트 실행 (DDL 실행 ==> 테이블 생성)

  • 위와 같이 설정을 완료한 뒤에 프로젝트를 실행하면 아래와 같은 DDL(Data Definition Language)이 실행된다(콘솔확인)
Hibernate: 
    
    create table board (
       bno bigint not null,
        moddate datetime(6),
        reg_date datetime(6),
        content varchar(255),
        title varchar(255),
        writer_email varchar(255),
        primary key (bno)
    ) engine=InnoDB
Hibernate: 
    
    create table member (
       email varchar(255) not null,
        moddate datetime(6),
        reg_date datetime(6),
        name varchar(255),
        password varchar(255),
        primary key (email)
    ) engine=InnoDB
Hibernate: 
    
    create table reply (
       rno bigint not null auto_increment,
        moddate datetime(6),
        reg_date datetime(6),
        text varchar(255),
        board_bno bigint,
        primary key (rno)
    ) engine=InnoDB
Hibernate: 
    
    alter table board 
       add constraint FK1iu8rhoim4thb0y12cpt01oiu 
       foreign key (writer_email) 
       references member (email)
Hibernate: 
    
    alter table reply 
       add constraint FKr1bmblqir7dalmh47ngwo7mcs 
       foreign key (board_bno) 
       references board (bno)

 

 

member, board, reply가 생성되었음.

 

엔티티 관계도 구성

 

 

3. Repository 인터페이스 추가

  • 테이블이 정상적으로 생성되었다,
  • 각 엔티티에 맞는 Repository 인터페이스를 추가한다.
  • 프로젝트에 repository 패키지를 생성하고 추가한다.

인터페이스로 성생성한 뒤 JpaRepository 클래스 상속

3-1. MemberRepository 작성

//MemberRepository.java

package com.example.bootboard.repository;

import com.example.bootboard.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, String> {
    
}

 

 

 

3-2. BoardRepository 작성

//BoardRepository.java

package com.example.bootboard.repository;

import com.example.bootboard.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
    
}

 

 

 

3-3. ReplyRepository 작성

//ReplyRepository.java

package com.example.bootboard.repository;

import com.example.bootboard.entity.Reply;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ReplyRepository extends JpaRepository<Reply, Long> {
    
}

 

 

 

 

Comments