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

Refactor: #3의 GPT 리뷰를 반영하여 수정하였습니다 #5

Merged
merged 9 commits into from
May 9, 2024

Conversation

belljun3395
Copy link
Collaborator

🎫 연관 티켓

이슈 없이 진행합니다.

🙏 작업

  • 메서드에 설명을 위한 주석을 추가합니다.
  • 잘못 구현된 isPresent 메서드 구현을 수정합니다.
  • 요청, 응답 lombok 설정을 통일합니다.
  • 컨트롤러 테스트에서 double 타입 기본 값을 설정합니다.

💁‍♂️ 어떻게?

  • epageRestDocs 버젼을 올려 double 타입 기본 값을 설정합니다.

🙈 PR 참고 사항

📸 스크린샷

🤖 테스트 체크리스트

  • 체크 미완료
  • 체크 완료

@belljun3395 belljun3395 requested review from nove1080 and Moon-1C May 6, 2024 15:40
@belljun3395 belljun3395 self-assigned this May 6, 2024
}

private OptionalTrafficPointParamArgumentResolver addOptionalTrafficPointParamArgumentResolver() {
return new OptionalTrafficPointParamArgumentResolver();
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드 패치의 주요 문제는 addArgumentResolvers 메서드에서 addOptionalViewPointParamArgumentResolveraddOptionalTrafficPointParamArgumentResolver 메서드를 호출하는 방법입니다.

  1. 위의 변경사항은 기능적으로 오류가 발생할 가능성이 없으나, 복잡성을 증가시켜 유지 보수를 어렵게 할 수 있습니다.
  2. 이러한 작은 메서드들은 의미 단위로 추상화되고 코드의 가독성을 향상시킬 수 있지만, 실제로 사용하지 않는 한 필요하지 않을 수 있습니다.
  3. 추가적으로 메서드 이름에서 "add"라는 접두어는 이미 목록에 항목을 추가하는 기능을 나타내므로 중복되는 정보를 제공합니다. 메서드 이름을 단순하게 바꿔주는 것이 좋을 수 있습니다.

이러한 수정 및 개선 사항:

  • 상속된 addArgumentResolvers 메서드에서 직접 resolvers.add(new OptionalViewPointParamArgumentResolver())resolvers.add(new OptionalTrafficPointParamArgumentResolver())를 사용하는 대신 해당 인스턴스를 바로 추가할 수 있습니다. 예를 들어, resolvers.add(new OptionalViewPointParamArgumentResolver());를 대신하여 resolvers.add(new OptionalViewPointParamArgumentResolver());을 사용할 수 있습니다.
  • 만약 메서드 호출을 유지하려면, 람다 또는 메서드 참조를 사용하여 더 간결하게 표현할 수 있습니다.

그 외에는 개선 사항이 필요하지 않습니다.

public static OrderFilter ofRequest(String source) {
if (Objects.isNull(source) || source.isEmpty()) {
return CREATEDAT;
}
return OrderFilter.valueOf(source.toUpperCase());
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드 패치는 좋은 상태로 보입니다. 그러나 몇 가지 개선을 제안하려 합니다:

  1. Objects.isNull(source) || source.isEmpty() 표현 대신에 source == null || source.isEmpty() 를 고려해보세요. Objects.isNull를 사용하는 것은 지나치게 방어적이 될 수 있습니다.

  2. OrderFilter.valueOf(source.toUpperCase())에서 valueOf 메서드 사용은 예외를 발생시킬 수 있으므로, 이 부분에 대한 적절한 오류 처리가 필요합니다.

  3. Javadoc 주석 양식을 일정하게 유지하고 @param@return 태그 설명을 향상하여 이해하기 쉽도록 해주세요.

  4. 메서드 이름인 ofRequest는 요청에 따라 정렬할 필드를 반환하는데 이 작업과 연결될 수 있는 더 명확한 이름을 선택하는 것이 도움이 될 수 있습니다.

  5. CREATEDAT와 같은 enum 상수명은 대문자 스네이크 케이스(UPPER_CASE_WITH_UNDERSCORES)를 사용하는 관습에 따라 CREATED_AT 형식으로 변경하는 것이 좋습니다.

코드의 기능적 안전성은 유지되지만 위의 제안 사항을 고려하여 코드를 더욱 깔끔하고 유지보수가 용이하도록 개선할 수 있습니다.

* 요청에 즐겨찾기 저장을 위한 이름이 있는지 확인합니다.
*
* @return 즐겨찾기 저장을 위한 이름이 없는 경우 true, 그렇지 않은 경우 false
*/
public boolean hasName() {
return Objects.isNull(name) || name.isEmpty();
}
Copy link

Choose a reason for hiding this comment

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

이 코드 변경 사항은 대체로 안전해 보입니다.

버그 위험:

  • @Setter 주석 처리된 부분에서 name 필드를 수정하는 메소드가 제거되었는데, 이 변경은 해당 필드에 대한 값을 변경하지 못하게 만들 수 있습니다.

개선 제안:

  • @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하여 기본 생성자의 접근 수준을 조정하는 것은 권장되는 방법입니다.
  • 코드 주석을 수정하여 즐겨찾기 이름이 있는지 확인하는 메서드의 설명을 더 명확하게 작성할 수 있습니다.
  • hasName() 메서드의 리턴 형식을 !Objects.nonNull(name) || name.isEmpty()와 같이 변경하여 코드를 간소화할 수 있고 가독성도 향상됩니다.

위 내용을 포함하여 코드를 수정 및 개선하는 데 참고하시기 바랍니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class PatchFavoritePathNameBody {

Copy link

Choose a reason for hiding this comment

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

이 코드는 대체로 깔끔하나 몇 가지 개선사항이 있습니다:

  1. @Setter 주석 처리는 필드들에게 Setter를 부여하지 않는다는 점을 알려줍니다.
  2. @NoArgsConstructoraccessAccessLevel.PROTECTED로 설정되었으므로 외부에서 직접적으로 사용할 수 없습니다. 이것은 바람직합니다.
  3. Lombok 애노테이션을 통해 Getter와 Setter를 모두 사용하는 것이 권장됨으로, 이 경우 Setter를 다시 추가하는 것을 고려할 수 있습니다.

버그의 위험이 크지는 않아 보입니다. 코드 스타일과 일관성을 유지하기 위해 일관된 방법으로 Lombok 애노테이션을 사용하도록 유지하십시오.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class EndPointParam {

Copy link

Choose a reason for hiding this comment

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

이 코드는 Lombok을 사용하여 Getter, ToString 및 EqualsAndHashCode를 생성하며, 상위 방법에 대한 접근 권한을 설정합니다.

버그 위험:

  1. @Getter, @Setter가 모두 주석 처리되었습니다. 이로 인해 클래스의 필드에 직접 액세스하는 데 어려움이 있을 수 있습니다.
  2. @NoArgsConstructorPROTECTED로 설정되어 있습니다. 클래스 외부에서 기본 생성자에 대한 접근이 제한될 수 있습니다.

개선 제안:

  1. @Getter, @Setter를 다시 활성화하여 필요한 경우에만 Setter 메서드를 사용할 수 있도록 합니다.
  2. @NoArgsConstructor(access = AccessLevel.PROTECTED)을 변경하여 public으로 업데이트하여 클래스 외부에서 쉽게 객체를 인스턴스화할 수 있도록 합니다.
  3. 필요에 따라서는 불필요한 import 문을 정리합니다.

전반적으로 이 코드는 간단하지만 몇 가지 수정사항이 있습니다. 에러를 방지하고 더 효율적인 코드를 작성하려면 위의 제안을 고려할 수 있습니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class NowPointParam {

Copy link

Choose a reason for hiding this comment

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

기능적으로는 문제가 없어 보입니다. 일부 개선 제안 사항은 다음과 같습니다:

  1. @Setter 어노테이션을 제거한 것은 좋은 선택일 수 있습니다. 불변성을 유지하고자 할 때 효과적입니다.
  2. @AllArgsConstructor 어노테이션을 다음처럼 변경하는 것이 좋습니다:
    • @AllArgsConstructor(access = AccessLevel.PRIVATE): 생성자를 private으로 설정하여 외부에서 객체를 생성하는 데 필요한 정보를 명확히 할 수 있습니다.
    • @NoArgsConstructor(access = AccessLevel.PROTECTED): 디폴트 생성자를 protected로 설정하여 상속 관련 문제에 대비할 수 있습니다.

이 코드에 대해 추가로 고려해야 할 점은 주석, 예외 처리 및 외부 종속성에 대한 관리 등입니다.

@@ -25,6 +26,6 @@ public Optional<TrafficPointParam> get() {
}

public boolean isPresent() {
return Objects.isNull(trafficPointParam);
return Objects.nonNull(trafficPointParam);
}
}
Copy link

Choose a reason for hiding this comment

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

코드 리뷰:

  1. @Getter 애노테이션을 추가하여 클래스의 getter 메서드를 생성하도록 했습니다.

  2. @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하여 기본 생성자를 protected로 만들었습니다. 이것은 클래스 외부에서 직접 접근하지 못하도록 합니다.

  3. isPresent() 메서드에서 오브젝트가 null이 아닌 경우 true를 반환하도록 수정되었습니다.

개선 제안:

  • @AllArgsConstructor는 사용된 것 같지만, 필요한 경우에만 사용하는 것이 좋습니다. 모든 필드에 대한 생성자를 자동으로 생성합니다.
  • @Builder를 사용하였으나, 해당 클래스의 사용 방법에 대한 추가 설명 및 주석이 필요합니다.
  • 필요에 따라 메서드에 Javadoc 주석을 추가하여 코드의 가독성을 높일 수 있습니다.

@@ -24,6 +25,6 @@ public Optional<ViewPointParam> get() {
}

public boolean isPresent() {
return Objects.isNull(viewPointParam);
return Objects.nonNull(viewPointParam);
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드는 Lombok과 Java의 Optional 클래스를 사용하여 작성된 것 같습니다. 몇 가지 개선 제안은 다음과 같습니다:

  1. @Getter 애너테이션만 사용하고 @Setter 애너테이션을 삭제함으로써 불필요한 변경 사항을 방지합니다.
  2. @NoArgsConstructor(access = AccessLevel.PROTECTED)를 이용하여 매개변수 없는 생성자를 protected로 만들어 외부에서 인스턴스화를 방지할 수 있습니다.
  3. isPresent() 메서드의 구현은 Objects.nonNull(viewPointParam)으로 수정되어야 합니다. 현재 코드는 Objects.isNull(viewPointParam)으로 잘못 지정되어 있습니다.

잠재적 버그 리스크:

  1. @NoArgsConstructor(access = AccessLevel.PROTECTED)를 추가하여 생성자가 protected로 만들어진다면, 해당 클래스의 하위 클래스가 새 객체를 만들 때 문제가 될 수 있습니다. 이 점에 유의해야 합니다.

이러한 개선 사항을 고려하여 코드를 수정하면 더욱 안전하고 깔끔한 코드를 유지할 수 있습니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class RoutePointParam {

Copy link

Choose a reason for hiding this comment

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

이 코드에서는 Lombok을 사용하여 Getter, ToString, EqualsAndHashCode을 제공하고 있습니다. Setter가 주석 처리되어 있는 것은 Immutable한 객체를 만들기 위해 setter를 사용하지 않으려는 의도로 보입니다.

개선 제안:

  • @Setter를 사용하지 않는 방향으로 가는 것이 좋습니다.
  • @NoArgsConstructor(access = AccessLevel.PROTECTED)로 설정하여 외부에서 객체를 생성하는 것을 제한할 수 있습니다.
  • 변수에 대한 validation이 필요하다면 추가적인 validation 관련 어노테이션을 고려해볼 가치가 있습니다.

버그 리스크:

  • 즉, LatParam 및 LngParam 클래스의 유효성 검사 로직이 없으면 데이터 무결성 문제가 발생할 수 있습니다.
  • 객체에 null값을 가진 필드가 많은 경우 NullPointException의 위험이 있습니다.

다른 개선 사항 및 버그를 발견하게 되면 그에 따라 이러한 부분들 더 세세하게 확인해보길 권장드립니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class StartPointParam {

Copy link

Choose a reason for hiding this comment

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

이 코드 패치에 대한 간단한 코드 리뷰를 해 드리겠습니다.

  1. 개선 사항:

    • @Setter 애노테이션이 제거되어 필드 값을 변조할 수 없게 되었습니다. 이는 변경 불가능한 객체를 선호하는 경우 유용할 수 있습니다.
    • @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하여 매개변수 없는 생성자의 접근 권한을 Protected로 변경했습니다. 이렇게 하면 클래스 외부에서 생성자를 직접 호출하는 것을 막음으로써 안정성을 개선할 수 있습니다.
  2. 버그 위험:

    • 현재 코드 조각에서는 심각한 버그나 위험이 발견되지 않았습니다.
  3. 추가적인 제안:

    • 변수 이름, 주석의 품질, 메서드 기능 설명 등과 같은 코드 문서화를 향상시키는 작업을 고려해 볼 수 있습니다.
    • 필요하다면, 인스턴스 변수에 유효성 검사 로직을 추가하여 더 견고한 데이터 처리를 할 수 있습니다.

코드 범위가 작기 때문에 보안 문제 또는 성능 관련 문제는 확인되지 않았습니다. 계속해서 테스트 및 코드베이스에 대한 전반적인 리뷰를 수행하는 것이 좋습니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class TrafficPointParam {
/* 신호등 위도 */
Copy link

Choose a reason for hiding this comment

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

이 코드 리뷰에 따르면 다음과 같은 피드백을 제공할 수 있습니다:

  1. @NoArgsConstructor(access = AccessLevel.PROTECTED) 를 지정하여 기본 생성자의 접근 제어 수준을 변경했습니다. 이는 해당 클래스 외부에서 바로 객체를 생성하는 것을 막아 안전성 측면에서 좋은 변화입니다.

  2. @Setter 주석이 제거되어 있습니다. 사실, Lombok의 @Getter, @Setter 어노테이션을 함께 사용시 캡슐화를 해치는 가능성이 있기 때문에 이러한 설계 선택은 좋은 결정입니다.

  3. 주석이 매우 간단합니다. 추가적인 정보와 메서드에 대한 설명을 포함시키는 것이 좋을 수 있습니다.

  4. 완전한 Java 코드 파일의 일부만 있으므로 전체 코드베이스에 대해 더 많은 컨텍스트가 필요할 수 있습니다.

  5. 입출력 유효성 검사처럼 앞으로 추가 구현이 예상된다면 해당 클래스나 인터페이스를 구현하거나 관련 주석을 남겨주는 것이 좋을 수 있습니다.

좀 더 자세한 분석을 위해서는 전체 코드베이스를 확인해야 하지만, 현재 변경 사항에 대한 위험 및 개선 제안은 이것들이라고 할 수 있습니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class ViewPointParam {
/* 화면 좌측 하단 위도 */
Copy link

Choose a reason for hiding this comment

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

위 코드 리뷰:

  1. @Setter 어노테이션은 제거되었습니다. 이 클래스에서는 필드를 수정할 수 있는 setter가 필요하지 않은 것으로 보입니다.
  2. @NoArgsConstructor 어노테이션은 access = AccessLevel.PROTECTED로 변경되었습니다. 이렇게 함으로써 외부에서 해당 클래스의 기본 생성자에 접근하는 것을 막을 수 있습니다.
  3. 중복된 주석이 존재합니다(/* 화면 좌측 하단 위도 */). 주석이 코드와 일치하지 않거나 허용되지 않는 경우 이러한 주석들을 정리하는 것이 도움이 될 수 있습니다.
  4. 잠재적인 개선 사항: 변수 및 메소드가 생기면 유효성 검사를 추가하고, 불필요한 import문이 있는지 확인하여 정리할 수 있습니다.

주의사항:

  • 다음 기능 변경 시 변경된 액세스 레벨 및 어노테이션을 반영해야 합니다.
  • 코드의 일관성을 유지하기 위해 주석과 코드가 일치하도록 유지하세요.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class FavoriteTrafficBody {

Copy link

Choose a reason for hiding this comment

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

주요 변경 사항은 @NoArgsConstructor(access = AccessLevel.PROTECTED) 주석에서 확인할 수 있습니다. 기본 생성자에 액세스 레벨을 PROTECTED로 설정하여 외부에서 직접적으로 객체를 생성하지 못하게 할 수 있습니다. 이로써 객체 생성에 제약을 두어 보다 안전한 코드를 유지할 수 있습니다.

이 코드 패치는 대체적으로 좋은 상태이며 개선할 사항은 발견되지 않았습니다.

@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class PatchFavoriteTrafficNameBody {

Copy link

Choose a reason for hiding this comment

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

이 코드 패치를 간단히 검토해보겠습니다:

  1. 변경된 접근자 수정: @NoArgsConstructor(access = AccessLevel.PROTECTED)는 적절한 수정입니다. 그러나 @Setter가 제거된 것은 클래스 외부에서 상태를 직접 설정할 수 없게 되었다는 점을 고려할 필요가 있습니다.

  2. @Getter@tostring, @EqualsAndHashCode에는 문제가 없어 보입니다.

개선 제안:

  1. @Setter를 완전히 제거한 이유가 명확하지 않으므로 해당 부분에 대한 더 많은 주석을 추가하는 것이 좋습니다.
  2. Validation 어노테이션(예: @NotBlank)을 추가하여 필수 항목을 명확히 할 수 있습니다.
  3. JavaDoc을 추가하여 이 클래스의 목적과 사용 방법을 설명할 수 있습니다.

위의 개선 사항에 대해 고려해보고 위험을 최소화하며 코드의 가독성과 유지 관리를 향상시키는데 도움이 될 것입니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class BrowseFavoriteRouteResponse {

Copy link

Choose a reason for hiding this comment

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

코드 리뷰를 짧게 하겠습니다.

버그 위험:

  • @NoArgsConstructor(access = AccessLevel.PROTECTED) 사용 시, 부모 클래스의 기본 생성자에 대해 새로운 문제가 발생할 수 있음
  • Lombok의 @AllArgsConstructor(access = AccessLevel.PRIVATE)는 유효하지만, 이 클래스 외부에서 객체 인스턴스를 만드는 데 어려움을 초래할 수 있음

개선 제안:

  • 생성자에 디폴트 매개변수 값을 제공하는 방법으로 변경하거나, 생성자를 수동으로 만드는 것을 고려할 수 있음
  • 접근 수준 변경자인 AccessLevel을 사용할 때 해당 변경이 코드의 가독성과 유지 관리성에 어떤 영향을 미치는지 잘 고려 필요

요약하면 코드는 작동할 가능성이 높지만, 접근 수정자 및 생성자 사용에 대한 올바른 이해와 함께 더 나은 해결책을 찾기위한 고려가 필요합니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class BrowseFavoriteTrafficsResponse {

Copy link

Choose a reason for hiding this comment

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

코드 리뷰:

  1. @NoArgsConstructor 어노테이션의 access 속성이 AccessLevel.PROTECTED로 설정되어 있습니다. 이는 필수적이지는 않지만, 이 클래스가 상속 가능한 클래스인 경우에 유용할 수 있습니다.
  2. @AllArgsConstructor 어노테이션의 access 속성이 AccessLevel.PRIVATE로 변경되었습니다. 추가적으로 해당 클래스 상단에서 Lombok의 AccessLevel을 import하는 부분도 존재합니다. 이렇게 함으로써 객체 생성자의 접근 제어 수준이 변경되었습니다. 이 변경이 의도된 것인지 주의깊게 고려해야 합니다.
  3. 다른 부분에서 코드스타일은 일관성을 유지하고 있는 것으로 보입니다.

개선 제안:

  • 명시적인 생성자 대신에 Lombok의 @NoArgsConstructor, @AllArgsConstructor, @Builder를 사용함으로써 코드 중복을 감소시킬 수 있습니다. 이는 오류 발생 가능성을 줄여주며 가독성을 향상시킵니다.
  • 코드베이스 전체에서 @Getter, @ToString, @EqualsAndHashCode 어노테이션들이 일관되게 사용되고 있는지 확인해보세요. 코드 일관성 유지에 도움이 됩니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class BrowseTrafficsResponse {

Copy link

Choose a reason for hiding this comment

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

코드 리뷰:

  1. @NoArgsConstructor@AllArgsConstructor 어노테이션을 보면 access level이 변경되었습니다. 이런 변경 사항들은 주의해야 합니다. 기존 동작에 영향을 줄 수 있습니다.

  2. 모든 필드를 초기화하는 생성자가 private로 설정되어있는데, 상속 및 테스트 등에서 문제를 일으킬 수 있습니다. 다른 액세스 레벨을 고려해야 합니다.

  3. 코드 스타일과 일관성을 위해 @AllArgsConstructor@NoArgsConstructor 어노테이션들의 위치도 재조정하는 것이 좋을 수 있습니다.

  4. DTO 클래스에 Serializable 인터페이스를 구현하는 것이 안전할 수 있습니다.

  5. JavaDoc을 제공하여 클래스 및 각 메서드에 대한 설명을 추가하는 것이 도움이 될 수 있습니다.

개선 제안:

  • AccessLevel 관련 수정사항을 다시 확인하고 예상되는 영향을 고려합니다.
  • 생성자에 대한 접근 레벨을 다시 설정해서 상황에 맞게 선택합니다.
  • Serializable 인터페이스 구현 여부를 고려합니다.
  • 코드 일관성을 유지하며 JavaDoc 주석 추가를 고려합니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class RouteDetailResponse {

Copy link

Choose a reason for hiding this comment

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

이 코드 패치에 대한 간단한 코드 리뷰를 제공하겠습니다.

  1. RouteDetailResponse 클래스에서 @AllArgsConstructor(access = AccessLevel.PRIVATE)@NoArgsConstructor(access = AccessLevel.PROTECTED) 애노테이션을 사용하여 생성자 접근 제어 수준을 변경하려고 하는 것으로 보입니다. 이것은 좋은 실천이며 캡슐화와 더 나은 제어를 제공할 수 있습니다.

  2. 하지만, @NoArgsConstructor 애노테이션을 추가했지만 해당 클래스 내에 기본 생성자가 없으므로 Lombok이 기본 생성자를 만들지 않을 것입니다. 만약 명시적으로 기본 생성자가 필요하다면 명시적으로 선언해야 합니다.

  3. 다른 개선 제안은 AllArgsConstructor에 대한 접근 수준을 AccessLevel.PRIVATE로 설정하여 클래스 밖에서 직접적인 객체 생성을 막았는데, AccessLevel.PACKAGE를 고려해볼 수 있습니다.

  4. 그 외에는 문제 없어 보입니다.더 자세한 리뷰나 개선 사항을 확인하기 위해서는 전체 코드베이스와 프로젝트 요구사항에 대한 더 많은 정보가 필요합니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class SearchTrafficsResponse {

Copy link

Choose a reason for hiding this comment

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

코드 리뷰:

  1. @NoArgsConstructor 어노테이션의 access 속성은 AccessLevel.PRIVATE로 변경되었는데, 이것은 클래스 외부에서 생성자를 호출하지 못하도록 제한됨을 의미합니다.
  2. @AllArgsConstructor 어노테이션의 access 속성은 AccessLevel.PROTECTED로 변경되었는데, 생성자가 protected로 선언되었기 때문에 상속 관련 사항이 있을 수 있습니다. 확실하지 않다면 해당 변경에 대해 팀 내에서 토의해 보세요.
  3. 코드 스타일은 일관되고 체계적입니다.
  4. 변수 및 메소드 네이밍은 명확하며 이해하기 쉽습니다.
  5. 코드에서 명확한 주석 부재.
  6. 일부만을 지명해서 추가 범위 OCI 규칙 설명과 함께 리뷰하는 방법 고려.

개선 제안:

  1. 클래스 또는 메소드에 필요한 경우 문서화된 주석 추가.
  2. 접근 제어자에 대한 변경에 관해 팀 내 다른 멤버와 확인 후 타당성 여부에 대한 논의.
  3. 코드 내 에러 핸들링과 예외 처리의 유효성 검토 후 필요한 경우 개선.
  4. 단위 테스트 작성 및 실행하여 코드 변화에 따른 영향 분석.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class FavoriteRouteDetail {

Copy link

Choose a reason for hiding this comment

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

해당 코드의 주요 변경점과 개선 제안은 다음과 같습니다:

  1. 변경점:

    • @AllArgsConstructorAccessLevel.PRIVATE가 추가됨.
    • @NoArgsConstructorAccessLevel.PROTECTED가 추가됨.
  2. 개선 제안:

    • @AllArgsConstructor에서 AccessLevel.PRIVATE를 사용하여 생성자의 접근 범위를 좁힘으로써 불필요한 외부 접근을 막을 수 있습니다.
    • @NoArgsConstructor에서 AccessLevel.PROTECTED를 사용함으로써 상속 관계에서도 기본 생성자에 접근할 수 있도록 할 수 있습니다.
    • Java Bean 스펙을 따르기 위해 클래스에 직렬화 가능 인터페이스(Serializable)를 구현하는 것이 좋습니다.
  3. 위험 요소:

    • 일반적으로 AccessLevel.PRIVATE를 사용하는 경우는 해당 클래스 내부에서만 초기화를 허용할 때입니다. 이 경우, 외부에서 값을 설정하는 방법을 명시적으로 제공해야 할 수 있습니다.

이제 FavoriteRouteDetail 클래스는 보다 안전하고 융통성이 있는 생성자를 갖게 되었으며, 코드의 확장 및 유지보수에 유리한 변화를 보여줍니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class FavoriteTrafficDetail {

Copy link

Choose a reason for hiding this comment

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

이 코드 리뷰에서는 다음과 같은 수정 제안을 해드립니다:

  1. @NoArgsConstructor 어노테이션의 access 레벨을 PRIVATE에서 PROTECTED로 변경합니다.
  2. 접근자(Accessor) 레벨을 명확하게 지정하여야 합니다(@AllArgsConstructor, @NoArgsConstructor 어노테이션에 AccessLevel을 명시).
  3. 자바 문서 주석(Javadoc)을 추가하여 클래스 및 메서드에 대한 설명을 상세히 기록합니다.

이 코드가 안전하고 개선되어야 할 부분은 없지만, 위의 수정 사항들을 적용하면 코드의 가독성과 유지보수성이 향상될 것입니다.

public PointDetail(double lat, double lng) {
this.lat = lat;
this.lng = lng;
}
}
Copy link

Choose a reason for hiding this comment

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

위 코드의 개선점 및 버그 가능성:

  1. @AllArgsConstructor(access = AccessLevel.PRIVATE)@NoArgsConstructor(access = AccessLevel.PROTECTED)를 추가하여 롬복 애노테이션을 명확히 지정함으로써 클래스의 가시성을 잘 제어하고 문제를 방지할 수 있습니다.
  2. @Builder 애너테이션이 중복되어 있으므로 유지보수 측면에서 코드 리팩토링이 필요합니다.
  3. @AllArgsConstructor 애너테이션은 모든 필드에 대한 생성자를 만들기 때문에 필드가 추가될 경우 코드 변경이 번거로워질 수 있음을 고려해야 합니다.
  4. 기본 생성자(@NoArgsConstructor) 및 Builder를 롬복을 이용하여 정의하는 것이 더 효율적일 수 있습니다.

개선을 위해 해당 사항을 고려해 보시기 바랍니다.

@AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class TrafficDetail {

Copy link

Choose a reason for hiding this comment

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

이 코드 패치를 간단히 검토하겠습니다.

  1. 장점:
  • Lombok 라이브러리를 효율적으로 활용하여 소스코드 양을 줄였음.
  • @Builder, @Getter, @ToString, @EqualsAndHashCode 애노테이션들이 적절히 사용됨.
  • AccessLevel.PRIVATEAccessLevel.PROTECTED를 사용하여 생성자 접근 권한을 명시적으로 지정함.
  1. 개선 제안:
  • @NoArgsConstructor 애노테이션의 access 속성을 설정할 때, _PRIVATE보다는 _PROTECTED가 일반적으로 더 많이 사용되므로 해당 부분에 대한 고려가 필요함.
  • @EqualsAndHashCode를 사용할 때, 불필요한 필드를 비교하는 것을 방지하기 위해 @EqualsAndHashCode 애노테이션 내에서 사용할 필드를 명시적으로 선택해야 함.
  1. 버그 위험:
  • 약간의 소괄호 정렬과 주석 추가 등의 미묘한 포맷팅 문제 외에는 큰 버그 위험이 보이지 않음.

이 코드는 대체로 안정적으로 보이며, 위 개선 제안 사항을 고려하면 더욱 완벽해질 것으로 예상됩니다.

@@ -346,7 +350,8 @@ void detailFavoriteRoute() throws Exception {
.requestParameters(
new ParameterDescriptorWithType("favoriteId")
.type(SimpleType.NUMBER)
.description("즐겨찾기 경로 id"))
.description("즐겨찾기 경로 id")
.defaultValue(1L))
.responseSchema(Schema.schema("DetailFavoriteRouteResponse"))
.responseFields(
Description.common(
Copy link

Choose a reason for hiding this comment

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

이 코드 패치의 강점 및 개선 사항은 다음과 같습니다:

  1. 데이터 유형에 대한 기본값 설정: defaultValue() 메서드를 사용하여 출발지 및 도착지의 위도와 경도에 기본값을 제공하는 것은 좋습니다. 이를 통해 오류를 방지하고 기능을 간소화할 수 있습니다.

  2. detailRoute() 함수의 오류 가능성: 마지막 8번째 줄에서 반환된 스키마나 응답 필드에 대한 설명이 누락되었습니다. 해당 설명을 추가하여 API를 사용하는 개발자들이 명확히 이해할 수 있도록 해야 합니다.

  3. detailFavoriteRoute() 함수의 개선점: favoriteId 매개 변수에 대한 기본값이 지정되었지만, 값인 1L이 얼마나 유효한지 확실하지 않습니다. 이 상수 값이 맞는지 확인하고 필요에 따라 수정하세요.

코드 리뷰를 통해 이러한 점들을 고려하여 코드의 가독성과 안정성을 향상시킬 수 있습니다.

@@ -221,7 +227,8 @@ void browseTraffic() throws Exception {
.pathParameters(
new ParameterDescriptorWithType("trafficId")
.type(SimpleType.NUMBER)
.description("신호등 ID"))
.description("신호등 ID")
.defaultValue(1L))
.responseSchema(Schema.schema("BrowseTrafficResponse"))
.responseFields(
Description.common(
Copy link

Choose a reason for hiding this comment

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

주어진 코드 패치를 간단하게 검토해보겠습니다:

  1. searchTrafficsWithViewPointParam() 메서드에서 defaultValue가 동일한 위도 및 경도 값인 33.5662952 및 124.9779451로 설정되어 있음.
  2. searchTrafficsWithTrafficParam() 메서드도 동일한 위도와 경도 값을 사용하지만, 하드코딩된 값으로 들어갈 가능성이 있음.
  3. browseTraffic() 메서드는 pathParameters에 defaultValue가 포함되어 있으며, 이 경우에는 특정 상황에 적합한 기본값인지 확인할 필요가 있음.

개선 제안:

  1. 하드코딩된 위도와 경도 값을 상수로 정의해서 중복을 없애고 유지보수 용이성을 높일 것.
  2. 메소드에서 처리되는 데이터형과 기본값이 일관되는지 확인.
  3. 기본값이 항상 적절한 경우인지 확인하고 필요시 수정.

개발자들이 설명 추가 및 문서화를 통해 사용할 수 있는 기본값을 이해할 수 있도록 하는 것도 좋은 방법일 수 있다.

@@ -16,7 +16,7 @@ buildscript {

// swagger & restdocs
asciidoctorVersion = '3.3.2'
epagesRestDocsApiSpecVersion = '0.16.0'
epagesRestDocsApiSpecVersion = '0.16.4'
hidetakeSwaggerGeneratorVersion = '2.18.2'
springDocOpenApiUiVersion = '1.6.9'
swaggerUIVersion = '4.1.3'
Copy link

Choose a reason for hiding this comment

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

향후 버그 위험은 없어 보이지만, 코드 리뷰에서 향상시킬 점으로는, 새로운 라이브러리 버전을 업데이트하면서 해당 라이브러리들이 호환되는지 확인하는 것이 중요합니다. 또한 프로젝트 전체의 일관성을 유지하며 현재 사용 중인 다른 의존성과 잘 어우러지도록 업데이트하는 것이 좋습니다.

<description>
인자가 잘못 들어오는 경우(IllegalArgumentException)이 발생하는 경우에도 기본 값을 반환할 수 있도록 수정하였습니다.
return OrderFilter.valueOf(source.toUpperCase());
} catch (IllegalArgumentException e) {
return defaultValue();
}
}
}
Copy link

Choose a reason for hiding this comment

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

주요 리뷰 포인트:

  1. Objects.isNull(source) 대신에 source == null 사용 가능.
  2. OrderFilter.valueOf(source.toUpperCase())에서 source.toUpperCase()가 NullPointerException을 일으킬 수 있음. 먼저 널 체크를 하거나 안전하게 처리해야 함.
  3. default 값은 enum 인스턴스로 설정하는 것이 바람직할 수 있음.

개선 제안:

  1. Objects.isNull(source)source == null로 수정.
  2. source.toUpperCase()에 대한 널 체크 추가.
  3. defaultValue() 메소드의 반환 값을 enum 상수로 설정.

성능 개선: Enum.valueOf()을 사용하기 보다는 Enum 상수 집합을 HashMap에 로드하는 방식 등으로 변경 고려.

이외에는 기능적 동작과 예외처리를 확실히 다룬 좋은 코드입니다.

@belljun3395
Copy link
Collaborator Author

@nove1080 @Moon-1C 피드백 더 이상 없으면 오늘 머지할께요!

@belljun3395 belljun3395 merged commit e71f776 into main May 9, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant