티스토리 뷰

반응형

이번에는 TDD로 구현해볼 연습 문제에 대해 소개하고, 프로젝트 생성까지 한 후에 마무리하도록 하겠습니다.

 

 

 

1. TDD 연습문제 소개와 요구사항 분석


[ 문제 설명 ]

  • 이번 연습 문제의 주제는 멤버십 적립 서비스입니다.
  • 현재 지원중인 멤버십에는 네이버, 카카오, 라인 3가지 멤버십이 있으며, 사용자는 원하는 멤버십을 등록할 수 있습니다.
  • 포인트 적립비율은 결제금액의 1%로 고정되며, 추후에 고정 금액(1000원)으로 확장하여 적립될 수 있어야 합니다.
  • 이번 연습문제에서는 위의 문제 설명과 아래의 요구사항을 만족하는 REST API를 자유롭게 정의하고, TDD 방식으로 구현하는 것입니다.

 

[ 기능 요구 사항 ]

  • 멤버십 연결하기, 나의 멤버십 조회, 멤버십 연결끊기, 포인트 적립 API 를 구현합니다.
  • 사용자 식별값은 문자열 형태이며 "X-USER-ID" 라는 HTTP Header 로 전달되며, 이 값은 포인트 적립할 때 바코드 대신 사용됩니다.
  • Content-type 응답 형태는 application/json(JSON) 형식을 사용합니다.
  • 각 기능 및 제약사항에 대한 개발을 TDD, 단위테스트를 기반으로 진행해야 합니다.

 

[ 상세 기술 구현 사항 ]

  • 나의 멤버십 등록 API
    • 기능: 나의 멤버십을 등록합니다.
    • 요청: 사용자 식별값, 멤버십 이름, 포인트
    • 응답: 멤버십 ID, 멤버십 이름
  • 나의 멤버십 전체 조회 API
    • 기능: 내가 가진 모든 멤버십을 조회합니다.
    • 요청: 사용자 식별값
    • 응답: {멤버십 ID, 멤버십 이름, 포인트, 가입 일시}의 멤버십 리스트
  • 나의 멤버십 상세 조회 API
    • 기능: 나의 1개 멤버십을 상세 조회합니다.
    • 요청: 사용자 식별값, 멤버십 ID
    • 응답: 멤버십 ID, 멤버십 이름, 포인트, 가입일시
  • 나의 멤버십 삭제 API
    • 기능: 나의 멤버십을 삭제합니다.
    • 요청: 사용자 식별값, 멤버십 번호
    • 응답: X
  • 멤버십 포인트 적립 API
    • 기능: 나의 멤버십 포인트를 결제 금액의 1%만큼 적립합니다.
    • 요청: 사용자 식별값, 멤버십 ID, 사용 금액을 입력값으로 받습니다.
    • 응답: X

 

[ 기술 요구 사항 ]

  • 개발 언어: Java 8
  • Framework: Spring Boot
  • ORM: JPA
  • DB: Msql/H2

 

 

 

2. SpringBoot 프로젝트 설정


[ SpringBoot 프로젝트 생성 ]

 

1. 프로젝트 생성

빌드 도구로는 Gradle을 사용하도록 하자. Gradle은 빌드 캐시를 제공하고 있어서 Maven보다 속도가 빠르다.

group은 소속된 회사 또는 그룹, artifact는 소속된 집단에서 프로젝트의 타이틀을 적어주면 된다.

 

 

 

2. 라이브러리 추가

프로젝트가 생성되면 개발을 위해 필요한 라이브러리들의 의존성을 추가해주도록 하자.

의존성은 프로젝트 하위의 build.gradle의 dependencies를 다음과 같이 잡아주면 된다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

 

3. 테스트를 위한 설정

Repository 계층에 대한 테스트는 실제 디비와 연결이 되는 통합테스트로 작성하고자 한다. Repository 테스트를 위해서는 테스트를 시작할 때 생성되고 테스트가 종료되면 소멸되는 휘발성 메모리 DB인 H2를 사용하고자 한다.

다음과 같은 내용을 test 환경의 application.properties에 넣어주도록 하자

# Datasource
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=h2test
spring.datasource.password=h2test

# JPA
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

 

  • spring.jpa.generate-ddl: Entity 어노테이션이 붙은 테이블에 대해 DDL의 실행 여부
  • spring.jpa.hibernate.ddl-auto: 애플리케이션 실행 시에 DDL을 어떻게 처리할 지 방법
  • spring.jpa.open-in-view: OSIV 옵션에 대한 설정
  • spring.jpa.properties.hibernate.dialect: 사용할 데이터베이스의 방언

 

 

그러면 이제 프로젝트 생성과 테스트 코드 작성을 위한 설정이 마무리 되었다. 이제는 실제 테스트 코드부터 개발을 시작해보도록 하자.

 

 

 

 

 

 

위에서 작성한 내용들은 클린코드나 이펙티브 자바, 테스트 주도 개발 By Example 등의 책과 실무 경험 등을 종합하여 개인적인 생각을 정리한 글입니다. 옳고 그른 얘기들 및 부족한 점 충분히 있을 수 있는데, 피드백이나 커멘트 등은 언제나 환영합니다:)

코드는 깃허브에 공개되어 있습니다! 코드를 확인하시려면 여기를 참고해주세요:)

 

 

관련 포스팅

  1. 단위 테스트와 TDD(테스트 주도 개발) 프로그래밍 방법 소개 - (1/5)
  2. TDD 연습문제 소개와 요구사항 분석 및 SpringBoot 프로젝트 설정 - (2/5)
  3. TDD로 멤버십 등록 API 구현 예제 - (3/5)
  4. TDD로 멤버십 전체/상세 조회 API 구현 예제 - (4/5)
  5. TDD로 멤버십 삭제 및 포인트 적립 API 구현 예제 - (5/5)

 

 

 

반응형
댓글
댓글쓰기 폼
반응형
공지사항
Total
1,971,046
Today
104
Yesterday
1,908
TAG more
«   2022/01   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함