= awesome-wiki "kmmin78 " kmmin78@gmail.com, "Chen Steve" neropsys@gmail.com, "Francesco Jo" nimbusob@gmail.com // Metadata: :description: Wiki 프로젝트 :keywords: spring-boot, jpa-hibernate, junit5, spock-groovy, spring-rest-docs, tdd, kotlin, gradle // Settings: :doctype: book :toc: left :toclevels: 4 :sectlinks: :icons: font // Refs: :link-todo-sheets: https://docs.google.com/spreadsheets/d/1xWtMZ2Ng69OcFMIkfMSQvYUPtqB-fzVKMoopEGIuOIA :link-todo-issues: https://github.com/f-lab-edu/awesome-wiki/issues :link-detekt: https://arturbosch.github.io/detekt/index.html
[[overview]] == 개요
Spring framework 를 이용한 다중 접속 애플리케이션에서 발생하는 어려움을 해결하며 공부하기 위한 프로젝트입니다.
최대한 효율적으로 TDD 를 연습하기 위해 link:{link-todo-sheets}[할 일 목록 Google sheets] 와 link:{link-todo-issues}[Issue Kanban board] 를 적극 활용하고 있습니다.
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 ...
[[how-to-run]]
=== 실행하기
<app-main
모듈을 빌드하면 단독 실행가능한 Spring boot application JAR 파일이 생깁니다. 이 파일은 app-main/build/libs
디렉토리 아래에 다음과 같이 생성됩니다.
실행 방법은 JAR 파일을 그냥 실행하는것과 동일합니다. 아래와 같이 하면 됩니다.
주의: 커맨드를 실행하는 실행 경로에 application.yml
파일이 있어야 합니다.
또한 파일 템플릿은 link:application.yml.sample[application.yml.sample] 을 참고하시기 바랍니다.
[[running-tests]] === 테스트 실행 이 프로젝트에서는 Unit / Integration / End to end 테스트들을 종류별로 구분해 구현하고 있습니다. 테스트들은 martinFowler.com 의 link:https://martinfowler.com/articles/practical-test-pyramid.html[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 가 정상 동작하는지를 확인하는 테스트를 의미합니다.[[code-quality-measurement]] === 코드 품질 측정
서로 다른 코딩 규칙으로 인해 코드 리뷰에 스타일링 지적 같은 불필요한 시간 낭비가 발생하는 일을 줄이고자, link:{link-detekt}[detekt] 를 이용해 코딩 스타일과 사전 실수를 관리하고 있습니다.
또한 자동화된 test 를 항상 실행해 코드를 안전하게 변경 및 통합하고자 노력했습니다.
아래 gradle task 를 실행하면 이 프로젝트에서 코드 품질을 측정할 수 있습니다.
각 Task 들의 설명은 다음과 같습니다.
detekt
: link:{link-detekt}[detekt] 를 실행. Kotlin 정적 분석 실행.jacocoTestReport
: 테스트 실행 및 테스트의 코드 커버리지 측정.[[project-structure]] === 프로젝트 모듈 및 구조 설명
현재 프로젝트는 크게 스프링 관련 코드, 즉 entry point가 있는 app-main 모듈과 도메인/비즈니스 로직을 모아둔 app-core모듈로 나뉩니다.
도메인과 프레임워크 코드를 모듈로 분리하여 프로젝트가 spring에 의존하지 않고 약간의 수정으로 다른 프레임워크에서 실행 가능하도록 하는것이 목적입니다.
app-core
- 설계한 도메인 모델과 서비스를 모아둔 모듈입니다. 문서화를 위한 annotation,과 도메인을 사용하면서 발생하는 exception도 정의되어 있습니다.
domain
- 도메인의 구현체 패키지입니다. app-main 프로젝트에서는 도메인의 인터페이스만 사용 가능합니다.
** document
- 위키 문서 자체의 도메인입니다.
user
- 문서를 작성한 유저의 도메인입니다app-main
- Spring 프레임워크 관련 코드를 모아둔 모듈입니다.app-lib
- 프로젝트에서 자주 사용하는 유틸리티성 메소드를 모아둔 모듈입니다.