Commit d87d55d
authored
feat: 모집 공고 API 리팩토링 (#537)
* Align public recruit path with existing API naming
The active recruit endpoint was introduced under /recruitments, but the current rollout should avoid broad URL vocabulary changes while frontend integration is pending. Keep the endpoint under /recruit and limit this PR to controller/API spec/test path updates.
Constraint: Frontend integration should not absorb URL naming changes yet
Rejected: Rename response field recruitments | expands frontend payload contract changes
Confidence: high
Scope-risk: narrow
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.controller.RecruitControllerTest -x jacocoTestCoverageVerification
Not-tested: Full test suite; targeted path-only change
Related: #536
* Restore public recruits path for active listings
The previous correction used singular /recruit, but the existing public naming is plural /recruits. Keep the active listing endpoint aligned with that existing route vocabulary instead of introducing another URL shape.
Constraint: Frontend integration should avoid API URL churn
Rejected: Keep /recruit | does not match the existing public route naming
Confidence: high
Scope-risk: narrow
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.controller.RecruitControllerTest -x jacocoTestCoverageVerification
Not-tested: Full test suite; targeted route correction only
Related: #536
* Allow question lookup by recruit id
Applicants need to continue using the existing /apply/questions URL while the frontend migrates gradually. Extend the current question lookup contract with an optional recruitId query path and keep the legacy jobFamily lookup unchanged.
Constraint: Do not introduce a new questions URL in this rollout
Rejected: Add /recruitments/{recruitId}/questions | creates frontend URL churn before integration capacity is available
Confidence: high
Scope-risk: moderate
Directive: Keep /apply/questions jobFamily compatibility until the recruitId-based apply flow is fully adopted
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.service.QuestionServiceTest --tests org.ject.support.domain.recruit.repository.QuestionQueryRepositoryTest -x jacocoTestCoverageVerification
Not-tested: QuestionControllerTest locally; blocked by Docker/Testcontainers Redis availability
Related: #536
* Require recruit id for question lookup
The public question lookup contract now identifies the active notice directly, so the controller no longer accepts a parallel jobFamily filter or validates a mixed recruitId/jobFamily condition. The service and query layer follow the same single-key path, which keeps cache entries scoped by recruit id and avoids exposing legacy jobFamily lookup behavior through this API.
Constraint: Review feedback requested recruitId as the required question lookup parameter
Rejected: Keep jobFamily as an optional compatibility parameter | it preserved ambiguity and required extra mismatch handling
Confidence: high
Scope-risk: narrow
Directive: Do not reintroduce jobFamily-based question lookup without a separate compatibility decision
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.service.QuestionServiceTest --tests org.ject.support.domain.recruit.repository.QuestionQueryRepositoryTest -x jacocoTestCoverageVerification
Not-tested: QuestionControllerTest and CacheFallbackIntegrationTest require local Docker/Testcontainers Redis; context load failed before tests ran
* Assert question error response code
Question lookup errors are serialized through ErrorResponse, whose machine-readable value is exposed as code rather than status. Keeping the test on code makes the missing recruitId case verify the actual error contract instead of a success-response field.
Constraint: CodeRabbit identified the stale status-path assertion pattern in the outdated review thread
Confidence: high
Scope-risk: narrow
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.service.QuestionServiceTest --tests org.ject.support.domain.recruit.repository.QuestionQueryRepositoryTest -x jacocoTestCoverageVerification
Not-tested: QuestionControllerTest requires local Docker/Testcontainers Redis; previous runs failed during context loading before assertions
* Keep wrapped error status assertion
QuestionControllerTest should assert the final API envelope produced by ResponseWrapper. ErrorResponse exposes code internally, but the response advice converts it into ApiResponse.status for clients, so the missing recruitId case must continue to verify status=GLOBAL-10.
Constraint: ResponseWrapper wraps ErrorResponse into ApiResponse before serialization
Rejected: Assert $.code | that path is not present in the final wrapped response body
Confidence: high
Scope-risk: narrow
Tested: ./gradlew cleanTest test --tests org.ject.support.domain.recruit.service.QuestionServiceTest --tests org.ject.support.domain.recruit.repository.QuestionQueryRepositoryTest -x jacocoTestCoverageVerification
Not-tested: QuestionControllerTest requires local Docker/Testcontainers Redis in this environment1 parent 3491d45 commit d87d55d
12 files changed
Lines changed: 167 additions & 49 deletions
File tree
- src
- main/java/org/ject/support/domain/recruit
- controller
- repository
- service
- test/java/org/ject/support
- common/data/redis/resilience
- domain/recruit
- controller
- repository
- service
Lines changed: 2 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | 5 | | |
7 | 6 | | |
8 | 7 | | |
| |||
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | | - | |
15 | | - | |
| 13 | + | |
| 14 | + | |
16 | 15 | | |
Lines changed: 2 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | 4 | | |
6 | 5 | | |
7 | 6 | | |
| |||
20 | 19 | | |
21 | 20 | | |
22 | 21 | | |
23 | | - | |
24 | | - | |
| 22 | + | |
| 23 | + | |
25 | 24 | | |
26 | 25 | | |
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | 3 | | |
5 | 4 | | |
6 | 5 | | |
7 | 6 | | |
8 | 7 | | |
9 | 8 | | |
10 | 9 | | |
11 | | - | |
| 10 | + | |
12 | 11 | | |
Lines changed: 11 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | | - | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
26 | 33 | | |
27 | 34 | | |
28 | 35 | | |
| |||
36 | 43 | | |
37 | 44 | | |
38 | 45 | | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
| 46 | + | |
43 | 47 | | |
44 | 48 | | |
45 | 49 | | |
| |||
Lines changed: 12 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | 4 | | |
| 5 | + | |
| 6 | + | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
| 14 | + | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
16 | 18 | | |
17 | 19 | | |
18 | 20 | | |
| 21 | + | |
19 | 22 | | |
20 | | - | |
21 | | - | |
| 23 | + | |
22 | 24 | | |
23 | | - | |
24 | | - | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
25 | 31 | | |
26 | 32 | | |
Lines changed: 4 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| 55 | + | |
| 56 | + | |
55 | 57 | | |
56 | 58 | | |
57 | 59 | | |
| |||
64 | 66 | | |
65 | 67 | | |
66 | 68 | | |
67 | | - | |
| 69 | + | |
68 | 70 | | |
69 | 71 | | |
70 | 72 | | |
| |||
104 | 106 | | |
105 | 107 | | |
106 | 108 | | |
107 | | - | |
| 109 | + | |
108 | 110 | | |
109 | 111 | | |
110 | 112 | | |
| |||
Lines changed: 32 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | 3 | | |
5 | 4 | | |
6 | 5 | | |
| |||
15 | 14 | | |
16 | 15 | | |
17 | 16 | | |
18 | | - | |
19 | 17 | | |
20 | 18 | | |
21 | 19 | | |
| |||
26 | 24 | | |
27 | 25 | | |
28 | 26 | | |
| 27 | + | |
29 | 28 | | |
30 | 29 | | |
31 | 30 | | |
32 | 31 | | |
33 | 32 | | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
| 64 | + | |
63 | 65 | | |
64 | 66 | | |
65 | 67 | | |
| |||
69 | 71 | | |
70 | 72 | | |
71 | 73 | | |
72 | | - | |
| 74 | + | |
73 | 75 | | |
74 | 76 | | |
75 | 77 | | |
76 | | - | |
| 78 | + | |
77 | 79 | | |
78 | 80 | | |
79 | 81 | | |
| |||
87 | 89 | | |
88 | 90 | | |
89 | 91 | | |
90 | | - | |
| 92 | + | |
91 | 93 | | |
92 | 94 | | |
93 | 95 | | |
| |||
100 | 102 | | |
101 | 103 | | |
102 | 104 | | |
103 | | - | |
104 | 105 | | |
105 | | - | |
| 106 | + | |
106 | 107 | | |
107 | 108 | | |
108 | | - | |
| 109 | + | |
109 | 110 | | |
110 | 111 | | |
111 | 112 | | |
112 | 113 | | |
113 | 114 | | |
114 | | - | |
115 | | - | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
116 | 138 | | |
117 | 139 | | |
Lines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
65 | | - | |
| 65 | + | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| |||
82 | 82 | | |
83 | 83 | | |
84 | 84 | | |
85 | | - | |
| 85 | + | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
| |||
0 commit comments