[Spring] 구인 구직 서비스4 - 쪽지 구현

춤인형의 개발일지·2025년 1월 31일

Spring실습

목록 보기
25/40

구인구직 서비스

목요일 - 추가기능 (쪽지기능) 구현하기

쪽지

쪽지controller

@RestController
public class MessageRestController {

    private final MessageService messageService;

    public MessageRestController(MessageService messageService) {
        this.messageService = messageService;
    }

    @PostMapping("/messages")
    public MessageResponse createMessage(@LoginMember String senderId, @RequestBody MessageRequest request) {

        return messageService.create(senderId, request);
    }

    // 사용자가 보낸 전체 쪽지 조회
    @GetMapping("/messages/senders")
    public List<MessageSendResponse> findAllSendMessages(@LoginMember String senderId) {

        return messageService.findAllSendMessages(senderId);
    }

    @DeleteMapping("/messages/senders/{messageId}")
    public void deleteSendMessage(@PathVariable Long messageId, @LoginMember String senderId) {

        messageService.deleteSendMessage(messageId, senderId);
    }

    // 사용자가 받은 전체 쪽지 조회
    @GetMapping("/messages/receivers")
    public List<MessageSendResponse> findAllReceiveMessages(@LoginMember String receiveId) {

        return messageService.findAllReceiveMessages(receiveId);
    }

    @DeleteMapping("/messages/receivers/{messageId}")
    public void deleteReceiveMessage(@PathVariable Long messageId, @LoginMember String receiverId) {

        messageService.deleteReceiveMessage(messageId, receiverId);
    }

}

쪽지 service

  1. 쪽지 생성
  • 쪽지는 내가 보낼 때 그 받는 쪽의 아이디가 c로 시작하는지, p로 시작하는지를 보고, 에러메세지를 띄우게 된다.
  • 저장할 땐, 내 id(기본 id, 로그인 id x)와 받는 사람의 id가 필요하다.
  • response만 받는 사람의 id, 보낸 사람의 id, 기본 id가 필요하다.
    public MessageResponse create(String senderId, MessageRequest request) {
        if(request.receiverId().startsWith("C")){
            companyRepository.findById(request.receiverId())
                    .orElseThrow(() -> new NoSuchElementException("해당 기업이 존재하지 않습니다!"));
        }
        if (request.receiverId().startsWith("P")) {
            programmerRepository.findById(request.receiverId())
                    .orElseThrow(() -> new NoSuchElementException("해당 개발자가 존재하지 않습니다!"));
        }

        Message message = messageRepository.save(
                new Message(
                        senderId,
                        request.receiverId()));
        return new MessageResponse(
                message.getId(),
                message.getReceiverId(),
                message.getSenderId());
    }
  1. 쪽지 목록 조회
  • 쪽지 목록은 2가지가 있다. 내가 보낸 것, 내가 받은 것
    2가지를 queryString으로 해보려고 하니까, 흠,, 모르겠다.
    그래서 그냥 endpoint를 나눠서 구현을 했다.
    그래서 나온 문제점이 우리는 쪽지 목록에 기업의 이름, 개발자의 이름만 보여줄건데 그 이름은 메세지 자체(Entity/칼럼)에는 없으니까 개발자or기업의 id를 거쳐서 가야했다. 이런 생각으로 나온 코드가 아래이다.
    //사용자가 보낸거 찾을거야
    public List<MessageSendResponse> findAllSendMessages(String senderId) {
        List<Message> messageList = messageRepository.findAllBySenderId(senderId);
        List<MessageSendResponse> messageSendResponses = new ArrayList<>();

        for (Message message : messageList) {
            if(senderId.startsWith("C")){
            //1. company객체를 찾아서
                Company company = companyRepository.findById(message.getSenderId())
                        .orElseThrow(() -> new NoSuchElementException(message.getSenderId() + "님이 보낸 쪽지가 없습니다."));
                //2. companyname에 접근해(가져와) 저장한다.
                messageSendResponses.add(new MessageSendResponse(message.getId(), company.getCompanyname()));
            }
            if(senderId.startsWith("P")){
             //1. programmer객체를 찾아서
                Programmer programmer = programmerRepository.findById(message.getSenderId())
                        .orElseThrow(() -> new NoSuchElementException(message.getSenderId() + "님이 보낸 쪽지가 없습니다."));
                //2. programmerName에 접근해(가져와) 저장한다.
                messageSendResponses.add(new MessageSendResponse(message.getId(), programmer.getName()));
            }
        }
        return messageSendResponses;
    }

2-2. 받은 쪽지 목록 조회
마찬가지이다.

    //내가 받은거
    public List<MessageSendResponse> findAllReceiveMessages(String receiveId) {
        List<Message> messageList = messageRepository.findAllByReceiverId(receiveId);
        List<MessageSendResponse> messageSendResponses = new ArrayList<>();

        for (Message message : messageList) {
            if(receiveId.startsWith("C")){
                Programmer programmer = programmerRepository.findById(message.getSenderId())
                        .orElseThrow(() -> new NoSuchElementException(message.getSenderId() + "님이 보낸 쪽지가 없습니다."));
                messageSendResponses.add(new MessageSendResponse(message.getId(), programmer.getName()));
            }
            if(receiveId.startsWith("P")){
                Company company = companyRepository.findById(message.getSenderId())
                        .orElseThrow(() -> new NoSuchElementException(message.getSenderId() + "님이 보낸 쪽지가 없습니다."));
                messageSendResponses.add(new MessageSendResponse(message.getId(), company.getCompanyname()));
            }
        }
        return messageSendResponses;
    }
  1. 쪽지 삭제
  • 내가 보낸 쪽지들 삭제
    //내가 보낸 메세지 삭제
    public void deleteSendMessage(Long messageId, String senderId) {
        Message message = messageRepository.findById(messageId)
                .orElseThrow(() -> new NoSuchElementException("해당 메세지가 없습니다."));

        if (!message.getSenderId().equals(senderId)) throw new IllegalArgumentException("송신 ID가 일치하지 않습니다.");
        else {
            messageRepository.deleteById(messageId);
        }
    }
  • 내가 받은 쪽지들 삭제
    public void deleteReceiveMessage(Long messageId, String receiverId) {
        Message message = messageRepository.findById(messageId)
                .orElseThrow(() -> new NoSuchElementException("해당 메세지가 없습니다."));

        if (!message.getReceiverId().equals(receiverId)) throw new IllegalArgumentException("송신 ID가 일치하지 않습니다.");
        else {
            messageRepository.deleteById(messageId);
        }
    }
}

현재 문제점들은

  1. 쪽지 조회
  • 내가 보낸 쪽지 조회와 받은 쪽지 조회의 코드가 너무나도 유사하다. 개발자or기업의 이름때문에 저렇게 중복되는 코드를 작성해야하는걸까?
  1. 쪽지 삭제
  • 구현되어 있는 쪽지 삭제는 내가 보낸 쪽지를 삭제하면 받은 사람의 쪽지도 같이 삭제되어버린다. 이게 맞을까?
  1. 탈퇴된 회원의 쪽지는 없어지나?
  • 나한테 A라는 사람이 쪽지를 보냈는데, 그 사람이 회원탈퇴를 했을 때 그 사람이 보낸 쪽지들도 다 사라지는 것인가?

여러가지의 문제점이 있다. 이런 문제점을 내일부터 하나하나 해결해 나가고자 한다.


😐 느낀점

내가 보낸 것, 내가 받은 것 2가지로 분류하는게 일단 어려웠던 것 같다.

0개의 댓글