board를 1차 캐시에 먼저 저장을 한 후 tag 처리 로직을 수행하도록 변경하였다.
// JPA에서 관계를 맺고 있는 엔티티의 영속성 처리 문제를 위해
// 먼저 board를 1차 캐시에 save를 보냄
boardRepository.save(board);
boardRequestDto.setHashtags(boardRequestDto.getHashtags());
for(String hashTag : boardRequestDto.getHashtags()){
String hashTagString = hashTag.substring(1);
HashTag existHashTag = hashTagRepository.findByHashTag(hashTagString);
if(existHashTag != null){
Tag_Board tag_board = new Tag_Board(existHashTag, board);
tag_boardRepository.save(tag_board);
}else {
HashTag hashTagTable = new HashTag(hashTagString);
hashTagRepository.save(hashTagTable);
Tag_Board tag_board = new Tag_Board(hashTagTable, board);
tag_boardRepository.save(tag_board);
}
}
초기 셀프 참조
@ManyToOne
@JoinColumn
private User userFollowing = this;
@ManyToOne
@JoinColumn
private User userFollower = this;
@OneToMany(mappedBy = "userFollowing")
private List<User> followingList = new ArrayList<User>();
@OneToMany(mappedBy = "userFollower")
private List<User> followerList = new ArrayList<User>();
public void addFollowing(User following) {
this.followingList.add(following);
if(!following.getFollowerList().contains(this)) {
following.getFollowerList().add(this);
}
//연관관계의 주인을 통한 확인
if(!following.getUserFollower().getFollowerList().contains(this)) {
following.getUserFollower().getFollowerList().add(this);
}
}
public void addFollower(User follower) {
this.followerList.add(follower);
if(follower.getFollowingList().contains(this)) {
follower.getFollowingList().add(this);
}
//연관관계의 주인을 통한 확인
if(!follower.getUserFollowing().getFollowingList().contains(this)) {
follower.getUserFollowing().getFollowingList().add(this);
}
}
수정 코드
@Entity
@Getter
@NoArgsConstructor
public class Follow {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FOLLOWING_ID", referencedColumnName = "id")
private Member memberFollowing;
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
@JoinColumn(name = "FOLLOWER_ID", referencedColumnName = "id")
private Member memberFollower;
public Follow(Member memberFollowing, Member memberFollower) {
this.memberFollowing = memberFollowing;
this.memberFollower = memberFollower;
}
}
//Member Entity
@Builder.Default
@OneToMany(mappedBy = "memberFollowing", cascade = CascadeType.REMOVE)
private List<Follow> followingList = new ArrayList<>();
@Builder.Default
@OneToMany(mappedBy = "memberFollower", cascade = CascadeType.REMOVE)
private List<Follow> followerList = new ArrayList<>();
//serivce Logic
@Transactional
public ResponseEntity<ResponseMsgDto<Void>> follow(String nickName,
Member member) {
Member followMember = memberRepository.findByNickName(nickName)
.orElseThrow(
() -> new CustomException(ErrorCode.NOT_FOUND_USER));
Follow follow = new Follow(member, followMember);
Follow existFollow = followRepository.existFollow(member.getNickName(),
followMember.getNickName());
if (existFollow != null) {
followRepository.delete(existFollow);
return ResponseEntity.ok(ResponseMsgDto.setSuccess(HttpStatus.OK.
value(), "팔로우 취소", null));
} else {
followRepository.save(follow);
}
return ResponseEntity.ok(ResponseMsgDto.setSuccess(HttpStatus.OK.
value(), "팔로우 등록", null));
}
정보 감사합니다.