백엔드/Spring Boot
모여봄 #3 팀 조회 기능
jhss9747
2025. 3. 8. 12:19
기본 동작 정리
- userNo를 사용하여 기본적인 팀 정보를 모두 가져옴
- 옵션을 사용한다면 해당 정보에서 동적 쿼리 필터링을 해서 반환
로직
- 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.
- 자바 코드로 쿼리 작성.
- 컴파일 시에 타입 검사.
- 유지보수 용이.
- 타입 안전성 높음. 차이점
- JPQL:
- 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));
}
노션에 정리했던 글을 옮겨왔는데 가독성이 많이 떨어지는 것 같다..
어떻게 하면 더 정리를 잘 할수 있을까