awesome-wiki
awesome-wiki copied to clipboard
[연봉 5000만원 이상 이직] Spring framework 를 이용한 다중 접속 Wiki
= awesome-wiki "kmmin78 " [email protected], "Chen Steve" [email protected], "Francesco Jo" [email protected] // 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] 를 적극 활용하고 있습니다.
[[how-to-build]] === 빌드하기 [source,shell script]
$ gradlew :app-main:assemble {-PbuildConfig=[LOCAL, ALPHA, BETA, RELEASE]}
buildConfig 를 명시하지 않으면 기본적으로 local 프로파일로 빌드합니다.
또한 빌드 프로파일 변경시 아래와 같은 오류가 발생할 경우, clean task 를 추가해서 clean build 를 해야 합니다.
[source,shell script]
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
[[how-to-run]]
=== 실행하기
<app-main 모듈을 빌드하면 단독 실행가능한 Spring boot application JAR 파일이 생깁니다. 이 파일은 app-main/build/libs 디렉토리 아래에 다음과 같이 생성됩니다.
[source,shell script]
$ 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 파일을 그냥 실행하는것과 동일합니다. 아래와 같이 하면 됩니다.
[source,shell script]
$ java -jar app-main/build/libs/app-main.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 를 실행하면 이 프로젝트에서 코드 품질을 측정할 수 있습니다.
[source,shell script]
./gradlew detekt jacocoTestReport
각 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- 프로젝트에서 자주 사용하는 유틸리티성 메소드를 모아둔 모듈입니다.