카테고리 없음

[런닝 코스 공유 서비스] - 22. 코스 단건 조회 API 개발

sson-coding 2026. 1. 19. 23:49

🏅오늘의 목표

  • 코스 단건 조회

진행한 작업

  • 코스 단건 조회 - 전체 공개/비공개

📃 개발내용

코스 단건 조회

CourseRepository

Optional<Course> findByUuidAndCourseVisibility(UUID courseUuid, CourseVisibility courseVisibility);
  • 코스 아이디와 공개범위 확인

CourseService

  • 코스 단건 조회는 전체공개/비공개/크루원만 공개 로 나누어진다.
  • 현재는 전체공개/비공개만 구현했고, 추후 크루 도메인 구현시 추가할 예정이다.
  // 코스 단건 조회 - 전체 공개
    @Transactional(readOnly = true)
    public CourseDto getPublicCourse(UUID courseUuid) {
        log.debug("[전체공개]코스 조회 시작 : courseUuid={}", courseUuid);

        // 코스 확인
        Course course = courseRepository.findByUuidAndCourseVisibility(courseUuid, CourseVisibility.PUBLIC)
            .orElseThrow(() -> new BaseException(CourseErrorCode.COURSE_NOT_FOUND));

        return courseMapper.toDto(course);
    }

    // 코스 단건 조회 - 비공개
    @Transactional(readOnly = true)
    public CourseDto getPrivateCourse(UUID userUuid, UUID courseUuid) {
        log.debug("[비공개]코스 조회 시작 : courseUuid={}", courseUuid);

        // 코스 확인
        Course course = courseRepository.findByUuidAndCourseVisibility(courseUuid, CourseVisibility.PRIVATE)
            .orElseThrow(() -> new BaseException(CourseErrorCode.COURSE_NOT_FOUND));

        // 작성자인지 확인
        if (!course.getUser().getUuid().equals(userUuid)) {
            throw new BaseException(CourseErrorCode.COURSE_CREATOR_NOT_SAME);
        }

        return courseMapper.toDto(course);
    }

CourseController

  // 코스 단건 조회 - 전체공개
    @GetMapping("/public/{courseUuid}")
    public ResponseEntity<ApiResponse<CourseDto>> getPublicCourse(
        @PathVariable UUID courseUuid
    ){
        CourseDto courseDto = courseService.getPublicCourse(courseUuid);
        return ResponseEntity.ok(new ApiResponse<>("[전체공개] 코스 단건 조회에 성공했습니다.", courseDto));
    }

    // 코스 단건 조회 - 비공개
    @GetMapping("/me/{courseUuid}")
    public ResponseEntity<ApiResponse<CourseDto>> getPrivateCourse(
        @AuthenticationPrincipal CustomUserDetails customUserDetails,
        @PathVariable UUID courseUuid
    ){
        CourseDto courseDto = courseService.getPrivateCourse(customUserDetails.getUserUuid(),courseUuid);
        return ResponseEntity.ok(new ApiResponse<>("[비공개] 코스 단건 조회에 성공했습니다.", courseDto));
    }

CourseMapper

@Mapper(componentModel = "spring")
public interface CourseMapper {
    @Mapping(target = "courseUuid", source = "uuid")
    CourseDto toDto(Course course);
}

📝 테스트