Conversation
AI 중계 서버는 트랙 code 가운뎃점에 U+00B7(MIDDLE DOT)을, 본 카탈로그는 U+318D(HANGUL LETTER ARAEA)를 써 글자 모양이 같아도 코드 동등 비교가 실패해 가운뎃점 포함 트랙이 매핑에서 조용히 누락됐다. AI 식별자를 카탈로그 정규형으로 접는 anti-corruption 정규화로 매핑을 복구한다. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
✨ PR 유형
✨ Feat (🐛 Fix 포함)
🛠️ 작업 내용
AI 중계 서버가 산출하는 "학과 경계를 넘는 이색 트랙 조합"(cross_college 슬롯) 식별 정보를 추천 응답·이력에 보존·노출합니다.
crossCombination플래그 신설 —RecommendedTrack.is_cross_combination컬럼 영속 +TrackView.crossCombination응답 필드slot_type == "cross_college"일 때만 true, primary·mmr 은 false 로 매핑forceRefresh=false재조립 경로가 영속 엔티티에서 읽으므로 응답 노출과 이력 보존이 한 번에 충족됨slot_type역직렬화 계약 가드🐛 (Fix) 트랙 코드 가운뎃점 유니코드 불일치로 누락되던 트랙 매핑 복구
U+00B7(MIDDLE DOT)을, 본 카탈로그는U+318D(HANGUL LETTER ARAEA)를 써 글자 모양은 같아도findByCode동등 비교가 실패합니다. 가운뎃점 포함 트랙(보조 추천의 단골)이 매핑에서 통째로 탈락해, 위 이색 조합 노출 기능이 화면에서 빈 배열로 보이던 문제.TrackCodeNormalizer로 AI 식별자의 가운뎃점 변형을 카탈로그 정답 형태(U+318D)로 접는 anti-corruption 정규화를 추가. 트랙 조회는 원본 우선 → 실패 시 정규화 재조회 순서라, 이미 매칭되던 트랙은 동작 불변이고 누락되던 트랙만 구제됩니다.U+00B7보조 조합이 정규화 후 매핑되어 누락되지 않는 회귀 가드.📋 추후 진행 상황
crossCombination=true카드에 이색 조합 배지 표시crossCombination=true배지가 실제로 붙으려면 트랙별 역량·기술스택 데이터가 채워져 시너지 점수 > 0 이 되어야 함 (현재 AI 가 보내는 시너지가 0 이라cross_college슬롯 미예약). AI 중계 서버 쪽 데이터 공급 과제로 본 PR 과 독립.continue탈락 지점에 로그 추가 검토 (빈 결과 추적성)📌 리뷰 포인트
service/RecommendationService.java—slot_type == cross_college→ 플래그 매핑. 공유seen중복 제거 + 슬롯 순서 가정(주석 명시)에 의존entity/RecommendedTrack.java—is_cross_combination컬럼nullable=false(ddl-auto update). 기존is_primary와 동일 패턴이라 기존 행은 false 로 백필 — populated dev DB 첫 기동 시 확인 권장dto/RecommendationResponse.java—TrackView응답 계약 변경 (앱 연동 영향)service/RecommendationService.java#findCatalogTrack— "원본 우선 → 정규화 fallback" 순서로 부작용 반경을 "지금까지 누락되던 트랙"으로만 한정하는 설계service/TrackCodeNormalizer.java— 가운뎃점 변형(U+00B7·U+0387·U+2027·U+30FB·U+FF65)을 문자 리터럴이 아닌 정수 코드포인트로 비교 (시각적으로 구분 안 되는 문자라 중복 case·렌더링 혼동 회피)🔗 관련 이슈
Closes #51
📸 스크린샷
(해당 없음 — 백엔드 변경)
✅ 체크리스트
./gradlew spotlessApply로 포매팅 적용./gradlew spotlessCheck통과./gradlew checkstyleMain checkstyleTest통과./gradlew build성공./gradlew test모든 테스트 통과