Spring framework 를 이용한 다중 접속 애플리케이션에서 발생하는 어려움을 해결하며 공부하기 위한 프로젝트입니다.
최대한 효율적으로 TDD 를 연습하기 위해 할 일 목록 Google sheets 와 Issue Kanban board 를 적극 활용하고 있습니다.
$ gradlew :app-main:assemble {-PbuildConfig=[LOCAL, ALPHA, BETA, RELEASE]}
buildConfig
를 명시하지 않으면 기본적으로 local
프로파일로 빌드합니다.
또한 빌드 프로파일 변경시 아래와 같은 오류가 발생할 경우, clean
task 를 추가해서 clean build 를 해야 합니다.
e: app-main/src/alpha/kotlin/kr/flab/wiki/app/AppConfig.kt: (5, 8): Redeclaration: AppConfig
e: app-main/src/local/kotlin/kr/flab/wiki/app/AppConfig.kt: (5, 8): Redeclaration: AppConfig
$ gradlew :app-main:assemble -PbuildConfig=ALPHA
...
BUILD SUCCESSFUL in 266ms
3 actionable tasks: 3 executed
빌드하기 단락의 내용대로 app-main
모듈을 빌드하면 단독 실행가능한 Spring boot application JAR 파일이 생깁니다. 이 파일은 app-main/build/libs
디렉토리 아래에 다음과 같이 생성됩니다.
$ ll app-main/build/libs
total 24M
-rw-rw-r-- 1 user user 24M Jun 23 18:18 app-main.jar
-rw-rw-r-- 1 user user 14K Jun 23 18:18 app-main-plain.jar
실행 방법은 JAR 파일을 그냥 실행하는것과 동일합니다. 아래와 같이 하면 됩니다.
$ java -jar app-main/build/libs/app-main.jar
주의: 커맨드를 실행하는 실행 경로에 application.yml
파일이 있어야 합니다.
또한 파일 템플릿은 application.yml.sample 을 참고하시기 바랍니다.
이 프로젝트에서는 Unit / Integration / End to end 테스트들을 종류별로 구분해 구현하고 있습니다. 테스트들은 martinFowler.com 의 The practical test pyramid 라는 글에 따라 규모별로 구분하고 있으모, 각 테스트를 실행하는 gradle task 명은 아래와 같습니다.
-
test
- 등록된 모든 테스트를 실행합니다. 시간이 가장 많이 걸립니다. -
unitTest
- Unit test 들만을 모두 실행합니다. 시간이 가장 적게 걸립니다. -
integrationTest
- Integration test 들만을 모두 실행합니다. Unit test 보다는 실행 시간이 좀 더 걸립니다. -
e2eTest
- End to end test 들만을 모두 실행합니다. End to end test 를 일컫는 말들은 여러 가지가 있지만 이 프로젝트에서는 API 가 정상 동작하는지를 확인하는 테스트를 의미합니다.
서로 다른 코딩 규칙으로 인해 코드 리뷰에 스타일링 지적 같은 불필요한 시간 낭비가 발생하는 일을 줄이고자, detekt 를 이용해 코딩 스타일과 사전 실수를 관리하고 있습니다.
또한 자동화된 test 를 항상 실행해 코드를 안전하게 변경 및 통합하고자 노력했습니다.
아래 gradle task 를 실행하면 이 프로젝트에서 코드 품질을 측정할 수 있습니다.
./gradlew detekt jacocoTestReport
각 Task 들의 설명은 다음과 같습니다.
-
detekt
: detekt 를 실행. Kotlin 정적 분석 실행. -
jacocoTestReport
: 테스트 실행 및 테스트의 코드 커버리지 측정.
현재 프로젝트는 크게 스프링 관련 코드, 즉 entry point가 있는 app-main 모듈과 도메인/비즈니스 로직을 모아둔 app-core모듈로 나뉩니다.
도메인과 프레임워크 코드를 모듈로 분리하여 프로젝트가 spring에 의존하지 않고 약간의 수정으로 다른 프레임워크에서 실행 가능하도록 하는것이 목적입니다.
-
app-core
- 설계한 도메인 모델과 서비스를 모아둔 모듈입니다. 문서화를 위한 annotation,과 도메인을 사용하면서 발생하는 exception도 정의되어 있습니다.-
domain
- 도메인의 구현체 패키지입니다. app-main 프로젝트에서는 도메인의 인터페이스만 사용 가능합니다.-
document
- 위키 문서 자체의 도메인입니다. -
user
- 문서를 작성한 유저의 도메인입니다
-
-
-
app-main
- Spring 프레임워크 관련 코드를 모아둔 모듈입니다. -
app-lib
- 프로젝트에서 자주 사용하는 유틸리티성 메소드를 모아둔 모듈입니다.