| name | following-the-architecture |
| description | Use when adding, moving, or renaming code in this repository, or deciding which module and package something belongs in |
์ํคํ
์ฒ
๋ชจ๋๊ณผ ์์กด ๋ฐฉํฅ
bootstrap โ web, external-in, external-out, persistence, core
web โ core
external-out โ core
persistence โ core
core โ (์์)
core์ SpringยทJPAยทJackson import๊ฐ ๋ฑ์ฅํ๋ฉด ์๋ชป๋ ์์น๋ค.
์ด๋ํฐ๋ผ๋ฆฌ๋ ์๋ก ์์กดํ์ง ์๋๋ค. web์ persistence๋ฅผ ์ง์ ๋ถ๋ฅด์ง ์๊ณ core์ ํฌํธ๋ฅผ ํตํ๋ค.
ํจํค์ง๋ ๋๋ฉ์ธ ์ฐ์
๋ชจ๋ ๋ชจ๋์ด <๋ชจ๋ ๋ฃจํธ>.<๋๋ฉ์ธ> ์ผ๋ก ๋๋๋ค. ํ์ฌ ๋๋ฉ์ธ์ auth, user. ๋ ์ด์ด(entity, adapter, usecase, port)๋ก ๋จผ์ ๋๋์ง ์๊ณ , ๋๋ฉ์ธ ์์์๋
ํํํ๊ฒ ๋๋ค.
src/test๋ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค. ์ฌ๋ฌ ๋๋ฉ์ธ์ด ํจ๊ป ์ฐ๋ ํ
์คํธ ํฝ์ค์ฒ๋ง ๋ชจ๋ ํ
์คํธ ๋ฃจํธ์ ๋๋ค (core/src/test/.../core/Fakes.kt).
๋๋ฉ์ธ์ ์ํ์ง ์๋ ๊ฒ๋ง ๋ณ๋ ํจํค์ง๋ฅผ ์ด๋ค โ web.common(์๋ตยท์์ธ), web.config, web.security, persistence.config.
๋ ๋๋ฉ์ธ์ด ํจ๊ป ์ฐ๋ ํ์
์ ๊ณต์ฉ ํจํค์ง๋ฅผ ๋ง๋ค์ง ๋ง๊ณ ๋ ๊ทผ๋ณธ์ด ๋๋ ๋๋ฉ์ธ์ ๋๋ค. Provider๋ core.auth์ ์๊ณ core.user๊ฐ importํ๋ค.
ํ์ผ ์ด๋ฆ
ํ ๋๋ฉ์ธ์ ๊ฐ์ ์ข
๋ฅ๋ฅผ ํ ํ์ผ์ ๋ชจ์๋ค. ์์ธ๋ฅผ ๊ฐ๋ณ ํ์ผ๋ก ํฉ๋จ๋ฆฌ์ง ์๋๋ค.
<๋๋ฉ์ธ>UseCases.kt ์ ์ค์ผ์ด์ค ์ธํฐํ์ด์ค + ์ปค๋งจ๋/๊ฒฐ๊ณผ
<๋๋ฉ์ธ>Gateways.kt ๋๊ฐ๋ ํฌํธ
<๋๋ฉ์ธ>Exceptions.kt ๋๋ฉ์ธ ์์ธ ์ ๋ถ
<๋๋ฉ์ธ>Dtos.kt ์์ฒญยท์๋ต DTO
ํด๋์ค๊ฐ ํ๋๋ฟ์ธ ํ์ผ์ ๊ทธ ํด๋์ค ์ด๋ฆ์ ํ์ผ๋ช
์ผ๋ก ์ด๋ค. ktlint๊ฐ ๊ฐ์ ํ๋ค.
core์ ์ ์ค์ผ์ด์ค ๊ตฌํ์ ...Service, ๋๊ฐ๋ ํฌํธ ๊ตฌํ์ ...Adapter๋ค. ์ ์ค์ผ์ด์ค์ Spring ์ ๋
ธํ
์ด์
์ ๋ฌ์ง ์๊ณ , ๋น ๋ฑ๋ก์ bootstrap์
CoreBeansConfig๊ฐ ์์ฑ์ ์ฃผ์
์ผ๋ก ํ๋ค.
์ปจํธ๋กค๋ฌ
- ๊ฒฝ๋ก๋
/api/v1/<๋๋ฉ์ธ ๋ณต์ํ> โ user ๋๋ฉ์ธ โ /api/v1/users
- ๋ฐํ์ ํญ์
ApiResponse<T>. ResponseEntity๋ ์์ธ ํธ๋ค๋ฌ๋ง ์ด๋ค
- ์ฑ๊ณต์ ํญ์ 200์ด๋ค. POST์๋ 201์ ์ฐ์ง ์๋๋ค
- ์์ฒญยท์๋ต DTO์ JSON ๊ตฌ์กฐ๋
following-api-contract์ ๋ฐ๋ฅธ๋ค
- ํ๋ผ๋ฏธํฐ ์์๋
@AuthUserId, @RequestBody
- ๋๋ฉ์ธ โ DTO ๋ณํ์ DTO ์ชฝ
from() / toCommand()์์ ํ๋ค
- ์ปจํธ๋กค๋ฌ๋ ๋ถ๊ธฐํ์ง ์๋๋ค. ์กฐ๊ฑด์ด ํ์ํ๋ฉด ์ ์ค์ผ์ด์ค๋ก ์ฎ๊ธด๋ค
์๋ต๊ณผ ์์ธ
์ฑ๊ณต์ ApiResponse.ok(data) ๋๋ ApiResponse.empty(). ์ฑ๊ณต message๋ ํญ์ "OK"์ด๊ณ , ์๋ํฌ์ธํธ๋ง๋ค ๋ค๋ฅธ ์ฑ๊ณต ๋ฌธ๊ตฌ๋ฅผ ๋ฃ์ง ์๋๋ค.
์คํจ๋ GlobalExceptionHandler๊ฐ ์์ธ ํ์
๋ณ๋ก ์ํ ์ฝ๋๋ฅผ ์ ํ๋ค. ์คํจ์ 200์ ๋ฐํํ๋ ๊ฒฝ๋ก๋ ์๋ค. ์ ๋๋ฉ์ธ ์์ธ๋ฅผ ๋ง๋ค๋ฉด ํธ๋ค๋ฌ์ ๋งคํ์ ์ถ๊ฐํ๋ค โ ๋น ๋จ๋ฆฌ๋ฉด 500์ผ๋ก ๋๊ฐ๋ค.
์ธ์ฆ ์คํจ ์๋ต์๋ ๊ณ ์ ๋ฌธ๊ตฌ๋ฅผ ์ด๋ค. ์์ธ ๋ฉ์์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ ์ ๋ณด๊ฐ ๋ด๊ธธ ์ ์์ผ๋ฏ๋ก ํด๋ผ์ด์ธํธ๋ก ๋ด๋ณด๋ด์ง ์๊ณ ๋ก๊ทธ์๋ง ๋จ๊ธด๋ค.
์ธ์ฆ์ ๊ธฐ๋ณธ ์ฐจ๋จ
/api/** ์ ๋ชจ๋ ํธ๋ค๋ฌ๋ ์ธ์ฆ์ด ํ์ํ๋ค. ๊ณต๊ฐํ๋ ค๋ฉด @PublicEndpoint๋ฅผ ๋ถ์ธ๋ค. ์ ์๋ํฌ์ธํธ๋ ์๋ฌด๊ฒ๋ ํ์ง ์์๋ ๋ณดํธ๋๋ค.
OpenAPI์ bearer ํ๊ธฐ๋ AuthenticationInterceptor.isPublic์ ๊ณต์ ํ๋ฏ๋ก ๋ฌธ์๋ฅผ ๋ฐ๋ก ์๋์ง ์๋๋ค.
์ปดํฌ๋ํธ ์ค์บ์ ๋ชจ๋ ๋ฃจํธ๋ก
@EntityScan, @EnableJpaRepositories๋ basePackages = ["com.challa.persistence"] ํํ๋ก ์ด๋ค. ๋ฉ์ธ ์ค์ ๊ณผ ํ
์คํธ ์ค์ ๋ชจ๋.
basePackageClasses = [UserEntity::class]๋ ๊ทธ ํด๋์ค์ ํจํค์ง๋ง ์ค์บํ๋ค. ๋๋ฉ์ธ์ ๋๋๋ ์๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ํฐํฐ๊ฐ ๋ฑ๋ก๋์ง ์๊ณ , ์ปดํ์ผ์ ํต๊ณผํ๊ณ ํ
์คํธ๋ง ๊นจ์ง๋ค.
์คํค๋ง
ddl-auto: update๋ผ ์ @Entity๋ ํ
์ด๋ธ์ ์๋ ์์ฑํ๋ค. ๋ง์ด๊ทธ๋ ์ด์
๋๊ตฌ๊ฐ ์์ผ๋ฏ๋ก ์ปฌ๋ผ ์ญ์ ยทํ์
๋ณ๊ฒฝ์ ๋ฐ์๋์ง ์๋๋ค. ๊ธฐ์กด ์ปฌ๋ผ์ ๋ฐ๊ฟ์ผ ํ๋ฉด PR์ ์๋ DDL์ ์ ๋๋ค.