NEXT STEP/Review 정리13 [Review] ATDD 4주차 3차 PR 최홍준 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) 문서화의 범위 현재 경로 조회하는 "/paths" API는 로그인 여부와 상관 없이 모든 유저가 호출할 수 있습니다! 추가로 로그인 한 유저같은 경우 경로 조회시 회원의 나이마다 적용되는 할인 정책이 다른데, 이 API는 로그인을 한 경우와, 하지 않는 경우를 나눠서 문서화 해야하는지 궁금합니다! 정책과 스펙 사이의 고민이였던 것 같다. 리뷰어의 말씀이 타당한것 같다. API 문서는 스펙을 보여주는 문서지, 정책사항까지 보여줄 필요는 없는것 같다. 따라서 응답 값이 동일하니 따로 정리하지 않는쪽으로 방향을 정하였다. 2. 리뷰 정리 2-1) Hook 메서드의 사용 해당 메서드의 로직은 다음과 같다. public abstract class.. NEXT STEP/Review 정리 2022. 8. 15. [Review] ATDD 4주차 2차 PR 최홍준 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 리뷰 정리 1-1) 최단 경로 구하는 로직 원래 Service에서 최단 경로를 구하는 로직은 다음과 같았습니다. public PathResponse findShortestPath(Long source, Long target, PathCondition pathCondition) { Station upStation = stationService.findById(source); Station downStation = stationService.findById(target); List lines = lineService.findLines(); SubwayMap subwayMap = new SubwayMap(lines); Path path = subwayMap.. NEXT STEP/Review 정리 2022. 8. 12. [Review] ATDD 4주차 1차 PR 최홍준 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) 인수테스트 작성과 문서 작성 우선 ATDD 사이클에 의하여 인수테스트 작성 RestDocs 작성 순서로 진행하게 되었습니다. 다만 인수테스트를 작성했을때 최단 시간으로 경로를 찾는 인수테스트가 통과를 하지는 못하는 상황 이였습니다. @DisplayName("두 역의 최단 시간 경로를 조회한다.") @Test void findPathByTime() { // when ExtractableResponse response = 두_역의_최단_시간_경로_조회를_요청(교대역, 양재역); // then assertThat(response.jsonPath().getList("stations.id", Long.class)).containsExactly(교.. NEXT STEP/Review 정리 2022. 8. 8. [Review] ATDD 3주차 3차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) Bearer 인증방식에서 권한이 없을 경우 public abstract class AuthenticationChainingFilter implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(isAlreadyLoginUser()) { return true; } try { AuthenticationToken token = convert(request); UserDetails userDetails = findU.. NEXT STEP/Review 정리 2022. 8. 4. [Review] ATDD 3주차 2차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) 공통의 테스트를 만들었어야 하는가? 미션중 TokenAuthenticationInterceptor와 UsernamePasswordAuthenticationFilter 를 추상화 하는 단계에서는, 두 필터에 공통적으로 적용 가능한 테스트를 작성한 후, 공통 부분을 추상화 했어야 할까요? 두 필터의 공통으로적용할 테스트를 작성하기 어렵다 생각되어 새로운 테스트는 작성하지 못하고, 기존의 테스트 코드로 구현하게 된것 같아 아쉽습니다. 리뷰어 님이라면 어떻게 하셨을까요? 의견 궁금합니다!! 답변: 공통의 테스트를 작성하기시 보다는, 구현체 위주의 테스트를 작성한다고 하셨다. 추상 클래스를 기반으로 하는 테스트는 인수테스트 선에서 처리하시는 것 .. NEXT STEP/Review 정리 2022. 8. 3. [Review] ATDD 3주차 1차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 와 개인적으로 이번 3주차는 Spring Security를 비슷하게 만든 뼈대 코드 위에서 인증 처리 테스트를 작성하는데, 진짜 어려우면서 꿀잼이다. 아직 Spring Security를 공부해본적은 없지만, 큰 틀을 배워가는 것 같아 너무 재미있다. 1. 질문 1-1) 인터셉터 처리 방식 public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SecurityContextPersistenceFilter()); registry.addInterceptor(new UsernamePasswordAuthenticationFilter(loginMemberService).. NEXT STEP/Review 정리 2022. 8. 1. [Review] ATDD 2주차 4차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) Exception과 Domain #323 (comment) 지난 번 리뷰에 대한 저의 생각입니다 ㅎㅎ 의견 달아주시면 감사하겠습니다! 예외를 나타내는 클래스가 http status를 상태로 갖는 게 괜찮을까요? => 사실상 Spring에서 벗어날 일이 없을 거라 거의 100% 확신하기 때문에 Spring에 의존적인 부분들을 가져다 사용해도 무방하다 생각합니다! 비즈니스 로직에 대한 예외처리인데, http 라는 프로토콜에 의존하게 된다고 생각합니다. 가장 중요한 도메인에 관련한 클래스들은 외부 기술에 종속되지 않도록 구현하는 것을 추천드립니다 => Entity Class 즉, Domain안에서는 HttpStatus에 대한 import가 없.. NEXT STEP/Review 정리 2022. 7. 26. [Review] ATDD 2주차 3차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) CustomException의 사용 이번에 CustomException을 좀더 세분화 하기위해, 기존의 SectionException을 SectionsAdd, SectionsDelete 별로 나눠 CustomException을 구현하게 되었습니다. 그보다 더 세부적인 내용들은 예외 안에서 메시지로 구별하였습니다! 우선 모든 예외가 공통적으로 상속받을 BusinessException을 구현하였습니다. 해당 class 안에는 HttpStatus를 저장 할 수 있습니다. public class BusinessException extends RuntimeException { private final HttpStatus httpStatus; pu.. NEXT STEP/Review 정리 2022. 7. 25. [Review] ATDD 2주차 2차 PR 권승철 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) 일급 컬렉션에 대한 재질문 지난번 대화를 통해 sections을 방어적 복사를 해도, sections에 담긴 원소인 section은 변경의 위험이 있음을 인지하게 되었습니다. 따라서 리뷰어님의 의견을 수용하여 Sections.getSections() 메서드는 제거하였지만, "순서대로 역을 조회하는 기능" 때문에 어차피 역들은 변경의 위험에 있을 수 밖에 없지 않나? 란 생각이 들었습니다. 일급컬렉션은 컬렉션의 불변성만 보장하면 됐던 것 아닐까? 란 생각도 들구요 ㅎㅎ 변경 위험의 노출 정도를 줄였다 생각하면 될까요? 이에 대한 의견이 궁금합니다!! 답변: 1-2) 구간 길이 검증의 불가능 미션의 요구사항 중 다음과 같은 사항이 있습니다... NEXT STEP/Review 정리 2022. 7. 22. [Review] ATDD 2주차 1차 PR 권승청 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) Section의 생성을 어디서? 예를 들어 다음과 같이 section을 추가하는 메서드가 있다고 해봅시다! LineService 내부 @Transactional public void addSection(Long lineId, SectionRequest sectionRequest) { Station upStation = stationService.findById(sectionRequest.getUpStationId()); Station downStation = stationService.findById(sectionRequest.getDownStationId()); Line line = lineRepository.findById(lineI.. NEXT STEP/Review 정리 2022. 7. 19. [Review] ATDD 1주차 3차 PR 송용주 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 @BeforeEach void init() { upStationId = 지하철역_생성("강남역").jsonPath().getLong("id"); downStationId = 지하철역_생성("건대입구역").jsonPath().getLong("id"); } @Test @DisplayName("정상적으로 역을 생성하여 기존 노선 끝에 구간을 추가한다") public void addSection() { // given Long lineId = 지하철_노선_생성("2호선", "bg-blue-600", upStationId, downStationId, 10).jsonPath().getLong("id"); Long stationId = 지하철역_생성("성수역.. NEXT STEP/Review 정리 2022. 7. 15. [Review] ATDD 1주차 2차 PR 송용주 리뷰어 님께 감사의 말을 전하고 싶다!! 1. 질문 1-1) Dto -> Domain 변환의 장소는? 조금 인수테스트 와는 상관없는 Production Code에 대한 부분이기는 한데... 저의 Line 이라는 Entity 안에는 다음과 같이 edit 이라는 메서드가 구현되어 있습니다. public void edit(Line line) { if (line.getName() != null && !line.getName().isBlank()) { name = line.getName(); } if (line.getColor() != null && !line.getColor().isBlank()) { color = line.getColor(); } if (line.getUpStationId() != nu.. NEXT STEP/Review 정리 2022. 7. 10. 이전 1 2 다음