Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c124b8b
feat: 퀘스트 생성 LLM 마이그레이션
nurdy-kim Oct 13, 2025
b505f33
feat: 퀘스트 생성 LLM 마이그레이션
nurdy-kim Oct 13, 2025
801f692
Merge branch 'feature-39/quest-generator-migration' of https://github…
nurdy-kim Oct 19, 2025
59a4e37
fix: style error 수정
nurdy-kim Oct 19, 2025
f83f88f
feat: 리뷰 사항 반영(prompt 별도 text 파일, LlmClientPortOut interface 생성, Styl…
nurdy-kim Oct 20, 2025
d53c9e9
feat: 퀘스트 생성 LLM 마이그레이션
nurdy-kim Oct 13, 2025
db1bd16
fix: style error 수정
nurdy-kim Oct 19, 2025
826c1b1
feat: 리뷰 사항 반영(prompt 별도 text 파일, LlmClientPortOut interface 생성, Styl…
nurdy-kim Oct 20, 2025
a7ccb3f
Merge branch 'feature-39/quest-generator-migration' of https://github…
nurdy-kim Oct 26, 2025
3c496ad
feat: 리뷰 수정사항 반영
nurdy-kim Nov 3, 2025
979f468
[GOMO-234] api 문서 수정 (#98)
jhl221123 Oct 27, 2025
6670d71
[GOMO-235] 위젯 스냅샷 조회 기능 추가 (#100)
jhl221123 Oct 27, 2025
90628e0
[GOMO-236] 헥사고날 아키텍처 전환 (#101)
jhl221123 Nov 3, 2025
2e3e5e4
[GOMO-239] 인증 정보 주입 방식 수정 (#102)
jhl221123 Nov 4, 2025
81f4f88
[GOMO-232] 스프링 모듈리스 도입 (#103)
jhl221123 Nov 6, 2025
b4f3ee8
feat: 퀘스트 생성 LLM 마이그레이션
nurdy-kim Oct 13, 2025
18c0ca4
feat: 리뷰 사항 반영(prompt 별도 text 파일, LlmClientPortOut interface 생성, Styl…
nurdy-kim Oct 20, 2025
bd36080
feat: LLM Refactoring 관련 review 사항 반영
nurdy-kim Dec 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
63 changes: 34 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,12 @@ dependencies {
#4-3.&nbsp; 단, 메서드 파라미터가 많아 Hard wrap 160을 넘긴다면 **한 라인에 하나**만 작성한다.<br>

#5.&nbsp; 루트 엔티티에서 값 객체 내부 필드에 바로 접근하는 메서드는 `get`으로 시작하지 않는다.<br>
#5-1. &nbsp; ex) `member.getId().getId()` == `member.id()`
#5-1. &nbsp; ex) `member.getId().getId()` == `member.id()`<br>

#6.&nbsp; check vs validate vs verify<br>
#6-1. &nbsp; check: 로직 흐름에서 조건 분기를 확인. 가능성을 검토하며 true / false 반환
#6-2. &nbsp; validate: 규칙을 준수하는지 확인. 유효성을 검증하며 규칙 위반 시 예외 발생
#6-3. &nbsp; verify: 진위 여부 확인. 데이터 진위를 판별하며, 검증 실패 시 예외 발생

<br>
<br>
Expand All @@ -92,7 +97,7 @@ dependencies {
| 이름 | Member name | 사용자의 이름 |
| 한 줄 다짐 | Motto | 사용자가 지정한 좌우명 혹은 다짐 |
| 프로필 이미지 | Profile image | 사용자의 프로필 이미지 |
| 퀘스트 설정 | Quest property | 사용자가 관리하는 퀘스트 설정 값 |
| 퀘스트 설정 | Quest property | 사용자가 관리하는 퀘스트 설정 값 |
| 일일 퀘스트 제한 | DailyThreshold | 사용자가 생성할 수 있는 일일 퀘스트 임계치 |
| 주간 퀘스트 제한 | WeeklyThreshold | 사용자가 생성할 수 있는 주간 퀘스트 임계치 |
| 월간 퀘스트 제한 | MonthlyThreshold | 사용자가 생성할 수 있는 월간 퀘스트 임계치 |
Expand All @@ -102,23 +107,23 @@ dependencies {

### 관심사

| 한글명 | 영문명 | 설명 |
|------------|-------------------|-------------------------------|
| 관심사 | Interest | 사용자가 등록한 관심 분야 |
| 등록자 | Registrant | 관심사를 등록한 사용자 |
| 이름 | Interest name | 관심사의 이름 |
| 로고 | Logo | 관심사의 로고 이미지 |
| 숙련도 | Proficiency | 관심사에 대한 역량 |
| 레벨 | Level | 숙련도의 등급 |
| 점수 | Score | 현재 보유중인 점수 |
| 총 점수 | Total score | 이제까지 획득한 모든 점수의 합계 |
| 점수 임계치 | Score threshold | 다음 레벨을 위한 임계 점수 |
| 주요 관심사 | Major interest | 등록한 관심사 중, 사용자가 특별하게 생각하는 관심사 |
| 관심사 그래프 | Interest network | 여러 가지 관심사가 계층 구조를 이룬 자료 구조 |
| 관심사 연결선 | Interest relation | 관심사 그래프에서 두 관심사의 간선 |
| 상위 관심사 | Parent interest | 관심사 그래프에서 상위 계층에 속하는 관심사 |
| 하위 관심사 | Child interest | 관심사 그래프에서 하위 계층에 속하는 관심사 |
| 관심사 할당량 | Interest quota | 사용자 구독 플랜에 따른 관심사 생성 가능 개수 |
| 한글명 | 영문명 | 설명 |
|---------|-------------------|-------------------------------|
| 관심사 | Interest | 사용자가 등록한 관심 분야 |
| 등록자 | Registrant | 관심사를 등록한 사용자 |
| 이름 | Interest name | 관심사의 이름 |
| 로고 | Logo | 관심사의 로고 이미지 |
| 숙련도 | Proficiency | 관심사에 대한 역량 |
| 레벨 | Level | 숙련도의 등급 |
| 점수 | Score | 현재 보유중인 점수 |
| 총 점수 | Total score | 이제까지 획득한 모든 점수의 합계 |
| 점수 임계치 | Score threshold | 다음 레벨을 위한 임계 점수 |
| 주요 관심사 | Major interest | 등록한 관심사 중, 사용자가 특별하게 생각하는 관심사 |
| 관심사 그래프 | Interest network | 여러 가지 관심사가 계층 구조를 이룬 자료 구조 |
| 관심사 연결선 | Interest relation | 관심사 그래프에서 두 관심사의 간선 |
| 상위 관심사 | Parent interest | 관심사 그래프에서 상위 계층에 속하는 관심사 |
| 하위 관심사 | Child interest | 관심사 그래프에서 하위 계층에 속하는 관심사 |
| 관심사 할당량 | Interest quota | 사용자 구독 플랜에 따른 관심사 생성 가능 개수 |

<br>

Expand All @@ -145,11 +150,11 @@ dependencies {

### 스트릭

| 한글명 | 영문명 | 설명 |
|-----------|---------------------|-------------------------------|
| 스트릭 | Streak | 기간 별 퀘스트를 완료한 개수 만큼 쌓이는 점수 |
| 성취자 | Achiever | 퀘스트를 등록하고 수행하는 사용자 |
| 스트릭 타입 | Streak type | 일간, 주간, 월간 등의 스트릭 유형 |
| 한글명 | 영문명 | 설명 |
|--------|-------------|----------------------------|
| 스트릭 | Streak | 기간 별 퀘스트를 완료한 개수 만큼 쌓이는 점수 |
| 성취자 | Achiever | 퀘스트를 등록하고 수행하는 사용자 |
| 스트릭 타입 | Streak type | 일간, 주간, 월간 등의 스트릭 유형 |

<br>

Expand All @@ -158,17 +163,17 @@ dependencies {
| 한글명 | 영문명 | 설명 |
|--------|-------------|----------------------|
| 포인트 | Point | 서비스 내의 재화 |
| 거래자 | Transactor | 포인트를 획득하고 사용하는 사용자 |
| 거래자 | Transactor | 포인트를 획득하고 사용하는 사용자 |
| 스트릭 타입 | Streak type | 일간, 주간, 월간 등의 스트릭 유형 |

<br>

### 설문

| 한글명 | 영문명 | 설명 |
|--------|----------------|-----------------|
| 설문 | Survey | 사용자 정보를 수집하는 설문 |
| 한글명 | 영문명 | 설명 |
|--------|-----------------|-----------------|
| 설문 | Survey | 사용자 정보를 수집하는 설문 |
| 설문 응답자 | Respondent | 설문을 작성한 사용자 |
| 설문 문항 | Survey question | 설문에 포함되는 질문 |
| 항목 | Survey item | 문항에 포함되는 항목 |
| 답변 | Survey result | 사용자가 수행한 설문 기록 |
| 답변 | Survey result | 사용자가 수행한 설문 기록 |
17 changes: 14 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ repositories {
mavenCentral()
}

ext {
set('springModulithVersion', "1.4.4")
snippetsDir = file('build/generated-snippets')
}

dependencies {
// web
implementation 'org.springframework.boot:spring-boot-starter-web'
Expand Down Expand Up @@ -91,10 +96,14 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

// batch
// spring batch
implementation("org.springframework.boot:spring-boot-starter-batch")
implementation("org.springframework.boot:spring-boot-starter-quartz")

// spring modulith
implementation 'org.springframework.modulith:spring-modulith-starter-jpa'
testImplementation 'org.springframework.modulith:spring-modulith-starter-test'

// test
testRuntimeOnly "org.junit.platform:junit-platform-launcher"
testImplementation "org.springframework.boot:spring-boot-starter-test"
Expand All @@ -110,8 +119,10 @@ dependencies {
testImplementation "org.testcontainers:minio"
}

ext {
snippetsDir = file('build/generated-snippets')
dependencyManagement {
imports {
mavenBom "org.springframework.modulith:spring-modulith-bom:${springModulithVersion}"
}
}

tasks.named('test') {
Expand Down
74 changes: 51 additions & 23 deletions src/docs/asciidoc/apis/auth-api.adoc
Original file line number Diff line number Diff line change
@@ -1,3 +1,43 @@
=== 회원 가입

`POST /auth/signup`

새로운 회원을 생성합니다.

==== 요청 헤더

operation::auth-signup[snippets='request-headers']

==== 요청 본문 (JSON)

operation::auth-signup[snippets='http-request,request-fields']

==== 성공 응답

operation::auth-signup[snippets='http-response,response-fields']

'''

=== 비밀번호 초기화 (찾기)

`PUT /auth/passwords/reset`

이메일 인증 등을 통해 본인인증이 완료된 사용자가 비밀번호를 새로 설정합니다.

==== 요청 헤더

operation::auth-password-reset[snippets='request-headers']

==== 요청 본문 (JSON)

operation::auth-password-reset[snippets='http-request,request-fields']

==== 성공 응답

성공 시 `204 No Content` 상태 코드와 함께 빈 응답 본문을 반환합니다.

'''

=== 로그인

`POST /auth/login`
Expand All @@ -16,10 +56,6 @@ operation::auth-login[snippets='http-request,request-fields']

operation::auth-login[snippets='http-response,response-fields']

// ==== 에러 응답
//
// operation::auth-login-error[snippets='http-response,response-fields']

'''

=== 로그아웃
Expand All @@ -36,10 +72,6 @@ operation::auth-logout[snippets='request-headers']

성공 시 `204 No Content` 상태 코드와 함께 빈 응답 본문을 반환합니다.

// ==== 에러 응답
//
// operation::member-logout-error[snippets='http-response,response-fields']

'''

=== Refresh Token 재발급
Expand All @@ -60,74 +92,70 @@ operation::auth-update-refresh-token[snippets='request-cookies']

operation::auth-update-refresh-token[snippets='http-response,response-fields']

// ==== 에러 응답
//
// operation::auth-update-refresh-token-error[snippets='http-response,response-fields']

'''

=== 이메일 인증 코드 발송 (회원 가입)

`POST /members/emails/codes/signup`
`POST /auth/codes/emails/signup`

회원가입에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다.

==== 요청 헤더

operation::member-email-auth-code-create[snippets='request-headers']
operation::auth-code-for-sign-up-create[snippets='request-headers']

==== 요청 본문 (JSON)

operation::member-email-auth-code-create[snippets='http-request,request-fields']
operation::auth-code-for-sign-up-create[snippets='http-request,request-fields']

==== 성공 응답

성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다.

==== 에러 응답 (이미 가입된 이메일)

operation::member-email-auth-code-create-error[snippets='http-response,response-fields']
operation::auth-code-for-sign-up-create-error[snippets='http-response,response-fields']

'''

=== 이메일 인증 코드 발송 (비밀번호 변경 시)

`POST /members/passwords/reset`
`POST /auth/codes/emails/passwords/reset`

비밀번호 찾기에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다.

==== 요청 헤더

operation::member-password-auth-code-create[snippets='request-headers']
operation::auth-code-for-password-reset-create[snippets='request-headers']

==== 요청 본문 (JSON)

operation::member-password-auth-code-create[snippets='http-request,request-fields']
operation::auth-code-for-password-reset-create[snippets='http-request,request-fields']

==== 성공 응답

성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다.

==== 에러 응답 (이미 가입된 이메일)

operation::member-password-auth-code-create-error[snippets='http-response,response-fields']
operation::auth-code-for-password-reset-create-error[snippets='http-response,response-fields']

'''

=== 이메일 인증 코드 검증

`GET /members/emails/codes/verify`
`GET /auth/codes/emails/verify`

이메일로 발송된 인증 코드가 올바른지 검증합니다.

==== 쿼리 파라미터

operation::member-email-auth-code-verify[snippets='query-parameters']
operation::auth-code-verify[snippets='query-parameters']

==== 성공 응답

인증 성공 시, `200 OK` 상태 코드와 함께 빈 응답 본문을 반환합니다.

==== 에러 응답 (잘못된 인증 코드)

operation::member-email-auth-code-verify-error[snippets='http-response,response-fields']
operation::auth-code-verify-error[snippets='http-response,response-fields']
Loading