diff --git a/src/main/java/com/milk/milkweb/entity/Board.java b/src/main/java/com/milk/milkweb/entity/Board.java index 6a3cffc..0f3b4d5 100644 --- a/src/main/java/com/milk/milkweb/entity/Board.java +++ b/src/main/java/com/milk/milkweb/entity/Board.java @@ -9,7 +9,9 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Entity @@ -43,6 +45,9 @@ public class Board { @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private final List comments = new ArrayList<>(); + @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) + private final Set tags = new HashSet<>(); + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; diff --git a/src/main/java/com/milk/milkweb/entity/BoardHashTag.java b/src/main/java/com/milk/milkweb/entity/BoardHashTag.java new file mode 100644 index 0000000..6c48225 --- /dev/null +++ b/src/main/java/com/milk/milkweb/entity/BoardHashTag.java @@ -0,0 +1,35 @@ +package com.milk.milkweb.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "board_hash_tag") +@Getter @Builder +@AllArgsConstructor @NoArgsConstructor +public class BoardHashTag { + + @Id + @Column(name = "b_hash_tag_id") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id") + private Board board; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "hash_tag_id") + private HashTag hashTag; + + public static BoardHashTag of(Board board, HashTag tag) { + return BoardHashTag.builder() + .board(board) + .hashTag(tag) + .build(); + } + +} diff --git a/src/main/java/com/milk/milkweb/entity/HashTag.java b/src/main/java/com/milk/milkweb/entity/HashTag.java new file mode 100644 index 0000000..b8604a8 --- /dev/null +++ b/src/main/java/com/milk/milkweb/entity/HashTag.java @@ -0,0 +1,29 @@ +package com.milk.milkweb.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "hash_tag") +@Getter @Builder +@AllArgsConstructor @NoArgsConstructor +public class HashTag { + + @Id + @Column(name = "hash_tag_id") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false, unique = true) + private String tag; + + public static HashTag of (String tag) { + return HashTag.builder() + .tag(tag) + .build(); + } + +} diff --git a/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java b/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java new file mode 100644 index 0000000..c3565bc --- /dev/null +++ b/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java @@ -0,0 +1,11 @@ +package com.milk.milkweb.repository; + +import com.milk.milkweb.entity.BoardHashTag; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface BoardHashTagRepository extends JpaRepository { + + List findAllByBoardId(Long boardId); +} diff --git a/src/main/java/com/milk/milkweb/repository/HashTagRepository.java b/src/main/java/com/milk/milkweb/repository/HashTagRepository.java new file mode 100644 index 0000000..bfbe7a9 --- /dev/null +++ b/src/main/java/com/milk/milkweb/repository/HashTagRepository.java @@ -0,0 +1,14 @@ +package com.milk.milkweb.repository; + +import com.milk.milkweb.entity.HashTag; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface HashTagRepository extends JpaRepository { + + Boolean existsByTag(String tag); + + Optional findByTag(String tag); + +} diff --git a/src/main/java/com/milk/milkweb/service/HashTagService.java b/src/main/java/com/milk/milkweb/service/HashTagService.java new file mode 100644 index 0000000..4064b1a --- /dev/null +++ b/src/main/java/com/milk/milkweb/service/HashTagService.java @@ -0,0 +1,64 @@ +package com.milk.milkweb.service; + + +import com.milk.milkweb.entity.Board; +import com.milk.milkweb.entity.BoardHashTag; +import com.milk.milkweb.entity.HashTag; +import com.milk.milkweb.repository.BoardHashTagRepository; +import com.milk.milkweb.repository.HashTagRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +@Slf4j +public class HashTagService { + + private final HashTagRepository hashTagRepository; + private final BoardHashTagRepository boardHashTagRepository; + + + public void saveHashTag(Set dtoTags, Board board) { + if (dtoTags.isEmpty()) return; + + List hashTags = dtoTags.stream() + .filter(s -> !hashTagRepository.existsByTag(s)) + .map(HashTag::of) + .toList(); + log.info("saveHashTag -> hashTagRepository.saveAll"); + hashTagRepository.saveAll(hashTags); + + List boardHashTags = dtoTags.stream() + .map(hashTagRepository::findByTag) + .filter(Optional::isPresent) + .map(Optional::get) + .map(tag -> BoardHashTag.of(board, tag)) + .toList(); + log.info("saveHashTag -> boardHashTagRepository.saveAll"); + boardHashTagRepository.saveAll(boardHashTags); + } + + + @Transactional(readOnly = true) + public Set readHashTag(Long boardId) { + return boardHashTagRepository.findAllByBoardId(boardId).stream() + .map(boardHashTag -> boardHashTag.getHashTag().getTag()) + .collect(Collectors.toSet()); + } + + public void DeleteBoardTag(Long boardId, Set dtoTags) { + List boardHashTags = boardHashTagRepository.findAllByBoardId(boardId); + + List deleteBoardTags = boardHashTags.stream() + .filter(t -> !dtoTags.contains(t.getHashTag().getTag())) + .toList(); + boardHashTagRepository.deleteAll(deleteBoardTags); + + } +}