Skip to content

feat: 내 템플릿 상세 조회 API (#49) - #50

Merged
oTAETAEo merged 6 commits into
developfrom
feat/49-template-detail
Nov 2, 2026
Merged

oTAETAEo merged 6 commits into
developfrom
feat/49-template-detail

Conversation

@oTAETAEo

@oTAETAEo oTAETAEo commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

관련 이슈

작업 내용

명세 9번 GET /api/v1/templates/{templateId}를 구현했습니다. 본인 소유 조회와 404 구분을 처음 만드는 작업이라 11번 수정, 14번 사용 기록이 재사용할 수 있게 나눴습니다.

커밋별로 보기

  1. 본인 소유 조회와 404 에러 코드: TemplateRepository.findByIdAndUserId, TEMPLATE404_1, TEMPLATE404_2
  2. 서비스: TemplateQueryService.getTemplate, getActiveTemplate, TemplateDetailQuery, TemplateDetailResult
  3. API: GET /{templateId}, TemplateDetailResponse, TEMPLATE200_2
  4. 리뷰 반영: getActiveTemplate을 패키지 범위로 제한

404 구분

경우 코드 문구
없는 템플릿 TEMPLATE404_1 템플릿을 찾을 수 없어요.
다른 회원 템플릿 (휴지통 포함) TEMPLATE404_1 템플릿을 찾을 수 없어요.
내 템플릿인데 휴지통에 있음 TEMPLATE404_2 이미 삭제된 템플릿이에요.

본인 소유 조건으로 한 번 찾은 뒤 isInTrash()로 나눕니다. 다른 회원의 휴지통 템플릿은 조회되지 않으므로 존재 여부가 드러나지 않습니다.

명세와 달라진 점

  • 명세 9·11·14번 에러표의 TEMPLATE404_1 설명에 "휴지통에 있는 템플릿"이 남아 있어 같은 표의 TEMPLATE404_2, 비고와 어긋납니다. 비고대로 내 휴지통 템플릿은 TEMPLATE404_2로 구현했습니다. 이 PR에서 docs/는 고치지 않았습니다

테스트

  • TemplateDetailControllerTest (테스트컨테이너 MySQL)
    • 성공: 필드 순서, +09:00, no-store, 영속성 컨텍스트를 비운 뒤 다시 읽은 본문
    • 변수 목록: 첫 등장 순, 중복 제거
    • 사용 이력이 없으면 lastUsedAt은 null
    • 없는 ID 404_1, 다른 회원 템플릿 404_1, 내 휴지통 404_2, 다른 회원의 휴지통 404_1
    • 토큰 없음 COMMON401_1
    • 숫자가 아니거나 Long 범위를 넘는 templateId는 COMMON400_1 (현재 전역 처리 결과를 고정)
  • TemplateQueryServiceTest (모키토): 성공, 404_1, 404_2 세 분기
  • TemplateRepositoryTest: 본인 소유 조회가 휴지통은 찾고 다른 회원 것은 찾지 않음
  • TemplateErrorCodeTest: 404_1, 404_2 코드·문구
  • 전체 557개 통과

확인 체크리스트

  • ./gradlew build 통과
  • 테스트 포함
  • 변경 400줄 안팎 → 413줄 (본 코드 124줄, 테스트 289줄)
  • 병합된 마이그레이션 수정 안 함
  • 비밀 값·개인정보 없음
  • global 공통 코드 변경 없음

리뷰어에게

  1. getActiveTemplate이 엔티티를 돌려줍니다: 11·14번의 TemplateCommandService가 같은 404 구분을 쓰게 하려고 패키지 범위로 뒀습니다. service 패키지 밖에서는 컴파일되지 않습니다. 기존 ArchUnit 규칙은 반환값을 버리거나 TemplateDetailResult.from(...)에 바로 넘기는 호출을 잡지 못해, 규칙 추가 대신 공개 범위를 닫았습니다 (리뷰 반영)
  2. 12번 삭제는 이 메서드를 쓸 수 없습니다: 12번 에러표에는 TEMPLATE404_2가 없어 명세대로면 휴지통 템플릿이 404_1입니다. 9·11·14번 표를 고칠 때 12번을 어떻게 둘지 같이 정해야 합니다
  3. 응답 객체를 공용화하지 않았습니다: TemplateCreateResponse와 필드가 같지만, 화면마다 바뀌는 방향이 달라 각자 둔다는 기존 방침을 따랐습니다

🤖 Generated with Claude Code

@oTAETAEo oTAETAEo added feature 기능 개발 template 내 템플릿·휴지통 labels Oct 30, 2026
@oTAETAEo oTAETAEo self-assigned this Oct 30, 2026
@oTAETAEo
oTAETAEo marked this pull request as ready for review October 30, 2026 16:05
chjpooh2002
chjpooh2002 previously approved these changes Nov 2, 2026

@chjpooh2002 chjpooh2002 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

리뷰 남긴 사항 하나만 확인 부탁드립니다! 수고하셨습니다~

* 휴지통에 없는 본인 템플릿. 수정·사용 기록도 같은 404 구분을 쓴다.
* 엔티티를 돌려주므로 template 도메인 안에서만 부른다 (ArchUnit이 다른 도메인의 사용을 막는다).
*/
public Template getActiveTemplate(Long userId, Long templateId) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

엔티티를 돌려주는 공개 메서드가 조회 서비스에 생기면서 쓰기 서비스가 조회 서비스를 의존하게 됐는데요(#53). 지금은 문제없지만, 나중에 조회 서비스가 다른 도메인 서비스를 부르기 시작하면 순환 참조 위험이 생길 거 같습니다!
지금 구조로 가되, 이 메서드는 “template 도메인 내부 전용”이라는 걸 ArchUnit 규칙으로도 묶어 두면 좋겠습니다~~

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@chjpooh2002 해당 부분 공개 범위가 public 인줄은 몰랐네여 수정 해 두겠습니다 👍

해당 부분은 다시 보니까 규칙을 추가하는것 보다 default 공개 범위로 두는것이 나을것 같은데 어떻게 생각하세여 ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

그게 더 나을 거 같네요! 규칙 테스트보다 컴파일 단계에서 막히니까요. 바꾸실 때 메서드 위 주석의 “ArchUnit이 다른 도메인의 사용을 막는다” 부분도 "패키지 범위라 service 패키지 밖에서는 부를 수 없다"로 같이 고쳐 주세요~!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

확인했습니당 ~

@oTAETAEo
oTAETAEo merged commit a861867 into develop Nov 2, 2026
1 check passed
@oTAETAEo
oTAETAEo deleted the feat/49-template-detail branch November 2, 2026 09:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 기능 개발 template 내 템플릿·휴지통

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 내 템플릿 상세 조회 API

2 participants