스프링 게시판 - 태그 기능 추가

2023. 6. 18. 17:09Spring

게시글 작성할 때 태그를 추가할 수 있도록 게시판에 태그 기능을 추가한다.

아래와 같이 테이블을 설계했다.

-> Freeboard와 FeedbackBoard는 게시판이다.

-> 게시판에는 여러 개의 태그가 들어갈 수 있고, 태그는 여러 개의 게시판에 들어갈 수 있기 때문에 게시판 테이블과 태그 테이블 사이에 TagTo~Board라는 테이블을 추가하여 게시판과 태그 테이블 사이에서 1:N N:1 연관관계 매핑을 하도록 설계하였다.

-> 중간 테이블(TagToFreeBoard, TagToFeedbackBoard)이 게시판 마다 존재한다. 사실 중간 테이블은 게시판 테이블과 태그 테이블 사이에 하나만 있어도 되지만, 중간 테이블을 하나로 사용하게 되면 테스트할 때 여러 게시판의 데이터가 중간 테이블에 들어가서 데이터를 식별하기가 어려워서 단순하게 게시판 마다 하나의 중간 테이블을 추가하였다.

 

-> Freeboard.java(게시판 엔티티 클래스)

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FreeBoard extends Auditable implements Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long freeBoardId;

    @Column(nullable = false)
    private String title; // 게시글 제목

    @Column(nullable = false, columnDefinition = "TEXT")
    private String content; // 게시글 내용

    @Column
    private long commentCount; // 댓글수

    @Column
    private long maxCommentCount; //삭제된 댓글까지 포함된 댓글 수

    @Column
    private long likeCount; // 좋아요수

    @Column
    private long viewCount; // 조회수

    @CreatedDate
    @Column(updatable = false, name = "CREATED_AT")
    private LocalDateTime createdAt = LocalDateTime.now();

    @LastModifiedDate
    @Column(name = "MODIFIED_AT")
    private LocalDateTime modifiedAt = LocalDateTime.now();

    ...

	// FreeBoard - TagToFreeBoard 일대다 매핑
    @OneToMany(mappedBy = "freeBoard", cascade = CascadeType.REMOVE)
    @JsonBackReference
    private List<TagToFreeBoard> tagBoards = new ArrayList<>();
	
    ...
}

 

-> Tag.java(태그 엔티티 클래스)

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Tag {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long tagId;

    @Column
    private String tagName; // 태그

	// Tag - TagToFreeBoard 일대다 매핑
    @OneToMany(mappedBy = "tag")
    private List<TagToFreeBoard> tagBoardList = new ArrayList<>(); 


    public Tag(String tagName) {
        this.tagName = tagName;
        this.tagBoardList = new ArrayList<>();
    }
}

 

-> TagToFreeBoard

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TagToFreeBoard { // 자유 게시판 - 태그 매핑 테이블
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long tagToFreeBoardId;

    @ManyToOne
    @JoinColumn(name = "FREEBOARD_ID")
    private FreeBoard freeBoard;

    @ManyToOne
    @JoinColumn(name = "TAG_ID")
    private Tag tag;

    public TagToFreeBoard(FreeBoard freeBoard, Tag tag) {
        this.freeBoard = freeBoard;
        this.tag = tag;
    }
}