Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🏄 :: (Meogo-52) feign client #53

Merged
merged 10 commits into from
Oct 21, 2024
Merged

🏄 :: (Meogo-52) feign client #53

merged 10 commits into from
Oct 21, 2024

Conversation

meltapplee
Copy link
Member

@meltapplee meltapplee commented Oct 21, 2024

close #52
커리어넷

Summary by CodeRabbit

릴리스 노트

  • 신규 기능
    • Spring Cloud OpenFeign을 사용하여 선언적 REST 클라이언트 기능 추가.
    • School, Gubun, CareerSchoolListResponse, DataSearch, CareerSchoolResponse 데이터 클래스 및 CareerFeignClient, CareerFeignClientService, QuerySchoolService, FcmUtil, FcmConfig 서비스 추가.
    • SchoolController, UserController, BookmarkController, CommentController, PostController, QuestionController, ReviewController에 API 문서화 개선을 위한 OpenAPI 주석 추가.
  • 버그 수정
    • FCM 관련 서버 오류 처리 추가.
  • 구성 변경
    • application.yml 파일에 SQL 로깅 활성화 및 새로운 URL 및 OpenFeign 속성 추가.

@meltapplee meltapplee added the 기능개발 make something label Oct 21, 2024
@meltapplee meltapplee self-assigned this Oct 21, 2024
Copy link

coderabbitai bot commented Oct 21, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

이 변경 사항은 build.gradle.kts 파일에 Spring Cloud OpenFeign에 대한 새로운 종속성을 추가하고, MeogoBackendApplication 클래스에 @EnableFeignClients 주석을 추가하여 Feign 클라이언트를 활성화합니다. 또한 여러 컨트롤러 클래스에 OpenAPI 주석을 추가하여 API 문서를 개선하고, 새로운 School 데이터 클래스와 Gubun 열거형을 정의하며, 학교 관련 API 요청을 처리하는 SchoolController와 관련 서비스 클래스를 추가합니다. 마지막으로, Firebase Cloud Messaging을 초기화하는 FcmConfig 클래스를 포함하여 FCM 관련 유틸리티와 예외 처리를 위한 클래스를 추가합니다.

Changes

파일 경로 변경 요약
build.gradle.kts Spring Cloud OpenFeign에 대한 종속성 추가: implementation("org.springframework.cloud:spring-cloud-starter-openfeign:3.1.4")
src/main/kotlin/org/meogo/MeogoBackendApplication.kt @EnableFeignClients(basePackages = ["org.meogo"]) 주석 추가
src/main/kotlin/org/meogo/domain/bookmark/presentation/BookmarkController.kt OpenAPI 주석 추가: @Tag@Operation 주석으로 API 문서 개선
src/main/kotlin/org/meogo/domain/comment/presentation/CommentController.kt OpenAPI 주석 추가: @Tag@Operation 주석으로 API 문서 개선
src/main/kotlin/org/meogo/domain/post/presentation/PostController.kt OpenAPI 주석 추가 및 @RequiredArgsConstructor 주석 제거
src/main/kotlin/org/meogo/domain/question/presentation/QuestionController.kt OpenAPI 주석 추가: @Tag@Operation 주석으로 API 문서 개선
src/main/kotlin/org/meogo/domain/review/presentation/ReviewController.kt OpenAPI 주석 추가: @Tag@Operation 주석으로 API 문서 개선
src/main/kotlin/org/meogo/domain/school/domain/School.kt 새로운 데이터 클래스 School 추가
src/main/kotlin/org/meogo/domain/school/enum/Gubun.kt 새로운 열거형 Gubun 추가
src/main/kotlin/org/meogo/domain/school/presentation/SchoolController.kt 새로운 REST 컨트롤러 SchoolController 추가
src/main/kotlin/org/meogo/domain/school/service/QuerySchoolService.kt 새로운 서비스 클래스 QuerySchoolService 추가
src/main/kotlin/org/meogo/domain/user/presentation/UserController.kt OpenAPI 주석 추가: @Tag@Operation 주석으로 API 문서 개선
src/main/kotlin/org/meogo/global/config/FcmConfig.kt Firebase Cloud Messaging 초기화를 위한 새로운 설정 클래스 FcmConfig 추가
src/main/kotlin/org/meogo/global/error/exception/ErrorCode.kt 새로운 오류 코드 FCM_SERVER_ERROR 추가
src/main/kotlin/org/meogo/global/feign/CareerFeignClient.kt 새로운 Feign 클라이언트 인터페이스 CareerFeignClient 추가
src/main/kotlin/org/meogo/global/feign/CareerFeignClientService.kt 새로운 서비스 클래스 CareerFeignClientService 추가
src/main/kotlin/org/meogo/global/feign/CareerSchoolResponse.kt 새로운 데이터 클래스 CareerSchoolListResponse, DataSearch, CareerSchoolResponse 추가
src/main/kotlin/org/meogo/global/feign/FeignProperty.kt 새로운 객체 FeignPropertyFeignRequestProperty 추가
src/main/kotlin/org/meogo/global/utill/FcmUtil.kt Firebase Cloud Messaging 기능을 위한 유틸리티 클래스 FcmUtil 추가
src/main/kotlin/org/meogo/global/utill/exception/FcmException.kt FCM 관련 예외를 위한 객체 FcmException 추가
src/main/resources/application.yml spring.config.activate.on-profile 추가 및 jpa.show-sql 속성 업데이트

Possibly related PRs

Suggested labels

core

🐇 새로운 기능이 가득한 이곳,
Rabbit이 뛰어놀며 기뻐하는 곳!
OpenFeign과 함께 API 문서가 빛나고,
학교 정보도 쉽게 찾을 수 있어요!
FCM으로 메시지도 보내고,
모두가 함께하는 즐거운 세상! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🧹 Outside diff range and nitpick comments (35)
src/main/kotlin/org/meogo/domain/school/enum/Gubun.kt (1)

1-5: 전반적인 구현이 잘 되어 있습니다.

enum 클래스의 구조와 구현이 잘 되어 있습니다. 교육 수준을 체계적으로 분류하는 좋은 방법입니다.

다음 사항들을 고려해 보시기 바랍니다:

  1. enum 클래스의 목적과 사용법을 설명하는 KDoc 주석을 추가하는 것이 좋겠습니다.
  2. 향후 국제화를 고려한다면, 문자열 값을 리소스 파일로 분리하는 것을 고려해 보세요.

다음과 같이 KDoc 주석을 추가할 수 있습니다:

/**
 * 교육 기관의 유형을 나타내는 열거형 클래스입니다.
 *
 * @property value API 요청 또는 데이터베이스 쿼리에 사용되는 문자열 값
 */
enum class Gubun(val value: String) {
    // ... (기존 코드)
}
src/main/kotlin/org/meogo/global/utill/exception/FcmException.kt (1)

1-8: 구현이 깔끔하고 적절합니다.

FcmException 객체의 구현이 간결하고 Kotlin의 모범 사례를 따르고 있습니다. 싱글톤 예외 타입에 대해 object를 사용한 것이 적절합니다.

패키지 이름 철자를 수정하는 것이 좋겠습니다.

현재 패키지 이름에 'utill'이라고 되어 있는데, 이는 'util'의 오타로 보입니다. 패키지 이름을 수정하는 것이 좋겠습니다.

다음과 같이 수정을 제안합니다:

-package org.meogo.global.utill.exception
+package org.meogo.global.util.exception

이 변경사항을 적용하면 일관성 있는 명명 규칙을 유지할 수 있습니다.

src/main/kotlin/org/meogo/global/feign/CareerSchoolResponse.kt (2)

7-9: DataSearch 클래스 구현이 좋습니다. 작은 개선 제안이 있습니다.

DataSearch 클래스가 CareerSchoolResponse 객체의 리스트를 잘 캡슐화하고 있습니다. 구조가 명확합니다.

가독성을 높이기 위해 'content' 대신 더 구체적인 이름을 사용하는 것을 고려해 보세요. 예를 들어:

data class DataSearch(
    val schools: List<CareerSchoolResponse>
)

이렇게 하면 속성의 목적이 더 명확해질 것 같습니다.


11-18: CareerSchoolResponse 클래스 구현이 전반적으로 좋습니다. 일관성과 명확성을 위한 제안사항이 있습니다.

CareerSchoolResponse 클래스가 학교 정보를 잘 표현하고 있습니다. nullable 타입의 적절한 사용도 좋습니다.

  1. 속성 이름의 일관성: 'adres'와 같은 약어 대신 'address'를 사용하는 것이 더 명확할 것 같습니다.
  2. 한국어 로마자 표기: 'schoolGubun'과 같은 속성은 영어로 번역하거나 주석을 추가하여 의미를 명확히 하는 것이 좋겠습니다.

예시:

data class CareerSchoolResponse(
    val seq: String,
    val link: String,
    val schoolType: String?, // formerly schoolGubun
    val address: String, // formerly adres
    val schoolName: String,
    val establishmentType: String // formerly estType
)

이렇게 변경하면 코드의 가독성과 유지보수성이 향상될 것 같습니다.

src/main/kotlin/org/meogo/domain/school/service/QuerySchoolService.kt (2)

7-10: 생성자 수준의 의존성 주입을 고려해보세요.

클래스 선언과 생성자가 올바르게 작성되었습니다. 하지만 코드를 더 개선하기 위해 생성자 수준의 의존성 주입을 사용하는 것이 좋습니다.

다음과 같이 변경하는 것을 고려해보세요:

@Service
class QuerySchoolService @Autowired constructor(
    private val careerFeignClientService: CareerFeignClientService
)

이렇게 하면 의존성 주입이 더 명시적이고 테스트하기 쉬워집니다.


12-14: execute 메서드의 개선 사항

execute 메서드가 간결하게 구현되어 있지만, 다음 사항들을 고려해보시기 바랍니다:

  1. 오류 처리: 현재 메서드에서 오류 처리가 보이지 않습니다. careerFeignClientService.getSchoolInfo에서 발생할 수 있는 예외를 처리하는 방법을 고려해보세요.

  2. 정렬 효율성: 결과를 메모리에서 정렬하고 있는데, 대규모 데이터셋의 경우 비효율적일 수 있습니다. 가능하다면 데이터베이스 수준에서 정렬을 수행하는 것이 좋습니다.

  3. 문서화: 메서드에 대한 문서화(KDoc)를 추가하여 각 매개변수의 의미와 반환값에 대한 설명을 제공하는 것이 좋습니다.

다음과 같이 개선할 수 있습니다:

/**
 * 학교 정보를 조회하고 정렬된 결과를 반환합니다.
 *
 * @param gubun 학교 구분
 * @param region 지역 (선택사항)
 * @param name 학교 이름 (선택사항)
 * @param sch1 추가 검색 조건 (선택사항)
 * @return 학교 이름으로 정렬된 학교 정보 리스트
 * @throws SomeSpecificException 외부 서비스 호출 중 오류 발생 시
 */
fun execute(gubun: Gubun, region: String?, name: String?, sch1: String?): List<School> {
    return try {
        careerFeignClientService.getSchoolInfo(gubun, name, region, sch1)
            .sortedBy { it.schoolName }
    } catch (e: Exception) {
        // 적절한 예외 처리 로직
        throw SomeSpecificException("학교 정보 조회 중 오류 발생", e)
    }
}

이렇게 하면 메서드의 가독성과 유지보수성이 향상됩니다.

src/main/kotlin/org/meogo/global/feign/FeignProperty.kt (2)

3-13: FeignProperty 객체가 잘 구현되었습니다.

상수들이 잘 정의되어 있고 Kotlin 명명 규칙을 따르고 있습니다. API 요청 매개변수 이름을 중앙에서 관리할 수 있는 좋은 방법입니다.

각 상수에 대한 간단한 설명을 추가하는 것이 좋을 것 같습니다. 예를 들어:

/**
 * API 요청 매개변수 상수
 */
object FeignProperty {
    /** API 키 매개변수 이름 */
    const val API_KEY = "apiKey"
    // 다른 상수들에 대해서도 비슷한 방식으로 주석을 추가하세요.
}

15-20: FeignRequestProperty 객체가 잘 구현되었습니다.

상수들이 잘 정의되어 있고 Kotlin 명명 규칙을 따르고 있습니다. API 요청의 기본 매개변수 값을 제공하는 좋은 방법입니다.

다음과 같은 개선 사항을 제안합니다:

  1. 객체에 대한 설명 주석을 추가하세요.
  2. FeignProperty와의 관계를 설명하는 주석을 추가하세요.
  3. 각 상수에 대한 간단한 설명을 추가하세요.

예시:

/**
 * API 요청의 기본 매개변수 값
 * 이 객체는 [FeignProperty]에 정의된 일부 매개변수의 기본값을 제공합니다.
 */
object FeignRequestProperty {
    /** 서비스 유형 */
    const val SVC_TYPE = "api"
    /** 서비스 코드 */
    const val SVC_CODE = "SCHOOL"
    /** 컨텐츠 타입 */
    const val CONTENT_TYPE = "json"
    /** 페이지당 결과 수 */
    const val PER_PAGE = 500
}
src/main/kotlin/org/meogo/global/error/exception/ErrorCode.kt (1)

28-29: FCM 서버 오류 코드가 적절히 추가되었습니다.

새로운 FCM_SERVER_ERROR 코드가 기존 패턴을 따라 올바르게 추가되었습니다. 이는 FCM 관련 기능의 도입과 일치합니다.

가독성을 위해 새로운 오류 코드를 기존 INTERNAL_SERVER_ERROR와 구분하는 것이 좋겠습니다. 다음과 같이 빈 줄을 추가하는 것은 어떨까요?

 // Internal Server Error
 INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
+
 FCM_SERVER_ERROR(500, "FCM Server Error")
src/main/resources/application.yml (1)

48-49: 환경 변수 사용 승인 및 문서화 제안

${CAREER_URL} 환경 변수를 사용하여 career URL을 설정한 것은 좋은 방법입니다. 이는 구성 관리에 적합합니다.

이 환경 변수의 목적과 설정 방법에 대한 문서를 README 파일에 추가하는 것이 좋습니다.

src/main/kotlin/org/meogo/global/feign/CareerFeignClient.kt (1)

7-8: FeignClient 인터페이스 선언이 적절합니다.

인터페이스 이름과 @FeignClient 어노테이션 사용이 적절합니다. URL을 매개변수화한 것은 좋은 방식입니다.

가독성을 위해 인터페이스 선언 앞에 빈 줄을 추가하는 것이 좋습니다.

src/main/kotlin/org/meogo/domain/school/presentation/SchoolController.kt (3)

12-20: 어노테이션이 적절하게 사용되었습니다.

REST 컨트롤러에 적합한 어노테이션들이 사용되었으며, Swagger 어노테이션을 통해 API 문서화가 개선되었습니다.

@Operation 어노테이션에 description 파라미터를 추가하여 API 엔드포인트에 대한 더 자세한 설명을 제공하는 것이 좋습니다. 예를 들어:

@Operation(
    summary = "학교 정보 조회",
    description = "주어진 매개변수를 기반으로 학교 정보를 조회합니다. 구분, 지역, 이름, 학교 코드로 필터링할 수 있습니다."
)

21-30: 메서드 시그니처와 매개변수가 잘 정의되어 있습니다.

메서드 이름이 그 목적을 명확히 설명하고 있으며, 선택적 매개변수에 대해 nullable 타입을 사용한 것이 적절합니다. Gubun enum 타입을 사용하여 타입 안전성을 제공하고 있습니다.

각 매개변수에 대한 설명을 추가하면 API 사용자에게 더 명확한 정보를 제공할 수 있습니다. 예를 들어:

@RequestParam(name = "gubun", description = "학교 구분 (예: 초등학교, 중학교, 고등학교)")
gubun: Gubun,
@RequestParam(name = "region", description = "학교가 위치한 지역", required = false)
region: String?,
@RequestParam(name = "name", description = "학교 이름 검색어", required = false)
name: String?,
@RequestParam(name = "sch1", description = "학교 코드", required = false)
sch1: String?

15-17: 서비스 주입 및 사용이 적절합니다.

생성자를 통한 의존성 주입은 좋은 방식이며, 서비스 메서드가 모든 필요한 매개변수와 함께 올바르게 호출되고 있습니다.

오류 처리를 개선하기 위해 try-catch 블록을 추가하는 것이 좋습니다. 예를 들어:

fun getSchools(
    // ... 매개변수 ...
) = try {
    querySchoolService.execute(gubun, region, name, sch1)
} catch (e: Exception) {
    // 적절한 오류 응답 반환
    // 예: ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("오류 발생: ${e.message}")
}

이렇게 하면 예기치 않은 오류가 발생했을 때 더 우아하게 처리할 수 있습니다.

Also applies to: 30-30

src/main/kotlin/org/meogo/domain/comment/presentation/CommentController.kt (2)

18-18: @Tag 어노테이션 추가 승인 및 개선 제안

CommentController 클래스에 @Tag(name = "Comment API") 어노테이션을 추가한 것은 적절합니다. 이는 API 문서화를 개선하고 엔드포인트를 더 잘 구성하는 데 도움이 됩니다.

태그 이름을 더 구체적으로 만들어 API의 목적을 더 잘 반영할 수 있습니다. 예를 들어, "댓글 관리 API" 또는 "Comment Management API"와 같이 변경하는 것을 고려해 보세요.


25-25: @Operation 어노테이션 추가 승인 및 개선 제안

createdelete 메서드에 각각 @Operation(summary = "댓글 작성")@Operation(summary = "댓글 삭제") 어노테이션을 추가한 것은 적절합니다. 이는 각 API 엔드포인트의 목적을 명확히 설명하여 문서화를 개선합니다.

각 작업에 대해 더 자세한 설명을 제공하기 위해 description 매개변수를 추가하는 것을 고려해 보세요. 예를 들어:

@Operation(
    summary = "댓글 작성",
    description = "사용자가 제공한 내용으로 새 댓글을 생성합니다. 댓글 ID는 자동으로 생성됩니다."
)

이렇게 하면 API 사용자에게 각 엔드포인트에 대한 더 상세한 정보를 제공할 수 있습니다.

Also applies to: 33-33

src/main/kotlin/org/meogo/domain/bookmark/presentation/BookmarkController.kt (2)

22-25: 북마크 생성 메서드 문서화 개선 승인

@operation과 @ResponseStatus 어노테이션 추가로 API 문서화가 개선되었습니다.

메서드의 반환 타입을 명시적으로 지정하는 것이 좋습니다. 예를 들어:

fun create(@RequestParam(name = "school_id") schoolId: Int): ResponseEntity<Unit> =
    ResponseEntity.ok(bookmarkService.execute(schoolId))

이렇게 하면 API의 응답 형식이 더 명확해집니다.


28-36: 북마크 조회 메서드들의 문서화 개선 승인

myBookmarks와 isBookmarked 메서드에 @operation 어노테이션이 적절히 추가되어 API 문서화가 개선되었습니다.

일관성을 위해 이 메서드들에도 @ResponseStatus 어노테이션을 추가하는 것이 좋습니다. 예를 들어:

@ResponseStatus(HttpStatus.OK)
@GetMapping("/query/my")
fun myBookmarks() = ...

@ResponseStatus(HttpStatus.OK)
@GetMapping("/query")
fun isBookmarked(@RequestParam(name = "school_id") schoolId: Int) = ...

이렇게 하면 모든 메서드에서 일관된 응답 상태 처리를 보장할 수 있습니다.

src/main/kotlin/org/meogo/global/utill/FcmUtil.kt (1)

18-29: 디버깅 출력문 제거 및 메서드 승인

sendMessage 메서드의 로직은 올바르게 구현되었습니다. 그러나 프로덕션 코드에서는 디버깅을 위한 println 문을 제거하는 것이 좋습니다.

다음과 같이 디버깅 출력문을 제거하는 것을 제안합니다:

fun sendMessage(fcmToken: List<String>, title: String, message: String) {
    val message = messageSetting(fcmToken, title, message)

-   println("호우")
    try {
        firebase.sendMulticastAsync(message)
    } catch (e: FirebaseMessagingException) {
        throw FcmException
    }

-   println("이게되네")
}
🧰 Tools
🪛 detekt

[warning] 24-24: The caught exception is swallowed. The original exception could be lost.

(detekt.exceptions.SwallowedException)

src/main/kotlin/org/meogo/domain/user/presentation/UserController.kt (4)

3-4: OpenAPI 주석 추가에 대한 승인

OpenAPI 주석을 추가한 것은 API 문서화를 개선하는 좋은 방법입니다. @Tag 주석을 사용하여 컨트롤러를 "User API"로 분류한 것도 적절합니다.

더 나은 일관성을 위해 @Tag(name = "User API")@Tag(name = "사용자 API")로 변경하는 것을 고려해 보세요. 이렇게 하면 한글로 작성된 다른 주석들과 일치하게 됩니다.

Also applies to: 28-28


47-50: 로그인 메서드 추가 승인

새로 추가된 signIn 메서드는 사용자 로그인 기능을 적절히 처리하고 있습니다. OpenAPI 주석도 메서드의 목적을 잘 설명하고 있습니다.

일관성을 위해 @Valid 어노테이션을 UserSignInRequest에도 추가하는 것을 고려해 보세요. 이는 signUp 메서드에서 사용된 방식과 일치하며, 입력 유효성 검사를 보장합니다.

fun signIn(@Valid @RequestBody request: UserSignInRequest): TokenResponse =
    userSignInService.execute(request)

52-60: 계정 ID 확인 및 마이페이지 메서드 추가 승인

checkAccountIdmyPage 메서드가 적절히 추가되었습니다. 두 메서드 모두 목적을 잘 설명하는 OpenAPI 주석이 포함되어 있습니다.

checkAccountId 메서드의 경우, HTTP 상태 코드를 명시적으로 설정하는 것이 좋습니다. 예를 들어:

@ResponseStatus(HttpStatus.OK)
fun checkAccountId(@RequestBody request: UserCheckRequest): Boolean =
    userCheckAccountIdService.execute(request)

이렇게 하면 API 사용자에게 예상되는 응답 상태를 명확히 전달할 수 있습니다.


Line range hint 62-70: 프로필 업데이트 메서드 추가 승인

updateProfile 메서드가 적절히 추가되었습니다. 파일 업로드와 사용자 데이터 수정을 동시에 처리하는 방식이 좋습니다.

  1. 반환 타입을 명시적으로 지정하는 것이 좋습니다. 예를 들어, 작업 성공 시 Unit을 반환하도록 할 수 있습니다.

  2. 파일 업로드 실패에 대한 예외 처리를 고려해 보세요. 예를 들어:

@PatchMapping("/modify")
@ResponseStatus(HttpStatus.OK)
fun updateProfile(
    @RequestPart(name = "image", required = false)
    file: MultipartFile?,
    @Valid @RequestPart(name = "request")
    request: UserModifyRequest
): Unit = modifyUserInfoService.execute(request, file)

이렇게 하면 API의 동작이 더 명확해지고, 클라이언트 측에서 예외 상황을 더 잘 처리할 수 있습니다.

src/main/kotlin/org/meogo/domain/post/presentation/PostController.kt (5)

26-26: API 태그 추가 승인 및 개선 제안

"Community API" 태그 추가는 API 문서화를 개선하는 좋은 변경사항입니다. 더 나은 일관성을 위해 태그 이름을 영어로 변경하는 것을 고려해 보세요.

다음과 같이 변경하는 것을 고려해 보세요:

-@Tag(name = "Community API")
+@Tag(name = "Community API", description = "게시글 관련 API")

Line range hint 39-49: create 메서드에 대한 @operation 어노테이션 추가 승인 및 개선 제안

create 메서드에 대한 @operation 어노테이션 추가는 API 문서화를 개선하는 좋은 변경사항입니다. 국제적 사용을 위해 영어 설명을 추가하는 것을 고려해 보세요.

다음과 같이 변경하는 것을 고려해 보세요:

-@Operation(summary = "게시글 작성")
+@Operation(summary = "게시글 작성", description = "Create a new post")

Line range hint 56-65: modify 메서드에 대한 @operation 어노테이션 수정 필요

@operation 어노테이션 추가는 좋은 변경이지만, 현재 요약문에 오류가 있습니다. 메서드 이름은 "modify"이고 게시글을 수정하는 것 같은데, 요약문은 "댓글 수정"이라고 되어 있습니다.

다음과 같이 수정하는 것을 제안합니다:

-@Operation(summary = "댓글 수정")
+@Operation(summary = "게시글 수정", description = "Modify an existing post")

66-73: queryAll 및 querySchool 메서드에 대한 @operation 어노테이션 추가 승인 및 개선 제안

queryAllquerySchool 메서드에 대한 @operation 어노테이션 추가는 API 문서화를 개선하는 좋은 변경사항입니다. 국제적 사용을 위해 영어 설명을 추가하는 것을 고려해 보세요.

다음과 같이 변경하는 것을 고려해 보세요:

-@Operation(summary = "모든 게시글 조회")
+@Operation(summary = "모든 게시글 조회", description = "Query all posts")

-@Operation(summary = "학교별 게시글 조회")
+@Operation(summary = "학교별 게시글 조회", description = "Query posts by school")

74-82: queryPostDetail 및 queryMyPosts 메서드에 대한 @operation 어노테이션 추가 승인 및 개선 제안

queryPostDetailqueryMyPosts 메서드에 대한 @operation 어노테이션 추가는 API 문서화를 개선하는 좋은 변경사항입니다. 국제적 사용을 위해 영어 설명을 추가하는 것을 고려해 보세요.

다음과 같이 변경하는 것을 고려해 보세요:

-@Operation(summary = "게시글 상세보기")
+@Operation(summary = "게시글 상세보기", description = "Query post details")

-@Operation(summary = "내가 쓴 게시글 조회")
+@Operation(summary = "내가 쓴 게시글 조회", description = "Query my posts")
src/main/kotlin/org/meogo/domain/review/presentation/ReviewController.kt (5)

Line range hint 29-41: 클래스 어노테이션 및 생성자 매개변수 추가 승인

@tag 어노테이션 추가와 생성자 매개변수 주입은 좋은 변경사항입니다. API 문서화가 개선되고 의존성 주입 패턴을 따르고 있습니다.

생성자 매개변수가 많아 가독성이 떨어질 수 있습니다. 필요하다면 빌더 패턴이나 팩토리 메서드를 고려해 보세요.


Line range hint 42-52: 리뷰 생성 메서드 추가 승인

리뷰 생성을 위한 새로운 메서드가 적절히 추가되었습니다. @operation 어노테이션을 통해 API 문서화가 개선되었습니다.

images 매개변수에 대한 null 체크나 빈 리스트 처리를 고려해 보세요. 또한, 대용량 파일 업로드에 대한 제한을 설정하는 것이 좋을 수 있습니다.


Line range hint 58-66: 리뷰 수정 메서드 추가 승인

리뷰 수정을 위한 새로운 메서드가 적절히 추가되었습니다. @operation 어노테이션을 통해 API 문서화가 개선되었습니다.

images 매개변수에 대한 null 체크나 빈 리스트 처리를 고려해 보세요. 또한, 존재하지 않는 리뷰 ID에 대한 예외 처리를 추가하는 것이 좋을 수 있습니다.


67-72: 리뷰 삭제 메서드 추가 승인

리뷰 삭제를 위한 새로운 메서드가 적절히 추가되었습니다. @operation 어노테이션을 통해 API 문서화가 개선되었습니다.

존재하지 않는 리뷰 ID에 대한 예외 처리를 추가하는 것이 좋을 수 있습니다. 또한, 삭제 작업의 성공 여부를 반환하는 것을 고려해 보세요.


Line range hint 86-90: 학교 일치 여부 확인 메서드 추가 승인

학교 ID 일치 여부를 확인하는 새로운 메서드가 적절히 추가되었습니다. @operation 어노테이션을 통해 API 문서화가 개선되었습니다.

메서드 이름을 isSchoolMatch로 변경하는 것을 고려해 보세요. 이는 boolean 값을 반환하는 메서드의 일반적인 네이밍 컨벤션에 더 부합합니다.

src/main/kotlin/org/meogo/global/config/FcmConfig.kt (1)

31-31: 임시 파일 삭제의 성공 여부를 확인하세요.

tempfile.delete()의 반환값을 확인하여 파일이 정상적으로 삭제되었는지 확인하고, 실패 시 적절한 조치를 취하는 것이 좋습니다.

코드 수정 예시:

if (!tempfile.delete()) {
    // 파일 삭제 실패에 대한 처리 로직 추가
    logger.warn("임시 파일 삭제 실패: {}", PATH)
}
src/main/kotlin/org/meogo/global/feign/CareerFeignClientService.kt (1)

40-40: 불필요한 lettoString()을 제거하세요.

schooGubun을 설정할 때 lettoString()은 필요하지 않습니다. school.schoolGubun을直接 사용하시면 됩니다.

수정 제안:

-    schoolGubun = school.let { it.schoolGubun }.toString(),
+    schoolGubun = school.schoolGubun,
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between d194646 and fdb08af.

📒 Files selected for processing (21)
  • build.gradle.kts (1 hunks)
  • src/main/kotlin/org/meogo/MeogoBackendApplication.kt (1 hunks)
  • src/main/kotlin/org/meogo/domain/bookmark/presentation/BookmarkController.kt (2 hunks)
  • src/main/kotlin/org/meogo/domain/comment/presentation/CommentController.kt (2 hunks)
  • src/main/kotlin/org/meogo/domain/post/presentation/PostController.kt (5 hunks)
  • src/main/kotlin/org/meogo/domain/question/presentation/QuestionController.kt (4 hunks)
  • src/main/kotlin/org/meogo/domain/review/presentation/ReviewController.kt (5 hunks)
  • src/main/kotlin/org/meogo/domain/school/domain/School.kt (1 hunks)
  • src/main/kotlin/org/meogo/domain/school/enum/Gubun.kt (1 hunks)
  • src/main/kotlin/org/meogo/domain/school/presentation/SchoolController.kt (1 hunks)
  • src/main/kotlin/org/meogo/domain/school/service/QuerySchoolService.kt (1 hunks)
  • src/main/kotlin/org/meogo/domain/user/presentation/UserController.kt (4 hunks)
  • src/main/kotlin/org/meogo/global/config/FcmConfig.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/error/exception/ErrorCode.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/feign/CareerFeignClient.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/feign/CareerFeignClientService.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/feign/CareerSchoolResponse.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/feign/FeignProperty.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/utill/FcmUtil.kt (1 hunks)
  • src/main/kotlin/org/meogo/global/utill/exception/FcmException.kt (1 hunks)
  • src/main/resources/application.yml (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/main/kotlin/org/meogo/domain/school/domain/School.kt
🧰 Additional context used
🪛 detekt
src/main/kotlin/org/meogo/global/utill/FcmUtil.kt

[warning] 24-24: The caught exception is swallowed. The original exception could be lost.

(detekt.exceptions.SwallowedException)

🔇 Additional comments (27)
src/main/kotlin/org/meogo/global/feign/CareerSchoolResponse.kt (1)

3-5: LGTM: CareerSchoolListResponse 클래스가 잘 구현되었습니다.

CareerSchoolListResponse 클래스가 API 응답을 적절히 캡슐화하고 있습니다. 구조가 명확하고 간결합니다.

src/main/kotlin/org/meogo/domain/school/service/QuerySchoolService.kt (1)

1-6: 패키지 선언과 임포트가 적절합니다.

패키지 선언과 임포트가 클래스의 기능에 맞게 올바르게 작성되었습니다.

src/main/kotlin/org/meogo/MeogoBackendApplication.kt (1)

7-9: OpenFeign 지원이 올바르게 추가되었습니다.

OpenFeign 의존성 추가와 @EnableFeignClients 어노테이션 적용이 적절히 이루어졌습니다. 이는 선언적 REST 클라이언트 기능을 사용할 수 있게 해줍니다.

개선 제안: 프로젝트의 패키지 구조에 따라 basePackages를 더 구체적으로 지정하는 것이 좋을 수 있습니다. 예를 들어, Feign 클라이언트가 특정 하위 패키지에만 있다면 ["org.meogo.infrastructure.feign"]과 같이 지정할 수 있습니다.

다음 스크립트를 실행하여 Feign 클라이언트 구현을 확인하세요:

✅ Verification successful

OpenFeign 지원이 올바르게 추가되었습니다.

OpenFeign 의존성 추가와 @EnableFeignClients 어노테이션 적용이 적절히 이루어졌습니다. 현재 basePackages["org.meogo.global.feign"]으로 설정하는 것이 Feign 클라이언트의 직접적인 위치를 반영하여 더 구체적이고 효율적일 수 있습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Feign 클라이언트 인터페이스 검색
echo "Feign 클라이언트 인터페이스:"
rg -t kotlin -C 3 "@FeignClient" src/

Length of output: 739

src/main/resources/application.yml (3)

2-3: 프로파일 설정 검토 필요

'default' 프로파일을 활성화하고 있습니다. 프로덕션 환경에서는 환경별 프로파일(예: 'dev', 'prod')을 사용하는 것이 좋습니다. 이를 통해 환경별로 다른 설정을 적용할 수 있습니다.

환경별 프로파일 설정이 있는지 확인하기 위해 다음 스크립트를 실행하세요:

#!/bin/bash
# 설명: 환경별 프로파일 설정 확인

# 테스트: application-{profile}.yml 파일 검색
fd -e yml -e yaml 'application-.*\.ya?ml$'

51-52: 환경 변수 사용 승인 및 보안 고려사항 제안

${CAREER_KEY}를 사용하여 OpenFeign career 키를 설정한 것은 좋은 방법입니다. 이는 민감한 정보를 관리하는 데 적합합니다.

이 키의 보안을 강화하기 위해 다음 사항을 고려하세요:

  1. 키 순환 정책 구현
  2. 프로덕션 환경에서 암호화된 환경 변수 사용

다음 스크립트를 실행하여 이 키가 소스 코드에 하드코딩되어 있지 않은지 확인하세요:

#!/bin/bash
# 설명: CAREER_KEY가 소스 코드에 하드코딩되어 있는지 확인

# 테스트: 모든 .java 및 .kt 파일에서 CAREER_KEY 문자열 검색
rg -t java -t kotlin 'CAREER_KEY'

14-14: 프로덕션 환경에서 SQL 로깅 비활성화 권장

show-sql: true 설정은 SQL 문을 로깅하여 디버깅에 유용하지만, 프로덕션 환경에서는 성능에 영향을 줄 수 있습니다. 프로덕션 환경에서는 이 설정을 비활성화하는 것이 좋습니다.

프로파일별로 이 설정이 다르게 적용되는지 확인하기 위해 다음 스크립트를 실행하세요:

src/main/kotlin/org/meogo/global/feign/CareerFeignClient.kt (1)

1-5: 패키지 선언과 임포트가 적절합니다.

패키지 이름과 임포트된 클래스들이 Feign 클라이언트 인터페이스에 적합합니다.

src/main/kotlin/org/meogo/domain/school/presentation/SchoolController.kt (1)

1-10: 패키지 구조와 임포트가 적절합니다.

패키지 구조가 도메인 주도 설계 접근 방식을 따르고 있으며, 필요한 모든 임포트가 포함되어 있습니다. 사용하지 않는 임포트도 없습니다.

src/main/kotlin/org/meogo/domain/comment/presentation/CommentController.kt (1)

3-4: OpenAPI 어노테이션 임포트 추가 승인

OpenAPI 문서화를 위한 OperationTag 어노테이션의 임포트가 적절히 추가되었습니다. 이는 API 문서화 개선에 필요한 변경사항입니다.

src/main/kotlin/org/meogo/domain/bookmark/presentation/BookmarkController.kt (4)

3-4: OpenAPI 어노테이션 임포트 추가 승인

OpenAPI 어노테이션을 위한 필요한 임포트문이 적절히 추가되었습니다.


15-15: API 태그 추가 승인

"Bookmark API"로 컨트롤러를 태그하여 API 문서화와 구조화가 개선되었습니다. 이는 API 사용자에게 더 나은 탐색 경험을 제공할 것입니다.


Line range hint 38-42: 북마크 삭제 메서드 문서화 개선 승인

delete 메서드에 @operation과 @ResponseStatus 어노테이션이 적절히 추가되었습니다. NO_CONTENT 상태 코드는 삭제 작업에 적합합니다.

이 변경사항으로 API의 동작과 응답이 더 명확해졌습니다.


Line range hint 1-43: 전체 리뷰 요약

이 PR은 BookmarkController의 API 문서화를 크게 개선했습니다. 주요 변경 사항은 다음과 같습니다:

  1. OpenAPI 어노테이션 추가로 API 구조와 기능이 명확해졌습니다.
  2. @tag 어노테이션으로 API가 적절히 분류되었습니다.
  3. 각 메서드에 @operation 어노테이션이 추가되어 기능 설명이 개선되었습니다.
  4. 일부 메서드에 @ResponseStatus 어노테이션이 추가되어 HTTP 응답 상태가 명확해졌습니다.

이러한 변경으로 API 사용자의 이해도와 사용성이 향상될 것입니다. 몇 가지 작은 개선 사항을 제안했지만, 전반적으로 변경 사항은 긍정적이며 승인을 권장합니다.

src/main/kotlin/org/meogo/global/utill/FcmUtil.kt (2)

1-17: LGTM: 클래스 구조와 임포트가 적절합니다.

클래스 구조와 임포트가 잘 정의되어 있습니다. @Component 어노테이션을 사용하여 Spring 빈으로 올바르게 설정되었으며, 필요한 모든 임포트가 포함되어 있습니다. firebase 프로퍼티의 지연 초기화도 적절히 구현되었습니다.


31-55: LGTM: messageSetting 메서드가 잘 구현되었습니다.

messageSetting 메서드는 Android와 iOS(APNS) 플랫폼 모두에 대해 적절하게 구성된 MulticastMessage를 생성합니다. 알림 제목과 본문이 올바르게 설정되었으며, 각 플랫폼에 대한 커스텀 데이터도 잘 추가되었습니다. 메서드의 구조와 구현이 훌륭합니다.

src/main/kotlin/org/meogo/domain/user/presentation/UserController.kt (1)

Line range hint 38-45: 회원가입 메서드에 대한 OpenAPI 주석 승인

signUp 메서드에 @Operation(summary = "회원가입") 주석을 추가한 것은 적절합니다. 이는 API 사용자에게 엔드포인트의 목적을 명확히 전달합니다.

src/main/kotlin/org/meogo/domain/post/presentation/PostController.kt (1)

3-4: OpenAPI 어노테이션 추가 승인

OpenAPI 어노테이션을 위한 import 추가는 API 문서화를 개선하는 좋은 변경사항입니다.

src/main/kotlin/org/meogo/domain/question/presentation/QuestionController.kt (7)

3-4: OpenAPI 주석 추가에 대한 승인

OpenAPI 주석을 추가한 것은 API 문서화를 개선하는 좋은 방법입니다. @Tag 주석을 사용하여 "Question API"로 컨트롤러를 분류한 것도 적절합니다.

Also applies to: 26-26


37-37: createQuestion 메서드에 대한 @operation 주석 승인

createQuestion 메서드에 "질문 작성"이라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다. 이는 API 사용자에게 명확한 정보를 제공합니다.


45-45: modifyQuestion 메서드에 대한 @operation 주석 승인

modifyQuestion 메서드에 "질문 수정"이라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다. 이는 메서드의 기능을 명확히 설명합니다.


55-55: querySchoolQuestion 메서드에 대한 @operation 주석 승인

querySchoolQuestion 메서드에 "학교별 질문 조회"라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다. 이는 메서드의 기능을 정확히 설명합니다.


60-60: queryTypeQuestion 메서드에 대한 @operation 주석 승인

queryTypeQuestion 메서드에 "학교별 + 태그별 질문 조회"라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다. 이는 메서드의 기능을 정확히 설명하며, 학교와 태그 모두를 기준으로 질문을 조회한다는 점을 명확히 합니다.


67-67: queryDetail 메서드에 대한 @operation 주석 승인

queryDetail 메서드에 "질문 상세보기"라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다. 이는 메서드의 기능을 명확히 설명하며, API 사용자에게 유용한 정보를 제공합니다.


72-72: deleteQuestion 메서드 변경 승인

  1. deleteQuestion 메서드에 "질문 삭제"라는 요약을 포함한 @Operation 주석을 추가한 것은 적절합니다.
  2. @DeleteMapping 주석에서 괄호를 제거한 것은 Spring의 표준 사용법에 더 잘 부합합니다.

이러한 변경사항들은 API 문서화를 개선하고 코드의 일관성을 높입니다.

Also applies to: 74-74

src/main/kotlin/org/meogo/domain/review/presentation/ReviewController.kt (3)

3-4: Swagger 어노테이션 추가 승인

Swagger 어노테이션을 위한 import 추가는 API 문서화를 개선하는 좋은 변경사항입니다.


53-57: 학교별 리뷰 조회 메서드 추가 승인

학교 ID로 리뷰를 조회하는 새로운 메서드가 적절히 추가되었습니다. @operation 어노테이션을 통해 API 문서화가 개선되었습니다.


73-85: 리뷰 사진 조회, 학교 리뷰 결과 조회, 키워드 조회 메서드 추가 승인

리뷰 사진 조회, 학교 리뷰 결과 조회, 키워드 조회를 위한 새로운 메서드들이 적절히 추가되었습니다. 각 메서드에 @operation 어노테이션을 통해 API 문서화가 개선되었습니다.

@meltapplee meltapplee merged commit 0624df3 into main Oct 21, 2024
2 checks passed
@meltapplee meltapplee deleted the 52-feignClient branch October 21, 2024 05:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
기능개발 make something
Projects
None yet
Development

Successfully merging this pull request may close these issues.

FeignClient
1 participant