🧐 오늘은 친구요청, 친구목록, 요청목록 등 친구에 관한 코드를 구현해봤다.
가장 고민을 많이 했던 것은 친구 요청이다. DB에서는 친구 신청, 친구 테이블을 따로 둬서 친구를 신청하면 request 테이블에 추가되고 친구를 받아주면 friend 테이블로 옮겨간다.

하지만 신청 테이블과 친구 테이블이 서로 공유하는 fk는 따로 없어 구분을 어떤걸로 지어야할지 고민됐다.
예를 들어 1번 친구가 10번 친구에게 친구추가를 걸었을 때 10번친구가 1번친구에게 똑같이 친구 요청을 보낸다면? 등등 하는 고민을 하기 시작했다.
API에서는 요청 하는 User타입의 userId 와 요청을 받는 SendId의 sendId가 필요하다.
/**
* 친구신청
* @param send
* @return
*/
@PostMapping("/request")
public ResponseEntity<String> sendFriendRequest(@RequestBody SendFriendRequest send) {
try {
friendService.sendFriendRequest(send);
return ResponseEntity.ok("친구신청이 완료되었습니다");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("친구 신청에 오류가 발생했습니다");
}
}
서비스에서 가장 문제가 많았는데 처음에는 단순한 insert와 delete로 구현을 하고 난 후 조건을 하나하나 걸어줬다.

보낸 유저와 받은 유저로 나누어 null체크를 먼저 진행했다.
// 받은 사람
Optional<User> userId = userRepository.findById(req.getUserId().getUserId());
// 보낸 사람 > 나
Optional<User> sendId = userRepository.findById(req.getSendUserId().getUserId());
User user = userId.orElseThrow(() -> new RuntimeException("친구신청 받은 유저를 찾을 수 없습니다"));
User sendUser = sendId.orElseThrow(() -> new RuntimeException("친구신청 보낸 유저를 찾을 수 없습니다"));
내가 보내려고 하는 친구에게 친구요청을 받았는지를 체크했다.
List<Friend_Request> me = friendRequestRepository.findByUserId(sendUser);
중복신청을 방지하기 위해 userId와 sendUserId로 동일한 신청을 체크했다.
Optional<Friend_Request> userIs = friendRequestRepository.findByUserIdAndSendUserId(user, sendUser);
if문으로 서로 요청이 없을 때, 내가 친구요청을 받았는데 똑같은 유저에게 신청했을 때, 중복으로 신청했을 때를 나누어 상황마다 다른 결과값을 작성했다.
if (me.isEmpty() && userIs.isEmpty()) {
Friend_Request friend = Friend_Request.builder()
.userId(user)
.sendUserId(sendUser)
.friendState(0)
.build();
friendRequestRepository.save(friend);
return friend;
} else if (!userIs.isEmpty()) {
throw new RuntimeException("이미 친구요청을 보냈습니다");
} else {
Friend addFriend = Friend.builder()
.userId(user)
.sendUserId(sendUser)
.friendState(1)
.build();
friendRepository.save(addFriend);
for (Friend_Request request : me) {
friendRequestRepository.deleteById(request.getFriendRequestId());
}
return null;
}
if문이 반복되는 것을 싫어해 다른 방법이 없을까 고민했지만 차라리 각각의 상황들을 표현하는게 가독성이 더 좋은 것 같아 이렇게 마무리 했다!
결과적으로 내가 원하는 친구로직이 탄생했다!

오늘은 친구관련 코드 구현을 마쳤다. 이제 로그인한 친구 목록보기정도 하면 친구도 끝이다! 물론 리스트보기, 친구 삭제하기 등 다른 코드도 사진처럼 다 구현했다. 친구신청 끝!