먼저 사용자가 관심있어요 누른 크루즈와 사용자가 참여중인 크루즈를 가져오는 코드이다.
그전에 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>