Skip to content

T-09 기술스택 - #63

Open
ff1451 wants to merge 1 commit into
feat/t08-study-pointsfrom
feat/t09-tech-stacks
Open

T-09 기술스택#63
ff1451 wants to merge 1 commit into
feat/t08-study-pointsfrom
feat/t09-tech-stacks

Conversation

@ff1451

@ff1451 ff1451 commented Aug 19, 2026

Copy link
Copy Markdown

Refs #21
Base: feat/t08-study-points (#62)

P1(트랙)의 마지막 티켓이다.

변경

  • TechStack — 마스터. 여러 트랙 페이지가 공유한다(React, Java 등 재사용 — 시안에도 여러 트랙이 같은 스택 아이콘을 쓴다).
  • TrackPageTechStack(track_page_id, tech_stack_id) 복합키 + display_order. @EmbeddedId + @MapsId로 매핑했고, 조회는 join fetch로 N+1을 피했다.
  • GET/POST /v1/admin/tech-stacks — 마스터 목록/생성(이름 중복 409).
  • PUT /v1/admin/track-pages/{id}/tech-stacks — 전체 교체. 존재하지 않는 techStackId가 섞여 있으면 삭제를 실행하기 전에 검증해서 404를 던지고 기존 부착을 그대로 둔다 — study-points(T-08)와 달리 이 엔드포인트는 참조 무결성 검증이 필요해서, "먼저 지우고 나중에 실패"가 아니라 "먼저 검증하고 지운다" 순서로 짰다.
  • 공개 응답(TrackDetailResponse)에 techStacks 추가. 관리자 응답(TechStackResponse, id 포함)과 공개 응답(TechStackSummaryResponse, id 없음)을 분리했다 — 공개 API가 내부 PK를 노출할 이유가 없다.

테스트

TechStackIntegrationTest(신규):

  • 마스터 생성 + 이름 중복 409
  • 전체 교체가 이전 부착을 완전히 대체(누적 아님)
  • 존재하지 않는 id를 포함해 보내면 404이고 기존 부착이 그대로 유지됨(부분 적용 없음)
  • 공개 응답에 techStacks가 순서대로 포함

./gradlew test를 3회 연속 돌려 전체 통과(59개, 실패 0) 확인.


이걸로 P1(트랙) 완료 — T-06T-09 4개 티켓, PR #60#63. 다음은 P2(커리큘럼, T-10~T-13)로 넘어간다.

기술스택 마스터 CRUD + 트랙 페이지 부착(전체 교체) + 공개 응답 결합.

- TechStack — 마스터, 여러 트랙 페이지가 공유(React, Java 등 재사용)
- TrackPageTechStack — (track_page_id, tech_stack_id) 복합키 + display_order.
  @EmbeddedId + @mapsid로 매핑, 조인 fetch 쿼리로 N+1 방지
- GET/POST /v1/admin/tech-stacks — 마스터 목록/생성(이름 중복 409)
- PUT /v1/admin/track-pages/{id}/tech-stacks — 전체 교체. 존재하지 않는
  techStackId가 섞여 있으면 삭제를 실행하기 전에 검증해서 404를 던지고
  기존 부착을 그대로 둔다(부분 적용 없음)
- 공개 응답(TrackDetailResponse)에 techStacks 추가 — id 없는 요약 DTO
  (TechStackSummaryResponse)를 따로 둬서 관리자 응답과 구분했다

테스트: TechStackIntegrationTest(신규) —
- 마스터 생성 + 이름 중복 409
- 전체 교체가 이전 부착을 완전히 대체
- 존재하지 않는 id 포함 시 404이고 기존 부착 유지(검증 우선, delete 전)
- 공개 응답에 techStacks가 순서대로 포함

./gradlew test 3회 연속 전체 통과(59개, 실패 0).

Refs #21
@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: bc94a150-604d-4692-a08b-61a563db9810

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

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.

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