관리 메뉴

bright jazz music

[bootBoard] N:1(다대일) 연관관계: 3. 프로젝트 구성 요소 작성(추가) 본문

Framework/Spring

[bootBoard] N:1(다대일) 연관관계: 3. 프로젝트 구성 요소 작성(추가)

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

1. entity 패키지 생성하고 BaseEntity.java 추가하기

  • entity 패키지는 이후 추가할 엔티티 클래스들을 보관하는 용도로 사용한다.
  • BaseEntity는 추후 작성할 엔티티클래스들이 상속(extends) 할 클래스이다.

 

 

package com.example.bootboard.entity;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
@Getter
public class BaseEntity {

    @CreatedDate
    @Column(name = "regDate", updatable = false)
    private LocalDateTime regDate;

    @LastModifiedDate
    @Column(name="moddate")
    private LocalDateTime modDate;

}


/*
* @MappedSuperclass:
* 이 어노테이션이 적용되면 적용되면 테이블로 생성되지 않는다.
* 실제 테이블은 BaseEntity클래스를 상속한 엔티티의 클래스로 DB 테이블이 생성된다.
*
* @CreatedDate:
* JPA에서 엔티티의 생성 시간을 처리한다.
*
* @LastModifiedDate:
* 최종시간을 자동으로 처리하는 용도로 사용된다.
* 칼럼의 속성으로는 insertable, updatable이 있다. 여기서는 updatable=false로 지정했기 때문에
* 해당 엔티티 객체를 DB에 반영할 때 regDate 칼럼은 변경되지 않는다. 생성될 때만 기록되야 하니 당연하다.
*
*
*
 */

 

2. BootBoardApplication.java에 @EnableJpaAuditing 추가하기

 

package com.example.bootboard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing      //AuditingEntityListener 활성화를 위해 추가
public class BootBoardApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootBoardApplication.class, args);
    }

}

 

3. 엔티티 클래스 추가 

  • 연관관계의 설정은 처음부터 설정하는 방식보다 엔티티의 클래스들을 구성한 이후에 각 엔티티 클래스 간의 연관관계를 고려하여 설정하는 것이 수월하다.
  • entity 패키지에 Member(회원), Board(게시물), Reply(댓글) 엔티티 클래스를 추가한다.

 

 

3-1. Member 클래스 작성

  • Member 클래스는 이메일 주소를 PK로 이용한다.
  • DB설계에서도 member 테이블은 PK만을 가지고 있고, FK를 사용하지 않는다.
  • 따라서 별도의 참조가 필요하지 않다.
package com.example.bootboard.entity;

import lombok.*;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Member extends BaseEntity{

    @Id
    private String email;

    private String password;

    private String name;
}

/*
* Member 클래스는 이메일 주소를 PK로 이용한다.
* DB설계에서도 member 테이블은 PK만을 가지고 있고, FK를 사용하지 않는다.
* 따라서 별도의 참조가 필요하지 않다.
*
* */

 

 

3-2. Board 클래스 작성

  • Board클래스는 Member클래스의 email(PK)를 FK로 참조하는 구조이다.
  • 초기의 설정이므로 우선 연관관계를 제외하고 작성한다.
  • 추후 회원과의 연관관계를 고려해서 작성자(writer)에 해당하는 필드는 작성하지 않는다.
package com.example.bootboard.entity;

import lombok.*;

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

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

    private String title;

    private String content;
    
    //Board클래스는 Member클래스의 email(PK)를 FK로 참조하는 구조이다.
    
}

 

3-3. Reply 클래스 작성

  • Reply 클래스는 회원이 아닌 사람도 댓글을 남길 수 있다고 가정하고 Board와의 연관관계를 맺지 않는다.
//Reply.java
package com.example.bootboard.entity;

import lombok.*;

import javax.persistence.*;


@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Reply extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long rno;

    private String text;

    @ManyToOne
    private Board board;
}

 

Comments