Skip to content

Latest commit

 

History

History
79 lines (60 loc) · 5.27 KB

Readme.md

File metadata and controls

79 lines (60 loc) · 5.27 KB

택시 배차 API

택시 배차 API는 다음 기술로 개발되었습니다.

  • Kotlin 1.7.10
  • SpringBoot 2.7.5
  • Spring 5.3.23
  • MySQL 8.0.30

택시 배차 API는 다음 기능을 제공합니다.

  • 회원가입
  • 로그인
  • 택시 배차 요청
  • 택시 배차 요청 수락
  • 모든 배차 목록 조회

실행 방법

프로젝트 실행 전 다음을 가정한다.

  • Docker가 설치되어있다고 가정
  • M1 Pro Mac을 사용 중이라고 가정
  • JDK 17, Intellij 설치가 되었다고 가정

로컬 실행

  1. 프로젝트 Clone
  2. 프로젝트 루트 디렉토리에서 $ ./gradlew clean build 로 빌드 및 테스트 실행
  3. 프로젝트 하위 docker/mysql/에서 $ docker-compose up -d 실행
  4. 프로젝트 루트로 돌아와서 $ java -jar -Dspring.profiles.active=local server/build/libs/server-0.0.1.jar 실행

코드 아키텍처

모듈형 모노리스 아키텍처를 사용하여, 다음 모듈들로 프로젝트가 구성되어 있음.

모듈 설명
server 각 도메인 API 모듈을 통합하고 실행하는 모듈. 배포 시, 이 모듈을 사용.
shared 모든 모듈에서 의존하는 공통적인 의존성을 담은 모듈.
taxi-request-api 택시 요청을 처리하는 모듈.
user-api 유저 가입, 로그인을 처리하는 모듈.
query-api 복잡한 조회와 관련한 요구사항을 처리하는 모듈(CQRS).
batch-api 배치 처리와 관련한 요구사항을 처리하는 모듈.

각 도메인 API 모듈은 다음과 같은 하위 모듈로 구성되어 있음.

  • 각 하위 모듈들은 계층형 아키텍처 형식을 따르며, interfaces를 기준으로 바로 아래 모듈만 의존해야 한다.
  • 예외적으로 infrastructure 모듈만 다른 모든 모듈을 의존할 수 있다.
  • Domain 모듈은 다른 어떠한 모듈도 의존하면 안된다. 다른 모듈이 Domain 모듈을 의존해야 한다.
하위 모듈 명 설명
user-interfaces 유저 HTTP API에 대한 진입점을 제공하는 모듈.
user-application 유저의 비즈니스 로직 제어를 담당하는 모듈.
user-domain 유저의 비즈니스 로직이 담긴 핵심 모듈.
user-infrastructure 외부 구성요소, 프레임워크, 영속성을 DIP를 사용하여 역전시키고 동작가능하도록 하는 기반 모듈.

테스트 코드 작성 모범 사례

아래의 모범 사례들은 프로젝트 코드를 살펴보고 어떻게 작성되었는지 확인할 것을 권장한다.

단위 테스트 작성 방법

  • 모든 단위 테스트는 Spring Context에 의존하지 않고 테스트를 작성한다.
  • 외부 API 호출에 대한 응답 값을 Stubbing하고 싶다면, WireMock 의존성을 추가하여 작성한다.
  • 데이터베이스 접근을 추상화한 Repository 인터페이스는 Test Double 중 Fake 객체를 직접 구현하여 사용한다.

단위 테스트에서 Test Double(Dummy, Stub, Fake, Spy, Mock)을 사용해야만 하는 경우는 아래와 같다.

  • 테스트 대상 시스템이 의존하는 객체가 구현체가 있지 않은 경우 Test Double을 사용하여 테스트를 작성한다.
  • 외부 협력사 API, 클라우드 플랫폼 API 등 언제라도 잘못된 동작이 발생할 여지가 있는 경우는 Test Double을 사용하여 테스트를 작성한다.
  • 테스트 대상 시스템이 의존하는 객체를 사용하여 테스트를 진행했을 때, 테스트 실행 시간이 수백 밀리초에서 수 초가 소요될 경우 Test Double을 사용하여 테스트를 작성한다.
  • 정의된 인터페이스가 단순하다면, Test Double이 만드는 가정은 작아지기 때문에 테스트 신뢰도와 안정감을 훼손시키지 않으므로 Test Double을 사용하여 테스트를 작성한다.

통합 테스트 작성 방법

  • 통합 테스트는 Server 모듈에 존재하는 test 디렉터리에서만 작성 및 실행한다.
  • 통합 테스트 작성 시 @SpringBootTest가 붙어있는 최상위 테스트 구성 클래스를 상속 받아 작성한다.
    • 최상위 테스트 구성 클래스에만 @MockBean 을 사용할 것을 강력히 권장한다.
    • 만약, @DataJpaTest같은 다른 Slice 테스트를 사용하고 싶은 경우, 테스트 루트 디렉토리에서 기존 통합 테스트 디렉터리와 완전히 분리하여 작성할 것을 권장한다. 또한 해당 @DataJpaTest가 붙은 최상위 구성 클래스를 사용하여 테스트를 작성할 것을 권장한다.
  • 다른 테스트의 실행을 충돌시키지 않도록, 기본 값 설정은 반드시 테스트 실행 전에 실행되도록 하고, 테스트 실행 후에는 TRUNCATE문을 사용하여 비워주거나, DELETE문을 사용하여 명시적으로 데이터베이스에서 삭제되도록 할 것을 권장한다.