[개발일지] 취미 커뮤니티 마이페이지 구현 (1)

zwon·2023년 10월 27일
0

개발일지

목록 보기
22/23

먼저 사용자가 관심있어요 누른 크루즈와 사용자가 참여중인 크루즈를 가져오는 코드이다.
그전에 User와 Crew 엔티티 연관관계를 단방향이었다가 양방향으로 다음과 같이 설정했다.
코드를 구현하면서 느낀게 스트림을 정말 잘 다루면 너무 좋을꺼같다.........

User

public class User extends BaseTimeEntity {
	...
    @OneToMany(mappedBy = "user")
  	private List<Crew> leaderCrews = new ArrayList<>(); // 내가 크루장인 크루
    
 	@ManyToMany(mappedBy = "crew")
  	private List<Crew> crews = new ArrayList<>(); // 내가 참여중인 크루
    ...

Crew

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<>();
    ...

UserService

// 관심 있는 크루
  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;
}
  • 참고로 new blogException는 사용자 정의 예외를 한번 해본건데 테스트(?)느낌이라 아마 나중에 예외 처리를 따로 할 때 수정할 예정이다.

UserController

@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>

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글