해시태그 기능을 구현한 것을 작성
private final HashtagRepository hashtagRepository;
private final KeywordService keywordService;
// 게시판 정보와 키워드 들을 입력받아 관련 내용 저장 또는 수정
public void applyHashtag(Post post, String keywordContentsStr) {
// 기존 해시태그 정보 가져오기
List<Hashtag> oldHashtagList = getHashtags(post);
// 입력받은 키워드 문자열 정리('#' 구별 -> 공백 제거 -> 빈 문자열 제거 -> 리스트 변환)
List<String> keywordContents = Arrays.stream(keywordContentsStr.split("#"))
.map(String::trim)
.filter(s -> s.length() > 0)
.collect(Collectors.toList());
// 삭제할 키워드 정보를 저장하는 리스트 생성
List<Hashtag> needToDelete = new ArrayList<>();
// 새롭게 추가된 키워드 들을 차례대로 저장하는 saveHashtag() 호출
keywordContents.forEach(keywordContent -> {
setHashtag(post, keywordContent);
});
// 삭제할 키워드 정보들을 삭제
needToDelete.forEach(hashtag -> {
hashtagRepository.delete(hashtag);
});
}
// 키워드 저장 후 해시태그 내에 게시판ID와 키워드ID정보가 있다면 바로 리턴, 내용이 없다면 게시판ID와 키워드ID 저장
private Hashtag setHashtag(Post post, String keywordContent) {
// 키워드 저장
Keyword keyword = keywordService.setKeyword(keywordContent);
// 해시태그 내에 게시판ID와 키워드ID가 존재 한다면 바로 리턴
Optional<Hashtag> optHashtag = hashtagRepository.findByPostIdAndKeywordId(post.getId(), keyword.getId());
if (optHashtag.isPresent()) {
return optHashtag.get();
}
// 해시태그 내에 게시판ID와 키워드ID가 존재하지 않으면 관련 내용 저장 후 리턴
Hashtag hashtag = Hashtag.builder()
.post(post)
.keyword(keyword)
.build();
hashtagRepository.save(hashtag);
return hashtag;
}
// 해시태그 정보를 불러오기
public List<Hashtag> getHashtags(Post post) {
return hashtagRepository.findAllByPostId(post.getId());
}
private final KeywordRepository keywordRepository;
// 키워드를 저장하는데 이미 키워드 목록에 있다면 바로 리턴하고, 키워드 목록에 없다면 저장 후 리턴
public Keyword setKeyword(String keywordContent) {
// 이미 있는 키워드는 중복 X, 바로 리턴
Optional<Keyword> optKeyword = keywordRepository.findByContent(keywordContent);
if (optKeyword.isPresent()) {
return optKeyword.get();
}
// 키워드가 없다면 키워드 저장 후 리턴
Keyword keyword = Keyword.builder()
.content(keywordContent)
.build();
keywordRepository.save(keyword);
return keyword;
}