본문으로 건너뛰기

지하철 미션 회고

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
지하철 미션은 밀리랑 페어를 진행했다.
간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
API와 테이블 구조를 우리가 정할 수 있는 상황이었고, 도메인 로직이 복잡했기 때문에 도메인을 먼저 구현했다.

노선의 구간 추가 및 삭제

노선을 저장하는 방법에 대해서 밀리와 이야기를 나눴다.

  1. 구간을 데이터베이스에서 전부 제거하고 전부 추가하는 방법
  2. 변경된 요소만 데이터베이스에 반영하는 방법

페어 시간이 짧아서 더욱 간단한 1번을 선택했고, 시간 내 요구사항을 만족시키기 위해 더 간단하게 구현하는 방법을 선택하는 것도 좋은 트레이드오프였던 것 같다.
추후 페어가 끝나고 리뷰어인 서브웨이가 일부분만 반영하는 것으로 개선해 보는 것도 좋을 것 같다고 코멘트를 남겨주셔서 추가 및 제거된 요소만 반영하도록 변경했다.

부족했던 부분

미션의 난이도가 올라간 만큼, 페어 할 땐 컨디션 관리도 잘하려고 노력하고 미션 할 때도 집중해서 잘 끝낸 것 같다.
우아한테크코스를 진행하면서 알아야 하는 게 많아지면서 가끔 조바심을 가질 때가 있는 것 같은데, 조바심을 경계할 필요가 있을 것 같다.
부족한 부분은 인정하고, 앞으로 나아가야겠다.

새로 학습한 부분

컴포지트 패턴으로 요금 정책 추상화

요금 정책은 기본요금 정책, 거리별 요금 정책, 연령별 할인 정책이 있었다.
요금을 더하는 부분과, 할인하는 부분이 있어서 이 둘을 분리할까 생각했지만, 이 정도 크기의 애플리케이션에서는 오히려 분리하지 않고 하나로 합치는 게 더 좋다고 생각했다.
또한 분리하지 않는다면 정책의 순서가 중요한데, 연령별 할인 정책을 마지막에 두어야 했기 때문에 책임 연쇄 패턴도 고려를 했지만 조금 더 간결해 보이는 컴포지트 패턴을 선택했다.

도메인에 특정 기술의 의존성을 분리

처음에 도메인 패키지에 jgrapht 라이브러리를 의존하고 있는 클래스를 두어서 도메인 패키지가 jgrapht와 강결합이 되어버렸다.
따라서 도메인 패키지 내에는 경로 검색에 대한 인터페이스를 두고, 세부 구현은 도메인 패키지 외부로 분리했다.
최대한 간결하게 구현한다고 생각을 해도, 이런 부분은 인터페이스를 두어 결합을 피하는 것이 좋을 것 같다.

컴포지트 패턴

컴포지트 패턴은 인터페이스를 구현한 개별 객체가 존재하고, 그 개별 객체들을 포함하는 하나의 구현체가 따로 존재하는 패턴이다.
이때 사용자는 개별 객체와 합성 객체(개별 객체들을 포함하고 있는)를 똑같이 사용할 수 있다.

인수 테스트 작성

인수 테스트는 사용자 스토리 시나리오 기반 테스트다.
브라운이 해주신 강의 + 유튜브에 있는 브라운의 강의를 보고 지하철 미션에 인수 테스트를 적용해 보았다.
메서드, 변수명을 전부 한글로 작성했는데 전체적인 흐름을 알기 편하고 읽기도 좋았다.
그리고 인수 테스트에 필요한 Steps를 만드는 과정이 너무 재밌었다.

결과는 아래와 같다.

@Nested
public class 노선을_전체_조회할_때 {

@Test
void 상행종점역_부터_하행종점역으로_정렬된_결과를_반환한다() {
// given
노선_생성_요청("2호선", "초록", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("2호선", "잠실", "잠실새내", 5);
구간_생성_요청("2호선", "잠실새내", "종합운동장", 오른쪽, 5);

노선_생성_요청("9호선", "고동", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("9호선", "봉은사", "종합운동장", 3);
구간_생성_요청("9호선", "종합운동장", "삼전", 오른쪽, 7);

// when
final var 조회_결과 = 노선_전체_조회_요청();

// then
요청_결과의_상태를_검증한다(조회_결과, 정상_요청);
노선_전체_조회_결과를_확인한다(
조회_결과,
노선_정보("2호선", "초록", 0, "잠실", "잠실새내", "종합운동장"),
노선_정보("9호선", "고동", 0, "봉은사", "종합운동장", "삼전")
);
}
}

페어에게 배울 부분

의견 조율하기

밀리가 필요한 부분에서 의견을 적극적으로 내줘서 진행이 수월했다.
의사소통이 매우 잘 돼서 좋았고 덕분에 시간 내에 요구사항을 만족해 미션을 제출할 수 있었던 것 같다.

꼼꼼하게 코딩하기

밀리는 코딩을 엄청 꼼꼼하게 하는 것 같다.
변수명, 메서드명을 중요하게 생각했고, 좋은 변수명을 잘 짓는 것 같다.
또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
나는 과연 다른 사람들에게 편한 사람일까?