728x90
개선이 필요했던 이유
개발을 진행하던 도중 요청에 대해 수락, 거절을 해야 하는 메서드를 생성하게 되었다.
컨트롤러에서 어떤 요청을 타고 들어오느냐에 따라 accept, refuse 메서드를 선택하게 된다.
90%에 대한 로직은 동일하고 마지막 부분에 accept, refuse에 따라 상태변환 메서드 한 줄만 달라지는 메서드였다.
코드
@Transactional
public void acceptFriendRequest(Long receiverNo, Long requesterNo) {
Member requester = memberRepository.findById(requesterNo).orElseThrow(
() -> {
throw new OnlyUAppException(ErrorCode.MEMBER_NOT_FOUND,
ErrorCode.MEMBER_NOT_FOUND.getMessage());
}
);
Member receiver = memberRepository.findById(receiverNo).orElseThrow(
() -> {
throw new OnlyUAppException(ErrorCode.MEMBER_NOT_FOUND,
ErrorCode.MEMBER_NOT_FOUND.getMessage());
}
);
FriendRequest existingRequest = friendRequestRepository.findByReceiver(receiver);
if (existingRequest.getStatus().equals(FriendRequestStatus.REFUSE)) {
throw new OnlyUAppException(ErrorCode.ALREADY_REFUSE_REQUEST,
ErrorCode.ALREADY_REFUSE_REQUEST.getMessage());
}
if (existingRequest.getStatus().equals(FriendRequestStatus.ACCEPT)) {
throw new OnlyUAppException(ErrorCode.ALREADY_ACCEPT_REQUEST,
ErrorCode.ALREADY_ACCEPT_REQUEST.getMessage());
}
existingRequest.accept();
friendRequestRepository.save(existingRequest);
friendService.addRelation(requester, receiver);
}
@Transactional
public void refuseFriendRequest(Long receiverNo, Long requesterNo) {
Member requester = memberRepository.findById(requesterNo).orElseThrow(
() -> {
throw new OnlyUAppException(ErrorCode.MEMBER_NOT_FOUND,
ErrorCode.MEMBER_NOT_FOUND.getMessage());
}
);
Member receiver = memberRepository.findById(receiverNo).orElseThrow(
() -> {
throw new OnlyUAppException(ErrorCode.MEMBER_NOT_FOUND,
ErrorCode.MEMBER_NOT_FOUND.getMessage());
}
);
FriendRequest existingRequest = friendRequestRepository.findByReceiver(receiver);
if (existingRequest.getStatus().equals(FriendRequestStatus.REFUSE)) {
throw new OnlyUAppException(ErrorCode.ALREADY_REFUSE_REQUEST,
ErrorCode.ALREADY_REFUSE_REQUEST.getMessage());
}
if (existingRequest.getStatus().equals(FriendRequestStatus.ACCEPT)) {
throw new OnlyUAppException(ErrorCode.ALREADY_ACCEPT_REQUEST,
ErrorCode.ALREADY_ACCEPT_REQUEST.getMessage());
}
existingRequest.refuse();
friendRequestRepository.save(existingRequest);
}
개선 방향
같은 메서드 이름을 공유하되 boolean 매개변수를 통해 수락, 거절을 특정할 수 있도록 생각했다.
decideFriendRequest라는 이름으로 요청을 결정한다는 의미를 부여하고, 매개변수 boolean일 때 true면 수락, false면 거절하는 방식으로 수정하였다.
@PostMapping("/request/accept")
public String acceptRequest(...) {
friendRequestService.decideFriendRequest(requestNo, true);
return "redirect:/";
}
@PostMapping("/request/refuse")
public String refuseRequest(...) {
friendRequestService.decideFriendRequest(requestNo, false);
return "redirect:/";
}
어떤 api를 타고 들어왔는지에 따라 true, false를 나눠주고 있다.
@Transactional
public void decideFriendRequest(Long requestNo, boolean decide) {
FriendRequest existingRequest = friendRequestRepository.findById(requestNo)
.orElseThrow(
() -> {
throw new OnlyUAppException(ErrorCode.INCONSISTENT_INFORMATION,
ErrorCode.INCONSISTENT_INFORMATION.getMessage());
}
);
if (existingRequest.getStatus().equals(FriendRequestStatus.REFUSE)) {
throw new OnlyUAppException(ErrorCode.ALREADY_REFUSE_REQUEST,
ErrorCode.ALREADY_REFUSE_REQUEST.getMessage());
}
if (existingRequest.getStatus().equals(FriendRequestStatus.ACCEPT)) {
throw new OnlyUAppException(ErrorCode.ALREADY_ACCEPT_REQUEST,
ErrorCode.ALREADY_ACCEPT_REQUEST.getMessage());
}
if (decide) {
existingRequest.accept();
friendService.addRelation(existingRequest.getRequester(), existingRequest.getReceiver());
} else {
existingRequest.refuse();
}
friendRequestRepository.save(existingRequest);
}
매개변수를 하나 추가함으로 중복되는 내용이 많은 accept, refuse 두개의 메서드가 아닌 decide 메서드 하나로 처리할 수 있다.
고민
작성하다보니, Parameter로 true, false를 넘겨주면 Controller도 하나로 합칠 수 있는데 그 방법이 과연 좋을지 고민이 된다.
가독성이 줄지 않을까?
반응형