Spring User 친구 추가하기

박북velog·2023년 12월 20일
post-thumbnail

정말 예쁩니다 재밌습니다 꼭 보세요 선생님들


User Entity

@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 "친구 추가 완료";
    }
profile
느리지만 끝까지 해보자구

0개의 댓글