스프링 게시판 - 태그 기능 추가
2023. 6. 18. 17:09ㆍSpring
게시글 작성할 때 태그를 추가할 수 있도록 게시판에 태그 기능을 추가한다.
아래와 같이 테이블을 설계했다.
-> 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;
}
}