NEXT STEP/Review 정리

[Review] ATDD 4주차 3차 PR

샤아이인 2022. 8. 15.

최홍준 리뷰어 님께 감사의 말을 전하고 싶다!!

 

1. 질문

1-1) 문서화의 범위

현재 경로 조회하는 "/paths" API는 로그인 여부와 상관 없이 모든 유저가 호출할 수 있습니다!
추가로 로그인 한 유저같은 경우 경로 조회시 회원의 나이마다 적용되는 할인 정책이 다른데,
이 API는 로그인을 한 경우와, 하지 않는 경우를 나눠서 문서화 해야하는지 궁금합니다!

 

정책과 스펙 사이의 고민이였던 것 같다.

리뷰어의 말씀이 타당한것 같다. API 문서는 스펙을 보여주는 문서지, 정책사항까지 보여줄 필요는 없는것 같다.

따라서 응답 값이 동일하니 따로 정리하지 않는쪽으로 방향을 정하였다.

 

2. 리뷰 정리

2-1) Hook 메서드의 사용

해당 메서드의 로직은 다음과 같다.

public abstract class FareStrategy {

    public int calculateWithAge(int distance, int age, int extraFare) {
        int normalFare = calculate(distance);
        return AgeType.of(age).discount(normalFare + extraFare);
    }

    public abstract int calculate(int distance);
}

위 추상클래스를 구현하는 자식들이 자신의 정책에 알맞도록 calculate를 오버라이딩 한다.

이를 calculateWithAge 메서드에서 사용하게 된다.

 

다행이 이에 대하여 긍정적으로 생가해주셨다.

만약 정책이 추가가 계속 된다면, Spring Security의 책임 연쇄 패턴처럼 필터를 체인으로 거는 방식에 대하여 학습할 것 같다.

 

2-2) 로그인 유저가 아닌경우의 처리

 

나같은 경우 로그인 하지 않은 경우에도 요금 조회는 가능하도록 로직을 처리하였다.

이때 ArgumentResolver가 그 역할을 수행하는 과정에서 핵심이다. 다음 코드를 살펴보자.

 

▶ AuthenticationPrincipalArgumentResolver

public class AuthenticationPrincipalArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(AuthenticationPrincipal.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        boolean required = parameter.getParameterAnnotation(AuthenticationPrincipal.class).required();

        if(Objects.isNull(authentication) && required == false) {
            return User.anonymous();
        }

        return new User(authentication.getPrincipal().toString(), null, authentication.getAge(), authentication.getAuthorities());
    }
}

authentication 객체가 null 임과 동시에, required 의 값이 false라면 익명 유저를 반환하도록 처리하였다.

이름과 비밀번호는 anonymous 이며, 나이는 기본 20살, 역할을 익명 유저로 지정하게 되었다.

나이가 20살 이기 때문에 나이별 할인 정책을 받을수가 없다. 따라서 할인 되지 않은 원래 가격을 반환하게 된다.

 

적합하게 잘 구현했던것 같다.

 

3. 다른 분들 리뷰

이번에도 다른 분들의 리뷰를 읽으며 조금 정리해보았다!

 

3-1) 분기문에서 {} 생략하지 말기

 

오호 원래 가끔 1줄짜리 분기문은 {}를 생략하고는 했는데 (알고리즘 풀때 보통 그래왔다) 앞으로는 1줄 짜리도 꼭 중괄호를 적어줘야 겠다.

 

3-2) DTO에서 비지니스 로직은 지양하기

 

나도 리뷰어의 의견에 적극 공감한다.

DTO안에 과도한 비지니스 로직이 있는 것을 싫어한다. DTO에는 domain <-> dto 간 변환로직 정도만 있어야 한다 생각한다.

 

'NEXT STEP > Review 정리' 카테고리의 다른 글

[Review] ATDD 4주차 2차 PR  (0) 2022.08.12
[Review] ATDD 4주차 1차 PR  (0) 2022.08.08
[Review] ATDD 3주차 3차 PR  (0) 2022.08.04
[Review] ATDD 3주차 2차 PR  (0) 2022.08.03
[Review] ATDD 3주차 1차 PR  (0) 2022.08.01

댓글