크루 가입 탈퇴 기능을 구현하다가 객체의 비교에 있어서 정리하고자한다.
// 크루에 가입이 가능한지
  public boolean isJoinable(User user) { // (1)
    return this.isPublished() && this.isRecruiting() && !this.users.contains(user);
  }
  // 크루 멤버인지
  public boolean isMember(User user) { // (2)
    if (this.user.equals(user)){ // 크루장인 경우
      return true;
    }
    return this.users.contains(user); // 크루원인 경우
  }
// 크루 참가 신청
  @GetMapping("/crew/{id}/join")
  public String joinCrew(HttpSession session, @PathVariable Long id){
    User loginUser = (User) session.getAttribute("loginUser");
    crewService.addUser(id, loginUser);
    return "redirect:/crews/"+id;
  }
  // 크루 탈퇴
  @GetMapping("/crew/{id}/leave")
  public String leaveCrew(HttpSession session, @PathVariable Long id){
    User loginUser = (User) session.getAttribute("loginUser");
    crewService.leaveCrew(id, loginUser);
    return "redirect:/crews/"+id;
  }
 // 크루 참가
  public void addUser(Long id, User user){
    Crew crew = crewRepository.findById(id).orElseThrow(IllegalArgumentException::new);
    log.info("addUser before : isMember() = {}",crew.isMember(user));
    if (crew.isJoinable(user)){
      crew.addUser(user);
    }
    log.info("addUser after : isMember() = {}",crew.isMember(user));
  }
  public void leaveCrew(Long id, User user){
    Crew crew = crewRepository.findById(id).orElseThrow(IllegalArgumentException::new);
    log.info("leaveCrew before : isMember() = {}",crew.isMember(user)); // 왜 여기서 false지?
    if (crew.isMember(user)) {
      crew.removeUser(user);
    }
    log.info("leaveCrew after : isMember() = {}",crew.isMember(user));
  }
@Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return Objects.equals(getId(), user.getId()) && Objects.equals(getName(), user.getName()) && Objects.equals(getNickname(), user.getNickname()) && Objects.equals(getPassword(), user.getPassword()) && Objects.equals(getEmail(), user.getEmail());
  }
  @Override
  public int hashCode() {
    return Objects.hash(getId(), getName(), getNickname(), getPassword(), getEmail());
  }
