├── .github
├── ISSUE_TEMPLATE
│ ├── 01. main-issue.yml
│ ├── 02. sub-issue.yml
│ ├── 03. bug-report.yml
│ └── config.yml
└── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── README.md
├── build.gradle.kts
├── common
├── build.gradle.kts
├── common.settings.gradle.kts
└── src
│ ├── main
│ └── java
│ │ └── nettee
│ │ └── common
│ │ ├── CustomException.java
│ │ ├── ErrorCode.java
│ │ ├── marker
│ │ └── TypeSafeMarker.java
│ │ ├── status
│ │ ├── CustomStatusParameters.java
│ │ ├── CustomStatusParametersSupplier.java
│ │ ├── StatusCodeConstants.java
│ │ ├── StatusCodeUtil.java
│ │ ├── StatusParameters.java
│ │ └── exception
│ │ │ ├── StatusCodeErrorCode.java
│ │ │ └── StatusCodeException.java
│ │ └── util
│ │ └── EnumUtil.java
│ └── test
│ └── kotlin
│ └── nettee
│ └── common
│ └── status
│ ├── StatusCodeUtilTest.kt
│ └── StatusCodeUtilTest_CustomStatusParameters.kt
├── compose-monolith
├── compose-monolith.cmd
├── core
├── client
│ ├── nettee-client-api
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ └── client
│ │ │ ├── propeties
│ │ │ └── ClientProperties.java
│ │ │ └── request
│ │ │ └── NetteeRequest.java
│ └── nettee-rest-client
│ │ ├── build.gradle.kts
│ │ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── nettee
│ │ │ └── restclient
│ │ │ ├── NetteeClient.java
│ │ │ └── config
│ │ │ └── RestClientConfig.java
│ │ └── test
│ │ ├── java
│ │ └── nettee
│ │ │ ├── RestClientTestApplication.java
│ │ │ ├── client
│ │ │ └── NetteeClientJavaTest.java
│ │ │ └── student
│ │ │ ├── api
│ │ │ └── StudentApi.java
│ │ │ ├── entity
│ │ │ └── Student.java
│ │ │ └── persistence
│ │ │ └── StudentRepository.java
│ │ ├── kotlin
│ │ └── nettee
│ │ │ └── client
│ │ │ └── NetteeClientTest.kt
│ │ └── resources
│ │ └── application.yml
├── core.settings.gradle.kts
├── cors
│ ├── nettee-cors-api
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ └── properties
│ │ │ ├── CorsProperties.java
│ │ │ ├── MappedCorsProperties.java
│ │ │ ├── allowed
│ │ │ └── CorsAllowedProperties.java
│ │ │ └── exposed
│ │ │ └── CorsExposedProperties.java
│ └── nettee-cors-webmvc
│ │ ├── build.gradle.kts
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── config
│ │ └── WebMvcCorsConfig.java
├── exception-handler-core
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── exception
│ │ ├── handler
│ │ └── GlobalExceptionHandler.java
│ │ └── response
│ │ └── ApiErrorResponse.java
├── jpa-core
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── generated
│ │ └── nettee
│ │ │ └── jpa
│ │ │ └── support
│ │ │ ├── QBaseTimeEntity.java
│ │ │ ├── QLongBaseEntity.java
│ │ │ ├── QLongBaseTimeEntity.java
│ │ │ ├── QSnowflakeBaseEntity.java
│ │ │ ├── QSnowflakeBaseTimeEntity.java
│ │ │ ├── QUuidBaseEntity.java
│ │ │ └── QUuidBaseTimeEntity.java
│ │ └── java
│ │ └── nettee
│ │ └── jpa
│ │ ├── config
│ │ └── JpaConfig.java
│ │ └── support
│ │ ├── BaseTimeEntity.java
│ │ ├── LongBaseEntity.java
│ │ ├── LongBaseTimeEntity.java
│ │ ├── SnowflakeBaseEntity.java
│ │ ├── SnowflakeBaseTimeEntity.java
│ │ ├── UuidBaseEntity.java
│ │ └── UuidBaseTimeEntity.java
├── snowflake
│ ├── nettee-snowflake-id-api
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ ├── main
│ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ └── snowflake
│ │ │ │ ├── constants
│ │ │ │ └── SnowflakeConstants.java
│ │ │ │ ├── exception
│ │ │ │ ├── InvalidDatacenterIdException.java
│ │ │ │ └── InvalidWorkerIdException.java
│ │ │ │ ├── persistence
│ │ │ │ └── id
│ │ │ │ │ └── Snowflake.java
│ │ │ │ ├── properties
│ │ │ │ └── SnowflakeProperties.java
│ │ │ │ └── validator
│ │ │ │ └── SnowflakeConstructingValidator.java
│ │ │ └── test
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ └── snowflake
│ │ │ │ └── time
│ │ │ │ └── TestMilliseconds.java
│ │ │ └── kotlin
│ │ │ └── nettee
│ │ │ └── snowflake
│ │ │ ├── persistence
│ │ │ └── id
│ │ │ │ └── SnowflakeTest.kt
│ │ │ └── properties
│ │ │ └── SnowflakePropertiesTest.kt
│ └── nettee-snowflake-id-hibernate
│ │ ├── build.gradle.kts
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── hibenate
│ │ ├── annotation
│ │ └── SnowflakeGenerated.java
│ │ └── generator
│ │ └── SnowflakeIdGenerator.java
└── time-util
│ ├── build.gradle.kts
│ └── src
│ ├── main
│ └── java
│ │ └── nettee
│ │ └── time
│ │ ├── MillisecondsSupplier.java
│ │ └── SystemMilliseconds.java
│ └── test
│ └── kotlin
│ └── nettee
│ └── time
│ └── SystemMillisecondsTest.kt
├── docker-compose-monolith.yml
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── monolith
├── main-runner
│ ├── build.gradle.kts
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── nettee
│ │ │ │ └── main
│ │ │ │ └── MainApplication.java
│ │ └── resources
│ │ │ ├── application-local.yml
│ │ │ ├── application.yml
│ │ │ ├── db
│ │ │ └── migration
│ │ │ │ ├── local
│ │ │ │ └── R__dummy_post_views_count.sql
│ │ │ │ └── v1_0
│ │ │ │ ├── V1_0_0__enable_uuid.sql
│ │ │ │ ├── V1_0_1__create_tb_board.sql
│ │ │ │ ├── V1_0_2__alter_board_status_as_integer.sql
│ │ │ │ ├── V1_0_3__create_tb_article.sql
│ │ │ │ ├── V1_0_4__create_tb_draft.sql
│ │ │ │ ├── V1_0_5__create_tb_comment.sql
│ │ │ │ ├── V1_0_6__create_tb_reply.sql
│ │ │ │ └── V1_0_7__create_tb_post_views_count.sql
│ │ │ └── properties
│ │ │ ├── client
│ │ │ └── main.client.yml
│ │ │ ├── persistence
│ │ │ └── main.snowflake.yml
│ │ │ └── web
│ │ │ └── main.cors.yml
│ │ └── test
│ │ ├── java
│ │ └── nettee
│ │ │ └── main
│ │ │ ├── MainApplicationTests.java
│ │ │ └── sample
│ │ │ ├── entity
│ │ │ └── Sample.java
│ │ │ └── persistence
│ │ │ └── SampleRepository.java
│ │ ├── kotlin
│ │ └── nettee
│ │ │ └── main
│ │ │ ├── config
│ │ │ └── WebMvcCorsConfigTest.kt
│ │ │ └── snowflake
│ │ │ └── SnowflakeTest.kt
│ │ └── resources
│ │ └── application.yml
└── monolith.settings.gradle.kts
├── services
├── article
│ ├── api
│ │ ├── build.gradle.kts
│ │ ├── domain
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ ├── article
│ │ │ │ └── domain
│ │ │ │ │ ├── Article.java
│ │ │ │ │ └── type
│ │ │ │ │ └── ArticleStatus.java
│ │ │ │ └── draft
│ │ │ │ └── domain
│ │ │ │ ├── Draft.java
│ │ │ │ └── type
│ │ │ │ └── DraftStatus.java
│ │ ├── exception
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ ├── article
│ │ │ │ └── exception
│ │ │ │ │ ├── ArticleCommandErrorCode.java
│ │ │ │ │ ├── ArticleCommandException.java
│ │ │ │ │ ├── ArticleQueryErrorCode.java
│ │ │ │ │ └── ArticleQueryException.java
│ │ │ │ └── draft
│ │ │ │ └── exception
│ │ │ │ ├── DraftCommandErrorCode.java
│ │ │ │ ├── DraftCommandException.java
│ │ │ │ ├── DraftQueryErrorCode.java
│ │ │ │ └── DraftQueryException.java
│ │ └── readmodel
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ ├── article
│ │ │ └── readmodel
│ │ │ │ └── ArticleQueryModels.java
│ │ │ └── draft
│ │ │ └── readmodel
│ │ │ └── DraftQueryModels.java
│ ├── application
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ ├── article
│ │ │ └── application
│ │ │ │ ├── port
│ │ │ │ ├── ArticleCommandPort.java
│ │ │ │ └── ArticleQueryPort.java
│ │ │ │ ├── service
│ │ │ │ ├── ArticleCommandService.java
│ │ │ │ └── ArticleQueryService.java
│ │ │ │ └── usecase
│ │ │ │ ├── ArticleCreateUseCase.java
│ │ │ │ ├── ArticleDeleteUseCase.java
│ │ │ │ ├── ArticleReadByStatusesUseCase.java
│ │ │ │ ├── ArticleReadUseCase.java
│ │ │ │ └── ArticleUpdateUseCase.java
│ │ │ └── draft
│ │ │ └── application
│ │ │ ├── port
│ │ │ ├── DraftCommandPort.java
│ │ │ └── DraftQueryPort.java
│ │ │ ├── service
│ │ │ ├── DraftCommandService.java
│ │ │ └── DraftQueryService.java
│ │ │ └── usecase
│ │ │ ├── DraftCreateUseCase.java
│ │ │ ├── DraftDeleteUseCase.java
│ │ │ ├── DraftReadByStatusesUseCase.java
│ │ │ ├── DraftReadUseCase.java
│ │ │ └── DraftUpdateUseCase.java
│ ├── article.settings.gradle.kts
│ ├── build.gradle.kts
│ ├── driven
│ │ └── rdb
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ ├── article
│ │ │ │ └── driven
│ │ │ │ │ └── rdb
│ │ │ │ │ ├── ArticleCommandAdapter.java
│ │ │ │ │ ├── ArticleJpaRepository.java
│ │ │ │ │ ├── ArticleQueryAdapter.java
│ │ │ │ │ ├── entity
│ │ │ │ │ ├── ArticleEntity.java
│ │ │ │ │ └── type
│ │ │ │ │ │ ├── ArticleEntityStatus.java
│ │ │ │ │ │ ├── ArticleEntityStatusConverter.java
│ │ │ │ │ │ ├── ArticleStatusParameters.java
│ │ │ │ │ │ └── builder
│ │ │ │ │ │ └── TypeSafeMarkers.java
│ │ │ │ │ └── persistence
│ │ │ │ │ └── mapper
│ │ │ │ │ └── ArticleEntityMapper.java
│ │ │ │ └── draft
│ │ │ │ └── driven
│ │ │ │ └── rdb
│ │ │ │ ├── DraftCommandAdapter.java
│ │ │ │ ├── DraftJpaRepository.java
│ │ │ │ ├── DraftQueryAdapter.java
│ │ │ │ ├── entity
│ │ │ │ ├── DraftEntity.java
│ │ │ │ └── type
│ │ │ │ │ ├── DraftEntityStatus.java
│ │ │ │ │ ├── DraftEntityStatusConverter.java
│ │ │ │ │ ├── DraftStatusParameters.java
│ │ │ │ │ └── builder
│ │ │ │ │ └── TypeSafeMarkers.java
│ │ │ │ └── persistence
│ │ │ │ └── mapper
│ │ │ │ └── DraftEntityMapper.java
│ │ │ └── resources
│ │ │ ├── db
│ │ │ └── postgresql
│ │ │ │ └── migration
│ │ │ │ └── v1_0
│ │ │ │ ├── V1_0_3__create_tb_article.sql
│ │ │ │ ├── V1_0_4__alter_article_status_as_integer.sql
│ │ │ │ ├── V1_0_5__create_tb_draft.sql
│ │ │ │ └── V1_0_6__alter_draft_status_as_integer.sql
│ │ │ └── properties
│ │ │ └── db
│ │ │ ├── article.database-local.yml
│ │ │ └── article.database.yml
│ ├── driving
│ │ └── web-mvc
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ ├── article
│ │ │ │ └── driving
│ │ │ │ │ └── web
│ │ │ │ │ ├── ArticleCommandApi.java
│ │ │ │ │ ├── ArticleQueryApi.java
│ │ │ │ │ ├── dto
│ │ │ │ │ ├── ArticleCommandDto.java
│ │ │ │ │ └── ArticleQueryDto.java
│ │ │ │ │ └── mapper
│ │ │ │ │ └── ArticleDtoMapper.java
│ │ │ │ └── draft
│ │ │ │ └── driving
│ │ │ │ └── web
│ │ │ │ ├── DraftCommandApi.java
│ │ │ │ ├── DraftQueryApi.java
│ │ │ │ ├── dto
│ │ │ │ ├── DraftCommandDto.java
│ │ │ │ └── DraftQueryDto.java
│ │ │ │ └── mapper
│ │ │ │ └── DraftDtoMapper.java
│ │ │ └── resources
│ │ │ └── article-web.yml
│ └── src
│ │ └── main
│ │ └── resources
│ │ └── article.yml
├── board
│ ├── api
│ │ ├── build.gradle.kts
│ │ ├── domain
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── domain
│ │ │ │ ├── Board.java
│ │ │ │ └── type
│ │ │ │ └── BoardStatus.java
│ │ ├── exception
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── exception
│ │ │ │ ├── BoardErrorCode.java
│ │ │ │ └── BoardException.java
│ │ └── readmodel
│ │ │ └── build.gradle.kts
│ ├── application
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ └── board
│ │ │ ├── application
│ │ │ ├── port
│ │ │ │ └── BoardCommandRepositoryPort.java
│ │ │ ├── service
│ │ │ │ └── BoardCommandService.java
│ │ │ └── usecase
│ │ │ │ └── BoardCreateUseCase.java
│ │ │ └── port
│ │ │ └── BoardCommandNetteeClientPort.java
│ ├── board.settings.gradle.kts
│ ├── build.gradle.kts
│ ├── driven
│ │ ├── board-nettee-client
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── client
│ │ │ │ └── BoardCommandNetteeClient.java
│ │ └── rdb
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── generated
│ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ ├── entity
│ │ │ │ └── QBoardEntity.java
│ │ │ │ └── persistence
│ │ │ │ └── mapper
│ │ │ │ └── BoardEntityMapperImpl.java
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── driven
│ │ │ │ └── rdb
│ │ │ │ ├── BoardCommandAdapter.java
│ │ │ │ ├── BoardJpaRepository.java
│ │ │ │ ├── entity
│ │ │ │ ├── BoardEntity.java
│ │ │ │ └── type
│ │ │ │ │ ├── BoardEntityStatus.java
│ │ │ │ │ └── BoardEntityStatusConverter.java
│ │ │ │ └── mapper
│ │ │ │ └── BoardEntityMapper.java
│ │ │ └── resources
│ │ │ └── properties
│ │ │ └── db
│ │ │ ├── board.database-local.yml
│ │ │ └── board.database.yml
│ ├── driving
│ │ └── web-mvc
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── generated
│ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── web
│ │ │ │ └── mapper
│ │ │ │ └── BoardDtoMapperImpl.java
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ └── board
│ │ │ │ └── driving
│ │ │ │ └── web
│ │ │ │ ├── BoardCommandApi.java
│ │ │ │ ├── dto
│ │ │ │ └── BoardCommandDto.java
│ │ │ │ └── mapper
│ │ │ │ └── BoardDtoMapper.java
│ │ │ └── resources
│ │ │ └── board-web.yml
│ └── src
│ │ └── main
│ │ └── resources
│ │ └── board.yml
├── comment
│ ├── api
│ │ ├── build.gradle.kts
│ │ ├── domain
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ ├── comment
│ │ │ │ └── domain
│ │ │ │ │ ├── Comment.java
│ │ │ │ │ └── type
│ │ │ │ │ └── CommentStatus.java
│ │ │ │ └── reply
│ │ │ │ └── domain
│ │ │ │ ├── Reply.java
│ │ │ │ └── type
│ │ │ │ └── ReplyStatus.java
│ │ ├── exception
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── nettee
│ │ │ │ ├── comment
│ │ │ │ └── exception
│ │ │ │ │ ├── CommentCommandErrorCode.java
│ │ │ │ │ ├── CommentCommandException.java
│ │ │ │ │ ├── CommentQueryErrorCode.java
│ │ │ │ │ └── CommentQueryException.java
│ │ │ │ └── reply
│ │ │ │ └── exception
│ │ │ │ ├── ReplyCommandErrorCode.java
│ │ │ │ ├── ReplyCommandException.java
│ │ │ │ ├── ReplyQueryErrorCode.java
│ │ │ │ └── ReplyQueryException.java
│ │ └── readmodel
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ ├── comment
│ │ │ └── model
│ │ │ │ └── CommentQueryModels.java
│ │ │ └── reply
│ │ │ └── model
│ │ │ └── ReplyQueryModels.java
│ ├── application
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ ├── comment
│ │ │ └── application
│ │ │ │ ├── port
│ │ │ │ ├── CommentCommandRepositoryPort.java
│ │ │ │ └── CommentQueryRepositoryPort.java
│ │ │ │ ├── service
│ │ │ │ ├── CommentCommandService.java
│ │ │ │ └── CommentQueryService.java
│ │ │ │ └── usecase
│ │ │ │ ├── CommentCreateUseCase.java
│ │ │ │ ├── CommentDeleteUseCase.java
│ │ │ │ └── CommentUpdateUseCase.java
│ │ │ └── reply
│ │ │ └── application
│ │ │ ├── port
│ │ │ ├── ReplyCommandRepositoryPort.java
│ │ │ └── ReplyQueryRepositoryPort.java
│ │ │ ├── service
│ │ │ ├── ReplyCommandService.java
│ │ │ └── ReplyQueryService.java
│ │ │ └── usecase
│ │ │ ├── ReplyCreateUseCase.java
│ │ │ ├── ReplyDeleteUseCase.java
│ │ │ └── ReplyUpdateUseCase.java
│ ├── build.gradle.kts
│ ├── comment.settings.gradle.kts
│ ├── driven
│ │ └── rdb
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── generated
│ │ │ └── nettee
│ │ │ │ ├── comment
│ │ │ │ └── entity
│ │ │ │ │ └── QCommentEntity.java
│ │ │ │ └── reply
│ │ │ │ └── entity
│ │ │ │ └── QReplyEntity.java
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ ├── comment
│ │ │ │ └── driven
│ │ │ │ │ └── rdb
│ │ │ │ │ ├── entity
│ │ │ │ │ ├── CommentEntity.java
│ │ │ │ │ └── type
│ │ │ │ │ │ ├── CommentEntityStatus.java
│ │ │ │ │ │ └── CommentEntityStatusConverter.java
│ │ │ │ │ └── persistence
│ │ │ │ │ ├── CommentCommandAdapter.java
│ │ │ │ │ ├── CommentJpaRepository.java
│ │ │ │ │ ├── CommentQueryAdapter.java
│ │ │ │ │ └── mapper
│ │ │ │ │ └── CommentEntityMapper.java
│ │ │ │ └── reply
│ │ │ │ └── driven
│ │ │ │ └── rdb
│ │ │ │ ├── entity
│ │ │ │ ├── ReplyEntity.java
│ │ │ │ └── type
│ │ │ │ │ ├── ReplyEntityStatus.java
│ │ │ │ │ └── ReplyEntityStatusConverter.java
│ │ │ │ └── persistence
│ │ │ │ ├── ReplyCommandAdapter.java
│ │ │ │ ├── ReplyJpaRepository.java
│ │ │ │ ├── ReplyQueryAdapter.java
│ │ │ │ └── mapper
│ │ │ │ └── ReplyEntityMapper.java
│ │ │ └── resources
│ │ │ └── properties
│ │ │ └── db
│ │ │ ├── comment.database-local.yml
│ │ │ └── comment.database.yml
│ ├── driving
│ │ └── web-mvc
│ │ │ ├── build.gradle.kts
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── nettee
│ │ │ │ ├── comment
│ │ │ │ └── web
│ │ │ │ │ ├── CommentCommandApi.java
│ │ │ │ │ ├── CommentQueryApi.java
│ │ │ │ │ ├── dto
│ │ │ │ │ └── CommentCommandDto.java
│ │ │ │ │ └── mapper
│ │ │ │ │ └── CommentDtoMapper.java
│ │ │ │ └── reply
│ │ │ │ └── web
│ │ │ │ ├── ReplyCommandApi.java
│ │ │ │ ├── ReplyQueryApi.java
│ │ │ │ ├── dto
│ │ │ │ └── ReplyCommandDto.java
│ │ │ │ └── mapper
│ │ │ │ └── ReplyDtoMapper.java
│ │ │ └── resources
│ │ │ └── comment-web.yml
│ └── src
│ │ └── main
│ │ └── resources
│ │ └── comment.yml
└── views
│ ├── api
│ ├── build.gradle.kts
│ └── domain
│ │ ├── build.gradle.kts
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── views
│ │ └── Views.java
│ ├── application
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── views
│ │ ├── port
│ │ ├── ViewsCacheRepositoryPort.java
│ │ ├── ViewsCommandRepositoryPort.java
│ │ └── ViewsQueryRepositoryPort.java
│ │ ├── service
│ │ ├── ViewsCommandService.java
│ │ └── ViewsQueryService.java
│ │ └── usecase
│ │ ├── ViewsReadUseCase.java
│ │ └── ViewsUpdateUseCase.java
│ ├── build.gradle.kts
│ ├── driven
│ ├── rdb
│ │ ├── build.gradle.kts
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── nettee
│ │ │ └── views
│ │ │ ├── adapter
│ │ │ └── ViewsCommandRepositoryAdapter.java
│ │ │ ├── entity
│ │ │ └── ViewsEntity.java
│ │ │ └── repository
│ │ │ └── ViewsCountBackupRepository.java
│ └── redis
│ │ ├── build.gradle.kts
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── nettee
│ │ └── views
│ │ ├── adapter
│ │ ├── ViewsCacheAdapter.java
│ │ └── ViewsQueryAdapter.java
│ │ └── repository
│ │ ├── ViewsCountDistributedLockRepository.java
│ │ └── ViewsCountRepository.java
│ ├── driving
│ └── web
│ │ ├── build.gradle.kts
│ │ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── nettee
│ │ │ └── board
│ │ │ └── web
│ │ │ ├── ViewsCommandApi.java
│ │ │ └── ViewsQueryApi.java
│ │ └── test
│ │ └── java
│ │ └── nettee
│ │ └── board
│ │ └── web
│ │ └── ViewsApiTest.kt
│ └── views.settings.gradle.kts
└── settings.gradle.kts
/.github/ISSUE_TEMPLATE/02. sub-issue.yml:
--------------------------------------------------------------------------------
1 | name: Sub-Issue
2 | description: Describe sub issues.
3 | title: "[SUB-ISSUE] "
4 | body:
5 | - type: textarea
6 | id: content
7 | attributes:
8 | label: 이슈 내용
9 | description: 어떤 작업이 필요한지 설명해 주세요.
10 | placeholder: Tell us what you want!
11 | validations:
12 | required: false
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## Issues
2 |
3 | - Resolves #0
4 |
5 |
6 |
7 | ## Description
8 |
9 | - 주요 변경 사항에 대한 간단한 설명을 작성해 주세요.
10 | - 관련 이슈 번호를 포함해 주세요 (예: `#123`).
11 |
12 |
13 |
14 | ## Review Points
15 |
16 |
17 |
18 |
19 | - 상세한 리뷰를 원하는 영역은 작업 의도와 함께 설명해 주세요.
20 |
21 |
22 |
23 | ## How Has This Been Tested?
24 |
25 | - 변경 사항을 테스트하는 방법에 대해 설명해 주세요.
26 | - 어떤 환경에서 테스트가 이루어졌는지 명시해 주세요.
27 |
28 |
29 |
30 |
31 |
32 | ## Additional Notes
33 |
34 | - 이 PR과 관련된 추가적인 정보가 있다면 여기에 기재해 주세요.
35 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### Local ###
2 | db
3 |
4 | ### Gradle ###
5 | .gradle
6 | build/
7 | !gradle/wrapper/gradle-wrapper.jar
8 | !**/src/main/**/build/
9 | !**/src/test/**/build/
10 |
11 | ### IntelliJ IDEA ###
12 | .idea/
13 | .idea/modules.xml
14 | .idea/jarRepositories.xml
15 | .idea/compiler.xml
16 | .idea/libraries/
17 | *.iws
18 | *.iml
19 | *.ipr
20 | out/
21 | !**/src/main/**/out/
22 | !**/src/test/**/out/
23 |
24 | ### Eclipse ###
25 | .apt_generated
26 | .classpath
27 | .factorypath
28 | .project
29 | .settings
30 | .springBeans
31 | .sts4-cache
32 | bin/
33 | !**/src/main/**/bin/
34 | !**/src/test/**/bin/
35 |
36 | ### NetBeans ###
37 | /nbproject/private/
38 | /nbbuild/
39 | /dist/
40 | /nbdist/
41 | /.nb-gradle/
42 |
43 | ### VS Code ###
44 | .vscode/
45 |
46 | ### Mac OS ###
47 | .DS_Store
--------------------------------------------------------------------------------
/common/build.gradle.kts:
--------------------------------------------------------------------------------
1 | // FIXME remove this after root build.gradle.kts supplies below dependencies.
2 | dependencies {
3 | testImplementation("org.springframework:spring-web:6.2.3")
4 |
5 | testImplementation("io.kotest:kotest-runner-junit5:5.9.1")
6 | testImplementation("io.mockk:mockk:1.13.12")
7 | testImplementation(kotlin("script-runtime"))
8 | testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.3")
9 | }
10 |
11 | // FIXME remove this after root build.gradle.kts supplies below task.
12 | kotlin {
13 | sourceSets {
14 | test {
15 | kotlin.srcDirs(listOf("src/test/kotlin"))
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/common/common.settings.gradle.kts:
--------------------------------------------------------------------------------
1 | include(
2 | "common",
3 | )
--------------------------------------------------------------------------------
/common/src/main/java/nettee/common/ErrorCode.java:
--------------------------------------------------------------------------------
1 | package nettee.common;
2 |
3 | import org.springframework.http.HttpStatus;
4 |
5 | import java.util.Map;
6 | import java.util.function.Supplier;
7 |
8 | public interface ErrorCode {
9 | String name();
10 | String message();
11 |
12 | HttpStatus httpStatus();
13 | RuntimeException exception();
14 | RuntimeException exception(Throwable cause);
15 |
16 | RuntimeException exception(Runnable runnable);
17 | RuntimeException exception(Runnable runnable, Throwable cause);
18 |
19 | RuntimeException exception(Supplier