먼저 사용자가 관심있어요 누른 크루즈와 사용자가 참여중인 크루즈를 가져오는 코드이다.
그전에 User와 Crew 엔티티 연관관계를 단방향이었다가 양방향으로 다음과 같이 설정했다.
코드를 구현하면서 느낀게 스트림을 정말 잘 다루면 너무 좋을꺼같다.........
public class User extends BaseTimeEntity {
	...
    @OneToMany(mappedBy = "user")
  	private List<Crew> leaderCrews = new ArrayList<>(); // 내가 크루장인 크루
    
 	@ManyToMany(mappedBy = "crew")
  	private List<Crew> crews = new ArrayList<>(); // 내가 참여중인 크루
    ...
public class Crew extends BaseTimeEntity {
	...
 	@ManyToMany// 크루에 속한 팀원, 우선 ManyToMany로 함.
  	@JoinTable(
      name = "user_crew",
      joinColumns = @JoinColumn(name = "crew_id"),
      inverseJoinColumns = @JoinColumn(name = "user_id")
  )
  private List<User> users = new ArrayList<>();
    ...
// 관심 있는 크루
  public List<CrewResponseDto> LikeCrew(Long id){
    User user = userRepository.findById(id)
    .orElseThrow(() -> new blogException("해당 회원은 존재하지 않습니다."));
    
    List<CrewResponseDto> crews = user.getLikes().stream()
        .map(like -> new CrewResponseDto(like.getCrew()))
        .collect(Collectors.toList());
    return crews;
  }
  // 참여하고 있는 크루
  public List<CrewResponseDto> joinCrew(Long id){
    User user = userRepository.findById(id)
    .orElseThrow(() -> new blogException("해당 회원은 존재하지 않습니다."));
    
    List<CrewResponseDto> crews = user.getCrews().stream()
        .map(CrewResponseDto::new)
        .collect(Collectors.toList());
    return crews;
  }
  
  // 크루장인 크루
  public List<CrewResponseDto> leaderCrew(String nickname){
    User user = userRepository.findUserByNickname(nickname)
        .orElseThrow(() -> new blogException("해당 회원은 존재하지 않습니다."));
    List<CrewResponseDto> crews = user.getLeaderCrews().stream()
        .filter(crew -> crew.getUser().equals(user))
        .map(CrewResponseDto::new)
        .collect(Collectors.toList());
    return crews;
  }
  
  // 활동종료 크루 (크루원일 때)
  public List<CrewResponseDto> closeCrew(String nickname){
    User user = userRepository.findUserByNickname(nickname)
        .orElseThrow(() -> new blogException("해당 회원은 존재하지 않습니다."));
    List<CrewResponseDto> crews = user.getCrews().stream()
        .filter(crew -> crew.isClosed())
        .map(CrewResponseDto::new)
        .collect(Collectors.toList());
    return crews;
}
@Controller
@RequiredArgsConstructor
public class UserController {
  private final UserService userService;
  @GetMapping("/my-page")
  public String myPage(Model model, HttpSession session){
    User loginUser = (User) session.getAttribute("loginUser");
    // 크루장인 크루즈
    List<CrewResponseDto> leaderCrew = userService.leaderCrew(loginUser.getNickname());
    model.addAttribute("leaderCrew", leaderCrew);
    // "관심있어요" 크루즈
    List<CrewResponseDto> likeCrews = userService.LikeCrew(loginUser.getNickname());
    model.addAttribute("likeCrews", likeCrews);
    // 내가 참여한 크루즈
    List<CrewResponseDto> joinCrews = userService.joinCrew(loginUser.getNickname());
    model.addAttribute("joinCrews", joinCrews);
    return "/user/my-page";
  }
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>마이 페이지</title>
  <link rel="stylesheet" th:href="@{/css/mypage.css}">
</head>
<body>
<h3>관리 중인 크루 (크루장인 경우)</h3>
  <div th:each="crew : ${leaderCrew}">
    <p th:text="${crew.name}"></p>
  </div>
<h3>관심 있는 크루</h3>
  <div th:each="crew : ${likeCrews}">
    <p th:text="${crew.name}"></p>
  </div>
<h3>참여하고 있는 크루</h3>
  <div th:each="crew : ${joinCrews}">
    <p th:if="${crew.isClosed()}">활동 종료</p>
    <p th:text="${crew.name}"></p>
  </div>
</body>
</html>
