From f4b8204caedbdd594a2488d22a61b7cfcc59c96b Mon Sep 17 00:00:00 2001 From: KwonYH Date: Mon, 11 Dec 2023 00:38:02 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20HashTag=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20&=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20-=20BoardHashTag=EB=8F=84=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/milk/milkweb/entity/Board.java | 5 ++++ .../com/milk/milkweb/entity/BoardHashTag.java | 28 +++++++++++++++++++ .../java/com/milk/milkweb/entity/HashTag.java | 23 +++++++++++++++ .../repository/BoardHashTagRepository.java | 7 +++++ 4 files changed, 63 insertions(+) create mode 100644 src/main/java/com/milk/milkweb/entity/BoardHashTag.java create mode 100644 src/main/java/com/milk/milkweb/entity/HashTag.java create mode 100644 src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java 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..64028f7 --- /dev/null +++ b/src/main/java/com/milk/milkweb/entity/BoardHashTag.java @@ -0,0 +1,28 @@ +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; + +} 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..5ba57d6 --- /dev/null +++ b/src/main/java/com/milk/milkweb/entity/HashTag.java @@ -0,0 +1,23 @@ +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; + +} 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..605673f --- /dev/null +++ b/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java @@ -0,0 +1,7 @@ +package com.milk.milkweb.repository; + +import com.milk.milkweb.entity.BoardHashTag; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BoardHashTagRepository extends JpaRepository { +} From 56d44ee1641d4af683b47c0ad73e02613501937a Mon Sep 17 00:00:00 2001 From: KwonYH Date: Tue, 12 Dec 2023 01:13:25 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20HashTagRepository=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/milk/milkweb/repository/HashTagRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/milk/milkweb/repository/HashTagRepository.java 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..9ab573d --- /dev/null +++ b/src/main/java/com/milk/milkweb/repository/HashTagRepository.java @@ -0,0 +1,7 @@ +package com.milk.milkweb.repository; + +import com.milk.milkweb.entity.HashTag; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HashTagRepository extends JpaRepository { +} From b420c0592bfc7ec56f62097092b13d8ebbc94207 Mon Sep 17 00:00:00 2001 From: KwonYH Date: Wed, 13 Dec 2023 00:20:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20HashTagService=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20-=20=EA=B0=81=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/milk/milkweb/entity/BoardHashTag.java | 7 +++ .../java/com/milk/milkweb/entity/HashTag.java | 6 +++ .../milkweb/repository/HashTagRepository.java | 7 +++ .../milk/milkweb/service/HashTagService.java | 45 +++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 src/main/java/com/milk/milkweb/service/HashTagService.java diff --git a/src/main/java/com/milk/milkweb/entity/BoardHashTag.java b/src/main/java/com/milk/milkweb/entity/BoardHashTag.java index 64028f7..6c48225 100644 --- a/src/main/java/com/milk/milkweb/entity/BoardHashTag.java +++ b/src/main/java/com/milk/milkweb/entity/BoardHashTag.java @@ -25,4 +25,11 @@ public class BoardHashTag { @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 index 5ba57d6..b8604a8 100644 --- a/src/main/java/com/milk/milkweb/entity/HashTag.java +++ b/src/main/java/com/milk/milkweb/entity/HashTag.java @@ -20,4 +20,10 @@ public class HashTag { @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/HashTagRepository.java b/src/main/java/com/milk/milkweb/repository/HashTagRepository.java index 9ab573d..bfbe7a9 100644 --- a/src/main/java/com/milk/milkweb/repository/HashTagRepository.java +++ b/src/main/java/com/milk/milkweb/repository/HashTagRepository.java @@ -3,5 +3,12 @@ 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..72747bc --- /dev/null +++ b/src/main/java/com/milk/milkweb/service/HashTagService.java @@ -0,0 +1,45 @@ +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.*; + +@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(); + hashTagRepository.saveAll(hashTags); + + List boardHashTags = dtoTags.stream() + .map(hashTagRepository::findByTag) + .filter(Optional::isPresent) + .map(Optional::get) + .map(tag -> BoardHashTag.of(board, tag)) + .toList(); + boardHashTagRepository.saveAll(boardHashTags); + } + + +} From e1ff6ae221942634527cd321dc5b4976767fab74 Mon Sep 17 00:00:00 2001 From: KwonYH Date: Thu, 14 Dec 2023 00:26:34 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20HashTagService=20readHashTag=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20BoardHashTagRepository=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../milk/milkweb/repository/BoardHashTagRepository.java | 4 ++++ .../java/com/milk/milkweb/service/HashTagService.java | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java b/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java index 605673f..c3565bc 100644 --- a/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java +++ b/src/main/java/com/milk/milkweb/repository/BoardHashTagRepository.java @@ -3,5 +3,9 @@ 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/service/HashTagService.java b/src/main/java/com/milk/milkweb/service/HashTagService.java index 72747bc..afcc45d 100644 --- a/src/main/java/com/milk/milkweb/service/HashTagService.java +++ b/src/main/java/com/milk/milkweb/service/HashTagService.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; @Service @Transactional @@ -30,6 +31,7 @@ public void saveHashTag(Set dtoTags, Board board) { .filter(s -> !hashTagRepository.existsByTag(s)) .map(HashTag::of) .toList(); + log.info("saveHashTag -> hashTagRepository.saveAll"); hashTagRepository.saveAll(hashTags); List boardHashTags = dtoTags.stream() @@ -38,8 +40,15 @@ public void saveHashTag(Set dtoTags, Board board) { .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()); + } } From e0710dd60e33e445a3030263f89f0a895bcc3b2b Mon Sep 17 00:00:00 2001 From: KwonYH Date: Sun, 17 Dec 2023 00:55:21 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20HashTagService=20Delete=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/milk/milkweb/service/HashTagService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/milk/milkweb/service/HashTagService.java b/src/main/java/com/milk/milkweb/service/HashTagService.java index afcc45d..4064b1a 100644 --- a/src/main/java/com/milk/milkweb/service/HashTagService.java +++ b/src/main/java/com/milk/milkweb/service/HashTagService.java @@ -51,4 +51,14 @@ public Set readHashTag(Long boardId) { .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); + + } }