Skip to content

feat(application): Application JPA 저장소 구성 #24 - #63

Open
wlyoon921 wants to merge 10 commits into
developfrom
feat/24-application-persistence
Open

feat(application): Application JPA 저장소 구성 #24#63
wlyoon921 wants to merge 10 commits into
developfrom
feat/24-application-persistence

Conversation

@wlyoon921

Copy link
Copy Markdown

Summary

원서작성 및 성적산출 기능의 MySQL JPA 저장소를 구성했습니다.
ERD 기준으로 applicants, middle_school_infos, academic_records, subject_grades, ged_scores, pass_results entity를 분리했습니다.
Spring Data repository와 ApplicantRepository persistence adapter를 추가했습니다.

Related Issue

Related to #24

Scope

In scope:

  • ApplicantJpaEntity
  • MiddleSchoolInfoJpaEntity
  • AcademicRecordJpaEntity
  • SubjectGradeJpaEntity
  • GedScoreJpaEntity
  • PassResultJpaEntity
  • Spring Data JPA repository
  • ApplicantRepository persistence adapter
  • adapter-out Bazel 의존성

Out of scope:

  • migration script
  • admin 합격/불합격 처리
  • 2차 전형 점수 계산
  • 외부 identity 서비스 연동

Implementation

데이터 모델링 기준에 맞춰 지원자, 중학교 정보, 생활기록/성적, 검정고시 성적, 합격 결과를 별도 entity로 분리했습니다.
SubjectGrade와 PassResult는 복합키를 사용해 ERD의 PK 구조를 반영했습니다.
ApplicantPersistenceAdapter는 application 계층의 ApplicantRepository port를 구현합니다.
지원자 생성, 조회, 수정, 성적 정보 저장 흐름을 JPA repository로 처리합니다.

Testing

  • Unit test code: 후속 테스트 PR에서 추가
  • Integration tests: 후속 이슈에서 보완 필요
  • Manual verification: 후속 PR에서 build/test 수행 예정

Deployment Notes

Feature flag: 없음
Migration required: 예, application DB schema 필요
Rollout considerations:

  • dev profile에서는 Hibernate ddl-auto update로 로컬 확인 가능합니다.
  • prod profile에서는 ddl-auto validate 기준으로 운영 schema가 선행되어야 합니다.
  • 합격 결과 처리는 admin 기능과 연동될 예정입니다.

Checklist

  • Matches product/tech requirements
  • Backward compatibility considered
  • Data modeling compatibility considered
  • API success flow verified in a running environment
  • Real persistence adapter connected

@wlyoon921
wlyoon921 requested review from kusuri12-09 and tlgms July 30, 2026 11:29
@wlyoon921 wlyoon921 self-assigned this Jul 30, 2026
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are limited based on label configuration.

🏷️ Required labels (at least one) (1)
  • ready-for-review
🚫 Excluded labels (none allowed) (2)
  • wip
  • do-not-review

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5bf6c05b-5841-49ba-9d25-d525fa5cdc04

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

지원자는 REST API를 통해 지원서 정보와 성적 정보를 단계별로 저장·수정할 수 있습니다. 시스템은 전형별 평가 점수를 계산하고 표준화된 응답과 오류를 반환합니다.

아키텍처 변경

  • 지원자 생성·수정·제출과 랜딩 조회를 ApplicationPortApplicationCommandService로 구성했습니다.
  • 성적·학업 기록 저장과 평가 계산을 EvaluationPortEvaluationCommandService로 구성했습니다.
  • ApplicationControllerEvaluationController를 추가했습니다.
  • 공통 응답인 ApiResponse, ErrorResponse, ErrorDetail을 추가했습니다.
  • GlobalExceptionHandler가 지원자 미존재, 잘못된 요청, 미처리 예외를 HTTP 오류로 변환합니다.
  • 지원자, 중학교 정보, 학업 기록, 과목 성적, GED 성적, 합격 결과를 JPA 엔티티로 분리했습니다.
  • SubjectGradeIdPassResultId에 복합 키를 적용했습니다.
  • Spring Data JPA 기반 ApplicantJpaRepositoryApplicantPersistenceAdapter를 추가했습니다.
  • MySQL Connector/J와 Spring Boot JPA 의존성을 Bazel 설정에 추가했습니다.
  • 전형 유형별 ScoreCalculator를 추가했습니다.

위험 영역

  • 신청서 필수값과 전형별 점수 범위 검증이 서비스 로직에 집중되어 있습니다.
  • JPA 연관관계, cascade, orphan removal 설정이 데이터 삭제와 갱신 결과에 영향을 줄 수 있습니다.
  • 복합 키의 enum 저장 형식과 컬럼 정의가 데이터베이스 스키마와 일치해야 합니다.
  • 현재 단위 테스트와 통합 테스트가 없습니다.
  • 외부 identity 서비스 연동과 관리자 합격·불합격 처리는 포함하지 않습니다.

마이그레이션 및 호환성

  • applicants, middle_school_info, academic_records, subject_grades, ged_scores, pass_results 테이블과 복합 키를 포함한 스키마 마이그레이션이 필요합니다.
  • 개발 환경은 Hibernate ddl-auto=update를 사용하고 운영 환경은 ddl-auto=validate를 사용해야 합니다.
  • 운영 배포 전에 실제 MySQL 스키마와 JPA 매핑을 검증해야 합니다.
  • 기존 API 소비자는 /api/application/v11/applicants 및 평가 API의 요청·응답 DTO 변경을 확인해야 합니다.

검증 체크리스트 및 롤아웃

  • MySQL 마이그레이션 스크립트를 작성하고 복합 키를 검증합니다.
  • JPA 엔티티의 저장·조회·수정 통합 테스트를 추가합니다.
  • 신청서 필수값과 성적 범위 검증 단위 테스트를 추가합니다.
  • 전형별 ScoreCalculator 계산 결과와 반올림 규칙을 검증합니다.
  • 예외 응답 형식과 HTTP 상태 코드를 API 테스트로 검증합니다.
  • 개발 환경에서 ddl-auto=update 동작을 확인합니다.
  • 운영 환경에서 ddl-auto=validate가 스키마 불일치를 차단하는지 확인합니다.
  • 마이그레이션 적용 후 애플리케이션 저장·조회 기능을 단계적으로 배포합니다.

Walkthrough

지원서 작성·제출 API와 평가 API를 추가했습니다. 지원자 도메인 모델, 전형별 점수 계산, 애플리케이션 서비스, JPA 영속화, 공통 오류 응답을 함께 구현했습니다.

Changes

지원서 및 평가 기능

Layer / File(s) Summary
도메인 모델 및 평가 계산
systems/application/application-domain/...
지원자, 학업 기록, 성적 모델과 전형·성적 관련 열거형을 추가했습니다. 전형별 점수 계산과 점수 제한·반올림 로직을 구현했습니다.
애플리케이션 포트와 서비스
systems/application/application-application/...
지원서 생성·수정·제출과 평가 정보 저장·계산을 위한 명령, 결과, 포트, 서비스를 추가했습니다. 입력 검증과 ApplicantNotFoundException 처리를 구현했습니다.
웹 API와 응답 계약
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/...
지원서와 평가 REST API를 추가했습니다. 요청·응답 DTO, 일정 설정, 공통 응답 및 전역 예외 응답을 구현했습니다.
JPA 영속화와 저장소
systems/application/application-adapter-out/...
지원자, 학업 기록, 성적, GED 점수, 합격 결과의 JPA 매핑을 추가했습니다. 복합 식별자, Spring Data 저장소, 저장 어댑터를 구현했습니다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Suggested labels: feature, kotlin, bazel

Suggested reviewers: kusuri12-09, tlgms

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ApplicationController
  participant ApplicationCommandService
  participant ApplicantPersistenceAdapter
  Client->>ApplicationController: 지원서 요청
  ApplicationController->>ApplicationCommandService: 명령 객체 전달
  ApplicationCommandService->>ApplicantPersistenceAdapter: 지원자 저장 또는 조회
  ApplicantPersistenceAdapter-->>ApplicationCommandService: 도메인 객체 반환
  ApplicationCommandService-->>ApplicationController: 처리 결과 반환
  ApplicationController-->>Client: ApiResponse 반환
Loading
sequenceDiagram
  participant Client
  participant EvaluationController
  participant EvaluationCommandService
  participant ScoreCalculator
  Client->>EvaluationController: 평가 정보 또는 결과 요청
  EvaluationController->>EvaluationCommandService: 평가 명령 전달
  EvaluationCommandService->>ScoreCalculator: 점수 계산 요청
  ScoreCalculator-->>EvaluationCommandService: 전형별 점수 반환
  EvaluationCommandService-->>EvaluationController: 평가 결과 반환
  EvaluationController-->>Client: EvaluationResultResponse 반환
Loading
🚥 Pre-merge checks | ✅ 8 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 85.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Behavior Change Needs Tests ⚠️ Warning PR diff에 application-adapter-out 운영 Kotlin 파일 10개가 추가되었지만 테스트 파일 변경은 없습니다. 설명도 테스트를 후속 작업으로 미룬다고만 하며 불필요 사유를 제시하지 않습니다. ApplicantJpaEntity, 연관 엔티티, ApplicantPersistenceAdapter의 변환·저장·조회 동작을 검증하는 application-adapter-out 테스트를 같은 PR에 추가하세요.
✅ Passed checks (8 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 Conventional Commit 형식인 feat(application): subject를 따르며, Application JPA 저장소 구성이라는 주요 변경을 정확히 설명합니다.
Description check ✅ Passed 설명이 JPA 엔티티, 저장소, persistence adapter 및 범위를 구체적으로 설명하며 변경 사항과 직접 관련됩니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Kotlin Layer Boundary ✅ Passed domain 운영 코드에는 adapter/bootstrap import가 없습니다. application의 @Service는 빈 등록 목적이며, 저장소 가이드와 기존 application 모듈 패턴으로 정당화됩니다.
Go Error Context ✅ Passed 실제 PR diff의 변경 파일은 Kotlin 10개와 deps.bzl 1개이며, 변경된 Go 코드와 Go 외부 호출 오류 처리가 없습니다.
Bazel Formatting ✅ Passed 변경된 유일한 .bzl 파일은 4칸 들여쓰기와 후행 쉼표를 사용하며 공백 오류가 없습니다. BUILD target은 변경되지 않았고 참조한 :main target도 존재합니다.
Todo Must Reference Issue ✅ Passed PR 기준 커밋부터 HEAD까지의 실제 diff에 추가된 TODO/FIXME 토큰과 주석이 없습니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/24-application-persistence
  • 🛠️ cleanup stale imports
  • 🛠️ harden error messages
  • 🛠️ test clarity pass

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 26

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt`:
- Around line 55-64: Update ApplicationController.kt:55-64 to derive accountId
from the validated authentication principal instead of request.accountId; update
ApplicationController.kt:67-174 so every modification or submission verifies
that the principal owns the target applicant; update
EvaluationController.kt:31-105 to apply the same authentication and
applicant-ownership checks before saving scores or retrieving evaluation
results.
- Around line 41-192: Add web or integration tests in the application adapter-in
subsystem for ApplicationController
(systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt:41-192),
covering applicant creation, updates, submission, successful responses,
validation failures, ownership failures, and expected HTTP status codes. Add
corresponding tests for EvaluationController
(systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/EvaluationController.kt:26-126)
covering grade saving and evaluation-result response contracts, including normal
and failure cases.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt`:
- Around line 3-5: 요청 본문에서 계정·지원자 식별자를 신뢰하지 않도록 인증 주체 기반으로 소유권을 검증하십시오.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt#L3-L5에서는
accountId를 제거하고 principal의 계정 식별자를 사용하십시오. SaveAcademicRecordRequest.kt#L3-L11,
SaveCertificatesRequest.kt#L3-L7, SaveGedScoresRequest.kt#L3-L12,
SubmitApplicationRequest.kt#L3-L5의 각 저장·제출 경로에서는 작업 전에 principal이 applicantId의
소유자인지 포트 또는 애플리케이션 서비스에서 검증하십시오.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt`:
- Around line 9-14: SaveAcademicRecordRequest의 volunteerTime 입력 계약을 단일 필수 필드로
통합하십시오. volunteer_time 프로퍼티와 resolvedVolunteerTime() 메서드를 제거하고 volunteerTime만
사용하도록 요청 DTO와 호출부를 갱신하십시오. API 경계에서 두 이름을 모두 받는 로직이 있다면 충돌 요청은 거부하며, 프로퍼티·함수·지역
변수는 lowerCamelCase를 유지하십시오.
- Around line 12-14: 동일 서브시스템에 변환 로직과 웹 계약을 검증하는 테스트가 누락되었습니다.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L12-L14에는
누락 값, 두 입력 이름이 모두 제공된 충돌 값의 거부, 각 단일 입력의 정상 처리를 검증하는 테스트를 추가하십시오.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt#L15-L40에는
결과 객체의 모든 필드가 응답 DTO에 보존되는 테스트를,
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt#L15-L24에는
일곱 과목 등급이 대응하는 도메인 과목 필드로 정확히 매핑되는 테스트를 추가하십시오. 웹 계층 테스트에서는 JSON 요청 역직렬화와 HTTP
응답 계약도 검증하십시오.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/exception/GlobalExceptionHandler.kt`:
- Around line 23-59: Update GlobalExceptionHandler.handleApplicantNotFound and
handleInvalidRequest to return fixed client-safe messages instead of
exception.message, while preserving their 404/APPLICANT_NOT_FOUND and
400/INVALID_REQUEST mappings. Add deterministic application-adapter-in contract
tests covering those handlers plus handleUnhandledException’s
500/INTERNAL_SERVER_ERROR response and confirming exception details are absent
from every response.
- Around line 40-45: handleInvalidRequest in GlobalExceptionHandler must stop
exposing exception.message in ErrorResponse; always return the fixed "invalid
request" message while preserving the BAD_REQUEST status and INVALID_REQUEST
code. Log the detailed exception server-side with the correlation ID, and add
module tests covering the exception mapping and fixed response message.

In `@systems/application/application-adapter-out/deps.bzl`:
- Around line 1-6: Remove com_mysql_mysql_connector_j from KOTLIN_DEPS and
declare it under the kt_jvm_library runtime_deps for application-adapter-out.
Keep the existing compile-time dependencies unchanged.

In
`@systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/AcademicRecordJpaEntity.kt`:
- Around line 18-26: AcademicRecordJpaEntity의 applicant 지연 로딩 프록시가 생성되도록 JPA
all-open 설정을 적용하세요. application-adapter-out의 kt_jvm_library에 spring_allopen
플러그인과 jakarta.persistence.Entity 대상 설정을 추가하거나, 해당 프로퍼티를 open var로 선언해 기존
FetchType.LAZY 동작을 보장하세요.
- Around line 63-74: Update the entity-mapping logic around the subjectGrades
and gedScores assignments to reconcile existing entities by their keys and
update them in place, rather than clearing collections or replacing associated
instances. Reuse matching SubjectGradeJpaEntity entries by schoolSemester and
the existing GedScoreJpaEntity for the academic record, add only genuinely new
entries, and remove entries no longer present while preserving orphan removal
behavior.

In
`@systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/ApplicantJpaEntity.kt`:
- Around line 114-118: 기본 EAGER 연관 로딩을 제거해 지원자 조회 시 불필요한 조인을 방지하세요.
ApplicantJpaEntity.kt의 middleSchoolInfo와 academicRecord,
AcademicRecordJpaEntity.kt의 subjectGrades와 gedScores를 FetchType.LAZY로 변경하고, 필요한
도메인 변환 조회에는 ApplicantJpaRepository의 `@EntityGraph` 지정 조회 메서드를 추가해 해당 연관만 명시적으로
로딩하세요.
- Line 192: Update updateAcademicRecord to use the imported AcademicRecord type
instead of the fully qualified
hs.kr.entrydsm.application.domain.model.AcademicRecord name, adding the import
with the other domain model imports and preserving the method behavior.
- Line 177: Update ApplicantJpaEntity.updateFrom to stop assigning
domain.createdAt, preserving the existing entity creation timestamp during
updates. Keep createdAt initialized only once when constructing a new entity
through from, and declare the corresponding persistence column immutable.
- Around line 201-205: ApplicantJpaEntity.Companion.from에서 신규 엔티티를 생성할 때는 항상 id를
null로 유지하고, 양수 domain.id가 기존 엔티티 조회에 실패하면 해당 ID를 가진 행을 생성하지 말고 예외를 발생시키도록 수정하세요.
id가 0인 신규 생성 경로와 양수 ID 조회 실패 경로를 검증하는 결정적 테스트를 추가하세요.

In
`@systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantPersistenceAdapter.kt`:
- Around line 9-26: Add repository tests for ApplicantPersistenceAdapter
covering new Applicant ID assignment, existing Applicant updates preserving
createdAt, repeated persistence of academic records and subject grades, and
findById returning null for unknown IDs. Extend TEST_DEPS beyond junit_junit
with the dependencies required for the project’s JPA integration-test setup, and
use the existing test infrastructure and entity/domain fixtures.
- Around line 14-21: Apply optimistic locking to ApplicantJpaEntity by adding a
`@Version` field and preserving its value through entity/domain conversions.
Update ApplicantPersistenceAdapter.save to translate
OptimisticLockingFailureException into the project’s domain exception that
signals callers to retry, while retaining the existing save behavior for
non-conflicting writes.

In
`@systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt`:
- Around line 220-228: Update submit in ApplicationCommandService to persist a
submission marker, such as submittedAt or applicationStatus, in the Applicant
domain and persistence models. Set this marker atomically with the existing
saveTouched operation after validation, so submitted applications remain
distinguishable from drafts.
- Around line 32-34: ApplicationCommandService의 createApplicant 및 관련 생성·입력
검증·수정·제출 유스케이스에 대한 테스트를 같은 application 서브시스템에 추가하십시오. 정상 흐름과 GED 졸업일 규칙, 전화번호
검증, 자기소개서 길이 제한, 제출 후 완료 상태를 각각 검증하고, 기존 테스트 구조와 픽스처를 재사용하십시오.
- Around line 26-31: ApplicationCommandService에서 Spring 의존성을 제거하십시오.
org.springframework.stereotype.Service import와 클래스의 `@Service` 어노테이션을 삭제하고, 해당 서비스
빈 등록은 구성 계층에서 처리하도록 구성하십시오.
- Around line 235-237: ApplicationCommandService의 saveTouched 흐름에서 오래된 Applicant
Aggregate 전체 저장으로 인한 덮어쓰기를 방지하십시오. ApplicantPersistenceAdapter.save에 버전 조건부 저장을
적용하거나 명령별 부분 업데이트로 변경하고, 동시 수정 시 충돌 저장이 거부되도록 구현하십시오. 충돌 동작을 검증하는 테스트도 추가하십시오.

In
`@systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt`:
- Around line 137-142: Update calculateResult so totalScore uses the score key
matching applicant.admissionType instead of always using "REGULAR". Reject
calculation when admissionType is missing, while preserving the existing score
calculation, timestamp update, and repository save flow for valid applicants.
- Around line 139-142: Update the score refresh flow in EvaluationCommandService
around scoreCalculator.calculate and applicantRepository.save by calling
applicant.touch() after updating totalScore and totalScoreUpdatedAt, before
saving the applicant.
- Around line 20-26: Remove the Spring `@Service` annotation and its import from
EvaluationCommandService, then register EvaluationCommandService as a bean in
the external bootstrap or adapter configuration. In
systems/application/application-application/deps.bzl lines 1-4, remove the
Spring Boot starter if it is only used for this annotation; otherwise move the
dependency to the adapter or bootstrap module.

In
`@systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt`:
- Around line 21-26: Enforce graduationType-based score invariants in
ScoreCalculator.kt: select the GED or school calculation solely from
applicant.graduationType and reject unsupported or mismatched score states
instead of inferring the type from gedScores. In EvaluationCommandService.kt,
validate before persistence that the submitted score type matches
applicant.graduationType, and either remove opposite-type data or reject the
save consistently.
- Around line 67-78: Update the score calculation around semesterWeights and
weightedScores in ScoreCalculator so every required semester has a subject grade
before calculating a score. If any required semester is missing, return the
existing incomplete/empty result instead of excluding it and normalizing by
reflectedWeight; only perform the weighted calculation when all required
semesters are present.
- Around line 13-197: Add deterministic unit tests for ScoreCalculator covering
graduation and GED scoring, missing required semesters, attendance boundary
values, additional-score caps, and rounding with meaningful assertions. Add
service tests for EvaluationCommandService covering per-track score persistence,
score-type validation, and updated-timestamp changes; apply the requested test
changes to both affected subsystem files.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 71ee815f-51e3-4bcd-a3a5-792f49a01078

📥 Commits

Reviewing files that changed from the base of the PR and between 7ff684b and 91fbb11.

📒 Files selected for processing (76)
  • systems/application/application-adapter-in/deps.bzl
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/EvaluationController.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/config/LandingScheduleProperties.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ApiResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorDetail.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/AddressRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveSubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateFamilyRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateIntroductionRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateMiddleSchoolRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdatePersonalRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateStudyPlanRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateTypeRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/AcademicRecordResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/CreateApplicantResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/EvaluationResultResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/LandingResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/PeriodResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/ScheduleResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/exception/GlobalExceptionHandler.kt
  • systems/application/application-adapter-out/deps.bzl
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/AcademicRecordJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/ApplicantJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/GedScoreJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/MiddleSchoolInfoJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultId.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeId.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantJpaRepository.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantPersistenceAdapter.kt
  • systems/application/application-application/deps.bzl
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/exception/ApplicantNotFoundException.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/ApplicationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/EvaluationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CalculateEvaluationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CreateApplicantCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveAcademicRecordCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveCertificatesCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveGedScoresCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveSubjectGradesCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SubmitApplicationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateFamilyCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateIntroductionCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateMiddleSchoolCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdatePersonalCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateStudyPlanCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateTypeCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/AcademicRecordResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/CreateApplicantResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/EvaluationResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/LandingResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/out/ApplicantRepository.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/AdmissionType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Gender.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GraduationType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GuardianRelation.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/PassResultStatus.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Region.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/ResultType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SchoolSemester.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SpecialAdmissionType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SubjectGrade.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/model/Applicant.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt
📜 Review details
🧰 Additional context used
📓 Path-based instructions (7)
**/*.{kt,go}

📄 CodeRabbit inference engine (Custom checks)

If production logic is changed in Kotlin or Go files, require corresponding test updates in the same subsystem unless the PR description explicitly justifies why tests are unnecessary

Files:

  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CalculateEvaluationCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateFamilyRequest.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/PassResultStatus.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Gender.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Region.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GuardianRelation.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveAcademicRecordCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/AddressRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateIntroductionRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateStudyPlanRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/LandingResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SubmitApplicationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/CreateApplicantResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveSubjectGradesCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/AdmissionType.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/ApplicationPort.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/EvaluationResultResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/CreateApplicantResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/LandingResult.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateMiddleSchoolRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveCertificatesCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorDetail.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/AcademicRecordResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SpecialAdmissionType.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveSubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateTypeRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateFamilyCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/ScheduleResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SubjectGrade.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateMiddleSchoolCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CreateApplicantCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateStudyPlanCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SchoolSemester.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/AcademicRecordResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateTypeCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/PeriodResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdatePersonalRequest.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeId.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveGedScoresCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ApiResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/out/ApplicantRepository.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdatePersonalCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/config/LandingScheduleProperties.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/EvaluationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateIntroductionCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GraduationType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/GedScoreJpaEntity.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/ResultType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/MiddleSchoolInfoJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultId.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantJpaRepository.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/exception/GlobalExceptionHandler.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/exception/ApplicantNotFoundException.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/ApplicantJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/model/Applicant.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/AcademicRecordJpaEntity.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/EvaluationController.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/EvaluationResult.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantPersistenceAdapter.kt
**/*-application/**/*.{java,kt,scala,groovy}

📄 CodeRabbit inference engine (Custom checks)

For files under *-application modules, flag direct dependency on infrastructure-specific framework classes unless justified

Files:

  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CalculateEvaluationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveAcademicRecordCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SubmitApplicationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/CreateApplicantResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveSubjectGradesCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/ApplicationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/LandingResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveCertificatesCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateFamilyCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateMiddleSchoolCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CreateApplicantCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateStudyPlanCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/AcademicRecordResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateTypeCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveGedScoresCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/out/ApplicantRepository.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdatePersonalCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/EvaluationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateIntroductionCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/exception/ApplicantNotFoundException.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/EvaluationResult.kt
**/*.{java,kt,scala,groovy,go,js,ts,tsx,jsx,py,rb,rs,cpp,c,h,hpp,cs}

📄 CodeRabbit inference engine (Custom checks)

Flag TODO/FIXME comments introduced by this PR that do not include an issue reference in the form #123 or a full tracker key like PROJ-123

Files:

  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CalculateEvaluationCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateFamilyRequest.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/PassResultStatus.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Gender.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Region.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GuardianRelation.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveAcademicRecordCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/AddressRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateIntroductionRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateStudyPlanRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/LandingResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SubmitApplicationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/CreateApplicantResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveSubjectGradesCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/AdmissionType.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/ApplicationPort.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/EvaluationResultResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/CreateApplicantResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/LandingResult.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateMiddleSchoolRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveCertificatesCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorDetail.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/AcademicRecordResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SpecialAdmissionType.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveSubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateTypeRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateFamilyCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/ScheduleResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SubjectGrade.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateMiddleSchoolCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CreateApplicantCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateStudyPlanCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SchoolSemester.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/AcademicRecordResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateTypeCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/PeriodResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdatePersonalRequest.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeId.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveGedScoresCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ApiResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/out/ApplicantRepository.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdatePersonalCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/config/LandingScheduleProperties.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/EvaluationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateIntroductionCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GraduationType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/GedScoreJpaEntity.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/ResultType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/MiddleSchoolInfoJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultId.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantJpaRepository.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/exception/GlobalExceptionHandler.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/exception/ApplicantNotFoundException.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/ApplicantJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/model/Applicant.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/AcademicRecordJpaEntity.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/EvaluationController.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/EvaluationResult.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantPersistenceAdapter.kt
**/*.kt

⚙️ CodeRabbit configuration file

**/*.kt: Apply Kotlin Official Coding Conventions.

Formatting and structure:

  • Use 4 spaces for indentation; no tabs.
  • Keep files focused and readable; avoid horizontal alignment for spacing.
  • Place related declarations together and keep overloads adjacent.
  • Keep implementation member order stable and logical for readability.

Naming:

  • Package names are lowercase and do not use underscores.
  • Class/object names use UpperCamelCase.
  • Functions/properties/local variables use lowerCamelCase.
  • Constants use UPPER_SNAKE_CASE only for true constants.

API and null-safety:

  • Avoid platform type leakage in public APIs.
  • Use explicit types in public APIs when inference obscures meaning.
  • Prefer immutable values (val) over mutable values (var) unless mutation is required.
  • Flag nullable flows that can be replaced with safer modeling.

Imports and idioms:

  • Avoid wildcard imports unless justified by language/tooling conventions.
  • Prefer expression bodies for short, clear functions.
  • Prefer standard library idioms over custom utility wrappers when equivalent.

Architecture and tests:

  • Respect module boundaries (domain/application/adapter/bootstrap layering).
  • Highlight behavior-changing code that lacks corresponding unit/integration tests.
  • Ask for deterministic tests and meaningful assertions, not only happy-path checks.

Files:

  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CalculateEvaluationCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateFamilyRequest.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/PassResultStatus.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Gender.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Region.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GuardianRelation.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveAcademicRecordCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/AddressRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateIntroductionRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateStudyPlanRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/LandingResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SubmitApplicationCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/CreateApplicantResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveSubjectGradesCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/AdmissionType.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/ApplicationPort.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/EvaluationResultResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/CreateApplicantResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/LandingResult.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateMiddleSchoolRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveCertificatesCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorDetail.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/AcademicRecordResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SpecialAdmissionType.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveSubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdateTypeRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateFamilyCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/ScheduleResponse.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SubjectGrade.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateMiddleSchoolCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/CreateApplicantCommand.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateStudyPlanCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SchoolSemester.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/AcademicRecordResult.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateTypeCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/response/PeriodResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ErrorResponse.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/UpdatePersonalRequest.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeId.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/SaveGedScoresCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ApiResponse.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/out/ApplicantRepository.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdatePersonalCommand.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/config/LandingScheduleProperties.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/SubjectGradeJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/EvaluationPort.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/command/UpdateIntroductionCommand.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GraduationType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/GedScoreJpaEntity.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/ResultType.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/MiddleSchoolInfoJpaEntity.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/PassResultId.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantJpaRepository.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/exception/GlobalExceptionHandler.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/exception/ApplicantNotFoundException.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/ApplicantJpaEntity.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/model/Applicant.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/entity/AcademicRecordJpaEntity.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/EvaluationController.kt
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/ApplicationController.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/ApplicationCommandService.kt
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/port/in/result/EvaluationResult.kt
  • systems/application/application-adapter-out/src/main/kotlin/hs/kr/entrydsm/application/adapterout/repository/ApplicantPersistenceAdapter.kt
**/*-domain/**/*.{java,kt,scala,groovy}

📄 CodeRabbit inference engine (Custom checks)

For files under *-domain modules, fail if imports reference adapter or bootstrap packages

Files:

  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/PassResultStatus.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Gender.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/Region.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GuardianRelation.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/AdmissionType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SpecialAdmissionType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SubjectGrade.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/SchoolSemester.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/GraduationType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/enum/ResultType.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/model/Applicant.kt
**/{BUILD.bazel,*.bzl}

📄 CodeRabbit inference engine (Custom checks)

In BUILD.bazel and .bzl files, require buildifier-compatible formatting and stable target naming

Files:

  • systems/application/application-adapter-out/deps.bzl
  • systems/application/application-adapter-in/deps.bzl
  • systems/application/application-application/deps.bzl
**/*.bzl

⚙️ CodeRabbit configuration file

**/*.bzl: Apply Bazel Starlark (.bzl) style guidance.

Readability and docs:

  • Keep file/module docstrings and docstrings for public functions/macros.
  • Use descriptive parameter names and document attribute intent.

API design:

  • Macros should take a name argument and derive generated target names from it.
  • Prefer keyword arguments when calling macros for clarity and stability.
  • Keep macro side effects predictable and visible.

Encapsulation:

  • Use private visibility for helper targets created by macros unless explicitly public.
  • Avoid exposing internal implementation targets unintentionally.

Tooling:

  • Enforce buildifier formatting and lint compliance.

Files:

  • systems/application/application-adapter-out/deps.bzl
  • systems/application/application-adapter-in/deps.bzl
  • systems/application/application-application/deps.bzl

Comment on lines +3 to +5
data class CreateApplicantRequest(
val accountId: Long,
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

요청 본문으로 대상 계정 또는 지원자를 결정하지 마십시오.

제공된 컨트롤러 경로는 요청의 accountId 또는 applicantId를 포트 명령으로 직접 전달합니다. ApplicationController의 생성·제출 경로는 선택적 Authorization 헤더도 사용하지 않습니다. 현재 경로에는 인증 주체와 대상 리소스의 소유 관계를 검증하는 지점이 없습니다. 공격자는 다른 식별자를 전송하여 다른 지원자의 정보 저장 또는 제출을 시도할 수 있습니다.

인증된 principal에서 계정 식별자를 파생하십시오. 지원자 수정·성적 저장·제출 전에는 principal이 해당 applicantId의 소유자인지 포트 또는 애플리케이션 서비스에서 검증하십시오.

  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt#L3-L5: 요청의 accountId를 제거하고 인증된 principal의 계정 식별자를 사용하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L3-L11: 저장 전에 applicantId 소유권을 검증하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt#L3-L7: 저장 전에 applicantId 소유권을 검증하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt#L3-L12: 저장 전에 applicantId 소유권을 검증하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt#L3-L5: 제출 전에 applicantId 소유권을 검증하십시오.
📍 Affects 5 files
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt#L3-L5 (this comment)
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L3-L11
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveCertificatesRequest.kt#L3-L7
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveGedScoresRequest.kt#L3-L12
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubmitApplicationRequest.kt#L3-L5
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt`
around lines 3 - 5, 요청 본문에서 계정·지원자 식별자를 신뢰하지 않도록 인증 주체 기반으로 소유권을 검증하십시오.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/CreateApplicantRequest.kt#L3-L5에서는
accountId를 제거하고 principal의 계정 식별자를 사용하십시오. SaveAcademicRecordRequest.kt#L3-L11,
SaveCertificatesRequest.kt#L3-L7, SaveGedScoresRequest.kt#L3-L12,
SubmitApplicationRequest.kt#L3-L5의 각 저장·제출 경로에서는 작업 전에 principal이 applicantId의
소유자인지 포트 또는 애플리케이션 서비스에서 검증하십시오.

Comment on lines +9 to +14
val volunteerTime: Int? = null,
val volunteer_time: Int? = null,
) {
fun resolvedVolunteerTime(): Int =
volunteerTime ?: volunteer_time
?: throw IllegalArgumentException("volunteerTime is required")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

하나의 volunteerTime 입력 계약만 유지하십시오.

Line 9와 Line 10은 같은 값을 서로 다른 이름으로 받습니다. 클라이언트가 두 값을 다르게 보내면 Line 13은 volunteerTime을 조용히 선택합니다. 이 동작은 잘못된 출결 데이터를 저장할 수 있습니다.

volunteer_time 필드와 resolvedVolunteerTime()을 제거하고 volunteerTime 하나를 필수 필드로 사용하십시오. 하위 호환성이 필요하면 API 경계에서 별도 버전 정책을 정의하고, 두 값이 함께 오면 요청을 거부하십시오.

As per path instructions, “Functions/properties/local variables use lowerCamelCase.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt`
around lines 9 - 14, SaveAcademicRecordRequest의 volunteerTime 입력 계약을 단일 필수 필드로
통합하십시오. volunteer_time 프로퍼티와 resolvedVolunteerTime() 메서드를 제거하고 volunteerTime만
사용하도록 요청 DTO와 호출부를 갱신하십시오. API 경계에서 두 이름을 모두 받는 로직이 있다면 충돌 요청은 거부하며, 프로퍼티·함수·지역
변수는 lowerCamelCase를 유지하십시오.

Source: Path instructions

Comment on lines +12 to +14
fun resolvedVolunteerTime(): Int =
volunteerTime ?: volunteer_time
?: throw IllegalArgumentException("volunteerTime is required")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

동일 서브시스템에 결정적 테스트를 추가하십시오.

이 PR은 요청 변환과 응답 변환의 실행 로직을 추가하지만, 제공된 변경에는 해당 테스트가 없습니다. PR 설명에서 테스트를 후속 작업으로 미룬 것은 테스트가 불필요한 이유가 아닙니다.

SaveAcademicRecordRequest에는 두 입력 이름이 모두 있을 때의 거부 동작을 검증하는 테스트를 추가하십시오. ResponseMapperSubjectGradesRequest.toDomain()에는 모든 필드가 정확히 매핑되는 테스트를 추가하십시오. 웹 계층 테스트에서는 JSON 요청과 HTTP 응답 계약도 검증하십시오.

  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L12-L14: 누락 값, 충돌 값, 정상 값을 검증하는 테스트를 추가하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt#L15-L40: 결과 객체의 모든 필드가 응답 DTO에 보존되는 테스트를 추가하십시오.
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt#L15-L24: 일곱 과목 등급이 같은 과목 필드로 변환되는 테스트를 추가하십시오.

As per coding guidelines, “If production logic is changed in Kotlin or Go files, require corresponding test updates in the same subsystem unless the PR description explicitly justifies why tests are unnecessary.”

📍 Affects 3 files
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L12-L14 (this comment)
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt#L15-L40
  • systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt#L15-L24
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt`
around lines 12 - 14, 동일 서브시스템에 변환 로직과 웹 계약을 검증하는 테스트가 누락되었습니다.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SaveAcademicRecordRequest.kt#L12-L14에는
누락 값, 두 입력 이름이 모두 제공된 충돌 값의 거부, 각 단일 입력의 정상 처리를 검증하는 테스트를 추가하십시오.
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/common/ResponseMapper.kt#L15-L40에는
결과 객체의 모든 필드가 응답 DTO에 보존되는 테스트를,
systems/application/application-adapter-in/src/main/kotlin/hs/kr/entrydsm/application/adapterin/web/dto/request/SubjectGradesRequest.kt#L15-L24에는
일곱 과목 등급이 대응하는 도메인 과목 필드로 정확히 매핑되는 테스트를 추가하십시오. 웹 계층 테스트에서는 JSON 요청 역직렬화와 HTTP
응답 계약도 검증하십시오.

Sources: Coding guidelines, Path instructions

Comment on lines +13 to +197
class ScoreCalculator {
fun calculate(applicant: Applicant): Map<String, Double> {
val record = applicant.academicRecord ?: return mapOf(
"REGULAR" to EMPTY_SCORE,
"SOCIAL" to EMPTY_SCORE,
"MEISTER" to EMPTY_SCORE,
)

val gedScores = record.gedScores
val baseSubjectScore = if (gedScores != null) {
calculateGedBaseScore(gedScores)
} else {
calculateSchoolBaseScore(record, applicant.graduationType)
}

val attendanceScore = calculateAttendanceScore(record)
val volunteerScore = calculateVolunteerScore(record.volunteerTime)
val regularAdditionalScore = calculateRegularAdditionalScore(record)
val specialAdditionalScore = calculateSpecialAdditionalScore(record)

val regularScore = calculateTotalScore(
subjectScore = baseSubjectScore * REGULAR_SUBJECT_SCORE_MULTIPLIER,
attendanceScore = attendanceScore,
volunteerScore = volunteerScore,
additionalScore = regularAdditionalScore,
maxScore = REGULAR_FIRST_SCREENING_MAX_SCORE,
)
val specialScore = calculateTotalScore(
subjectScore = baseSubjectScore,
attendanceScore = attendanceScore,
volunteerScore = volunteerScore,
additionalScore = specialAdditionalScore,
maxScore = SPECIAL_FIRST_SCREENING_MAX_SCORE,
)

return mapOf(
"REGULAR" to regularScore,
"SOCIAL" to specialScore,
"MEISTER" to specialScore,
)
}

private fun calculateSchoolBaseScore(
record: AcademicRecord,
graduationType: GraduationType?,
): Double {
if (record.subjectGrades.isEmpty()) {
return EMPTY_SCORE
}

val semesterWeights = when (graduationType) {
GraduationType.GRADUATED -> GRADUATED_SEMESTER_WEIGHTS
else -> PROSPECTIVE_GRADUATION_SEMESTER_WEIGHTS
}
val weightedScores = semesterWeights.mapNotNull { (semester, weight) ->
record.subjectGrades[semester]
?.let(::calculateSemesterAveragePoint)
?.let { averagePoint -> (averagePoint / MAX_GRADE_POINT) * weight to weight }
}
if (weightedScores.isEmpty()) {
return EMPTY_SCORE
}

val earnedScore = weightedScores.sumOf { it.first }
val reflectedWeight = weightedScores.sumOf { it.second }
return roundToThirdDecimal(earnedScore / reflectedWeight * SPECIAL_SUBJECT_MAX_SCORE)
}

private fun calculateGedBaseScore(scores: GedScores): Double {
val average = listOf(
scores.koreanScore,
scores.mathScore,
scores.englishScore,
scores.scienceScore,
scores.societyScore,
scores.technologyScore,
scores.historyScore,
).average()

return roundToThirdDecimal(average / PERFECT_GED_SCORE * SPECIAL_SUBJECT_MAX_SCORE)
}

private fun calculateSemesterAveragePoint(subjectGrades: SubjectGrades): Double {
val points = listOf(
subjectGrades.koreanGrade,
subjectGrades.mathGrade,
subjectGrades.englishGrade,
subjectGrades.scienceGrade,
subjectGrades.societyGrade,
subjectGrades.technologyGrade,
subjectGrades.historyGrade,
).filterNot { it == SubjectGrade.X }
.map(::gradeToPoint)

return if (points.isEmpty()) EMPTY_SCORE else points.average()
}

private fun calculateAttendanceScore(record: AcademicRecord): Double {
val convertedAbsences = record.absentCount + floor(
(
record.lateCount +
record.earlyLeaveCount +
record.classAbsenceCount
) / ATTENDANCE_CONVERSION_UNIT.toDouble(),
).toInt()

return (ATTENDANCE_MAX_SCORE - convertedAbsences).coerceAtLeast(EMPTY_SCORE)
}

private fun calculateVolunteerScore(volunteerTime: Int): Double {
return volunteerTime.coerceIn(0, VOLUNTEER_MAX_SCORE.toInt()).toDouble()
}

private fun calculateRegularAdditionalScore(record: AcademicRecord): Double {
return if (record.isDsmAlgorithmAwarded) DSM_ALGORITHM_AWARD_SCORE else EMPTY_SCORE
}

private fun calculateSpecialAdditionalScore(record: AcademicRecord): Double {
var score = EMPTY_SCORE
if (record.isDsmAlgorithmAwarded) {
score += DSM_ALGORITHM_AWARD_SCORE
}
if (record.isProgrammingCertified) {
score += PROGRAMMING_CERTIFICATE_SCORE
}
return score.coerceAtMost(SPECIAL_ADDITIONAL_MAX_SCORE)
}

private fun calculateTotalScore(
subjectScore: Double,
attendanceScore: Double,
volunteerScore: Double,
additionalScore: Double,
maxScore: Double,
): Double {
return roundToThirdDecimal(
(subjectScore + attendanceScore + volunteerScore + additionalScore)
.coerceIn(EMPTY_SCORE, maxScore),
)
}

private fun gradeToPoint(grade: SubjectGrade): Double {
return when (grade) {
SubjectGrade.A -> 5.0
SubjectGrade.B -> 4.0
SubjectGrade.C -> 3.0
SubjectGrade.D -> 2.0
SubjectGrade.E -> 1.0
SubjectGrade.X -> 0.0
}
}

private fun roundToThirdDecimal(score: Double): Double {
return round(score * ROUNDING_SCALE) / ROUNDING_SCALE
}

companion object {
private const val EMPTY_SCORE = 0.0
private const val MAX_GRADE_POINT = 5.0
private const val PERFECT_GED_SCORE = 100.0
private const val SPECIAL_SUBJECT_MAX_SCORE = 80.0
private const val REGULAR_SUBJECT_SCORE_MULTIPLIER = 1.75
private const val ATTENDANCE_MAX_SCORE = 15.0
private const val ATTENDANCE_CONVERSION_UNIT = 3
private const val VOLUNTEER_MAX_SCORE = 15.0
private const val DSM_ALGORITHM_AWARD_SCORE = 3.0
private const val PROGRAMMING_CERTIFICATE_SCORE = 6.0
private const val SPECIAL_ADDITIONAL_MAX_SCORE = 9.0
private const val REGULAR_FIRST_SCREENING_MAX_SCORE = 173.0
private const val SPECIAL_FIRST_SCREENING_MAX_SCORE = 119.0
private const val ROUNDING_SCALE = 1000.0

private val PROSPECTIVE_GRADUATION_SEMESTER_WEIGHTS = linkedMapOf(
SchoolSemester.THIRD_GRADE_FIRST_SEMESTER to 40.0,
SchoolSemester.SECOND_GRADE_SECOND_SEMESTER to 20.0,
SchoolSemester.SECOND_GRADE_FIRST_SEMESTER to 20.0,
)
private val GRADUATED_SEMESTER_WEIGHTS = linkedMapOf(
SchoolSemester.THIRD_GRADE_SECOND_SEMESTER to 20.0,
SchoolSemester.THIRD_GRADE_FIRST_SEMESTER to 20.0,
SchoolSemester.SECOND_GRADE_SECOND_SEMESTER to 20.0,
SchoolSemester.SECOND_GRADE_FIRST_SEMESTER to 20.0,
)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

점수 계산과 저장 동작을 검증하는 테스트를 추가하세요. 이 PR은 점수 정책과 상태 변경을 추가하지만 같은 서브시스템의 테스트 변경이 없습니다. PR 설명의 후속 작업 계획은 테스트가 불필요한 이유가 아닙니다.

  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt#L13-L197: 학력 유형, 필수 학기 누락, 출결 경계값, 가산점 상한, 반올림을 검증하는 결정적 단위 테스트를 추가하세요.
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt#L28-L158: 전형별 점수 저장, 성적 유형 검증, 갱신 시각 갱신을 검증하는 서비스 테스트를 추가하세요.

As per coding guidelines, "**/*.{kt,go}: If production logic is changed in Kotlin or Go files, require corresponding test updates in the same subsystem unless the PR description explicitly justifies why tests are unnecessary". As per path instructions, "Ask for deterministic tests and meaningful assertions, not only happy-path checks."

📍 Affects 2 files
  • systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt#L13-L197 (this comment)
  • systems/application/application-application/src/main/kotlin/hs/kr/entrydsm/application/application/service/EvaluationCommandService.kt#L28-L158
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt`
around lines 13 - 197, Add deterministic unit tests for ScoreCalculator covering
graduation and GED scoring, missing required semesters, attendance boundary
values, additional-score caps, and rounding with meaningful assertions. Add
service tests for EvaluationCommandService covering per-track score persistence,
score-type validation, and updated-timestamp changes; apply the requested test
changes to both affected subsystem files.

Sources: Coding guidelines, Path instructions

Comment on lines +67 to +78
val weightedScores = semesterWeights.mapNotNull { (semester, weight) ->
record.subjectGrades[semester]
?.let(::calculateSemesterAveragePoint)
?.let { averagePoint -> (averagePoint / MAX_GRADE_POINT) * weight to weight }
}
if (weightedScores.isEmpty()) {
return EMPTY_SCORE
}

val earnedScore = weightedScores.sumOf { it.first }
val reflectedWeight = weightedScores.sumOf { it.second }
return roundToThirdDecimal(earnedScore / reflectedWeight * SPECIAL_SUBJECT_MAX_SCORE)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

필수 학기를 모두 반영하기 전에는 점수를 계산하지 마세요.

현재 코드는 없는 학기를 mapNotNull로 제외하고 reflectedWeight도 함께 줄입니다. 따라서 3학년 1학기 성적만 있어도 해당 학기의 높은 성적으로 과목 점수 80점을 받을 수 있습니다.

필수 학기 성적의 존재를 검증하세요. 성적이 불완전하면 계산을 거부하거나 미완료 상태를 반환하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@systems/application/application-domain/src/main/kotlin/hs/kr/entrydsm/application/domain/service/ScoreCalculator.kt`
around lines 67 - 78, Update the score calculation around semesterWeights and
weightedScores in ScoreCalculator so every required semester has a subject grade
before calculating a score. If any required semester is missing, return the
existing incomplete/empty result instead of excluding it and normalizing by
reflectedWeight; only perform the weighted calculation when all required
semesters are present.

@wlyoon921
wlyoon921 force-pushed the feat/24-application-persistence branch from 91fbb11 to 01148a2 Compare August 16, 2026 19:03
@wlyoon921
wlyoon921 force-pushed the feat/24-application-persistence branch from c11b860 to 7469534 Compare August 24, 2026 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant