
정말 예쁩니다 재밌습니다 꼭 보세요 선생님들
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String userId;
@Column(nullable = false)
private String password;
@Column(unique = true, nullable = false)
private String nickname;
}
간단한 엔티티로 설정했다. 이번 토이 프로젝트의 목적은 채팅과 Docker, 여러 DB이니까!
유저 간에 서로 친구가 된다면 서로의 친구 목록에 유저들의 정보가 저장되어야한다. 그럼 User 의 테이블에 List<User> 값을 추가할까?
괜히 셀프 참조로 설계했다가 순환 루프에 갇힐까봐서 Friend , Friendship Entity 두가지를 생성했다.
public class Friend { // 친구 요청을 하고 수락을 누르면 해당 행을 삭제하고 서로 유저의 friends List 에 유저 id를 추가해준다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fromNickname;
private String toNickname;
}
여기는 친구 요청을 저장하는 엔티티로 쓰인다.
수락 / 거절 이전의 대기 상태. 어느 것을 눌러도 Friend 엔티티는 삭제한다.
Friendship entity는 유저가 생성되면 모든 유저 테이블에
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinColumn(name = "id")
private Friendship friendship;
위와 같은 값을 추가했다. Friendship 에 User List 를 저장해서 사용한다.
public class Friendship {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userId;
@OneToMany(fetch = FetchType.LAZY)
private List<User> friendList;
public void addFriend(User user) {
this.friendList.add(user);
}
}
수락했을 때 Friendship 엔티티로 두 유저를 서로 추가해준다.
public String acceptFriend(HttpServletRequest request, Long friendId) { // 친구 요청 수락
String token = request.getHeader("Authorization").replace("Bearer ", "");
String userId = jwtTokenProvider.getPayload(token);
User user = userRepository.findByUserId(userId)
.orElseThrow(() -> new UserException(USER_NOT_FOUND));
Friend friend = friendRepository.findById(friendId)
.orElseThrow(() -> new FriendException(REQUEST_NOT_FOUND));
if(!friend.getToNickname().equals(user.getNickname())) {
throw new FriendException(FORBIDDEN_REQUEST);
}
User fromUser = userRepository.findByNickname(friend.getFromNickname())
.orElseThrow(() -> new UserException(USER_NOT_FOUND));
Friendship toUserFriendship = user.getFriendship();
Friendship fromUserFriendship = fromUser.getFriendship();
toUserFriendship.addFriend(fromUser);
fromUserFriendship.addFriend(user);
friendshipRepository.save(toUserFriendship);
friendshipRepository.save(fromUserFriendship);
friendRepository.delete(friend);
return "친구 추가 완료";
}