기본 동작 정리


  1. userNo를 사용하여 기본적인 팀 정보를 모두 가져옴
  2. 옵션을 사용한다면 해당 정보에서 동적 쿼리 필터링을 해서 반환

로직

  • userNo는 사용자가 로그인하면 기본적으로 가져올수 있는 값이므로 해당 값을 인자로 받는 쿼리를 생성해야함
    • 해당 쿼리문은 users - teamuser - team 이렇게 조인해줘야함
    • 조인해서 userNo를 where 조건을 걸어서 모두 반환
  • 해당 쿼리를 옵션이 없다면 그대로 반환하고 있다면 동적으로 필터링해야함
  • 컨트롤러에선 결과만 반환해야함

구현

  • TeamUser 엔티티
더보기
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "team_user")
public class TeamUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long no;

    @ManyToOne
    @JoinColumn(name = "user_no", nullable = false)
    private User user;

    @ManyToOne
    @JoinColumn(name = "team_no", nullable = false)
    private Team team;

    @Column(nullable = false)
    private boolean status; // 승인여부

    @Column
    private String role;
}
  • TeamSearchDto
더보기
@Data
@Builder
public class TeamSearchDto {

    private String teamName;

    private String teamIntroduce;

    private ProjectStatus projectStatus;

    private LocalDateTime createdAt;

}
  •  TeamRepository
더보기
public interface TeamRepository extends JpaRepository<Team, Long> {

    @Query("SELECT new com.beyond.backend.data.dto.TeamSearchDto(t.teamName, t.teamIntroduce, t.projectStatus, t.timePeriod.createdAt) " +
            "FROM User u " +
            "JOIN TeamUser tu ON u.no = tu.user.no " +
            "JOIN Team t ON tu.team.no = t.no " +
            "WHERE u.no = :userNo")
    List<TeamSearchDto> findUserTeams(@Param("userNo") Long userNo);
}
  • userNo로 team 정보 가져오기
  • 현재 작성한 쿼리문은 JPQL (Java Persistence Query Language)
  • DSL (Domain-Specific Language) - QueryDSL 를 사용해보는 것을 고려
  • 더보기
    • JPQL:
      • SQL과 유사한 문법.
      • 문자열 기반.
      • 런타임 시에 타입 검사.
      • SQL에 익숙한 개발자에게 직관적.
    • QueryDSL:
      • 메서드 체인 방식의 DSL.
      • 자바 코드로 쿼리 작성.
      • 컴파일 시에 타입 검사.
      • 유지보수 용이.
      • 타입 안전성 높음. 차이점
  • TeamServiceImpl
    • filter를 사용해서 값이 null이면 그대로 반환, null이 아니면 해당 값으로 필터링 한 값을 반환
더보기
@Override
public List<TeamSearchDto> filterUserTeams(Long userNo, String teamName, String teamIntroduce, String projectStatus){
    List<TeamSearchDto> teams = teamRepository.findUserTeams(userNo);

    List<TeamSearchDto> filteredTeams = teams.stream()
            .filter(team -> teamName == null || team.getTeamName().contains(teamName))
            .filter(team -> teamIntroduce == null || team.getTeamIntroduce().contains(teamIntroduce))
            .filter(team -> projectStatus == null || team.getProjectStatus().equals(projectStatus))
            .toList();
    return filteredTeams;
}
  • TeamController
    • userNo는 무조건 받고 나머지 값은 필수가 아님
더보기
@GetMapping()
public ResponseEntity<List<TeamSearchDto>> getUserTeams(
        @RequestParam Long userNo,
        @RequestParam(required = false)  String teamName,
        @RequestParam(required = false)  String teamIntroduce,
        @RequestParam(required = false)  String projectStatus){

    return ResponseEntity.status(HttpStatus.OK).body(teamService.filterUserTeams(userNo, teamName, teamIntroduce, projectStatus));
}

노션에 정리했던 글을 옮겨왔는데 가독성이 많이 떨어지는 것 같다..

어떻게 하면 더 정리를 잘 할수 있을까

'백엔드 > Spring Boot' 카테고리의 다른 글

모여봄 #4 팀 관련 추가 기능들 구현  (0) 2025.03.08
모여봄 #4 팀 조회 페이징 추가  (0) 2025.03.08
모여봄 #2 CRUD 구현  (0) 2025.03.02
모여봄 #1 프로젝트 구상  (0) 2025.02.23

+ Recent posts