Q&A 상세

QNA-QA-LIST-DETAIL · /qna/qa-list/[id]

기능
1
API 호출
1
가드레일
1
id 가 테스트 이름
구현 단계
5 / 5
완료커뮤니티wvctesol-api :8080서버 컴포넌트동적 라우트67

개발 스펙

이 화면에서 할 수 있어야 하는 것 (1)

  • 문의 본문과 관리자 답변을 본다.

비즈니스 규칙 (1)

  • 답변은 별도 글이 아니라 같은 행의 answer 컬럼이다.

API (1)

메서드경로권한모듈 · 설명
GET/api/community/qna/{id}공개
문의 상세와 답변.
domains:community:community-web
404 QNA_NOT_FOUND

가드레일 (1) — id 가 곧 테스트 이름이다

id반드시 만족해야 하는 것등급
qna-detail-404
없는 id 는 404 여야 한다.
high

구현 계획 (5/5)

  1. BoardType · BoardSort · BoardPost · BoardRepositorycommunity-domain
  2. BoardQueryUseCase — 목록·상세 공용community-app
  3. BoardTable · BoardRepositoryAdaptercommunity-infrastructure
  4. /api/community/qna/{id} 구현community-web
  5. Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거wvctesol

서버 사이드 구현 계획 — 자바 객체별 요구사항 (5/5)

객체모듈책임 · 지켜야 할 것
BoardType
enum
community-domain
게시판 종류.
  • 경로로 받은 문자열은 이 열거형으로만 해석한다 — 임의 값이 테이블 이름이 되지 않는다.
  • 알 수 없는 값은 400 INVALID_BOARD.
BoardSort
enum
community-domain
정렬 기준. 열거형이 곧 화이트리스트다.
  • 원본은 정렬 문자열을 order by 에 그대로 붙였다. 여기서는 문자열이 SQL 로 흘러갈 길 자체를 없앤다.
  • 알 수 없는 값은 오류가 아니라 조용히 기본 정렬로 되돌린다.
BoardTable
record
community-infrastructure
게시판별 테이블·컬럼 차이를 모아 둔 곳.
  • 노출 플래그 이름이 제각각이고 값도 대소문자가 섞여 있다(pass_note 는 Y/N, faq 는 y/n) — upper() 로 맞춘다.
  • 공지만 고정 컬럼이, 수기·후기만 이미지가, Q&A 만 답변이 있다.
  • SQL 에 들어가는 식별자는 이 레코드가 정한 값뿐이다.
BoardRepositoryAdapter
class
community-infrastructure
다섯 테이블을 하나의 포트로 조회.
  • 구조가 거의 같아 엔티티를 다섯 벌 만들지 않고 네이티브 쿼리로 묶었다.
  • 검색어는 반드시 바인딩 파라미터로 넘긴다. 문자열 이어붙이기 금지.
  • 숨긴 글은 목록과 상세 양쪽에서 제외한다 — 상세만 빠뜨리면 id 로 뚫린다.
BoardQueryUseCase
service
community-app
목록·상세 조회.
  • PageRequest 가 page 0·음수·과대를 다듬는다. 오류를 내지 않는다.
  • 상세는 조회수를 정확히 1 올린다.

테스트 방법 (1)

가드레일종류확인 방법
qna-detail-404e2e없는 문의 id → 404

스냅샷

QNA-QA-LIST-DETAIL 스냅샷

기능 목록 (1)

데이터
  • ·API 조회/api/community/qna/${id}

화면 이동

← 이 화면으로 오는 곳
이 화면에서 가는 곳 →

연결

API
  • /api/community/qna/${id}
소스
src/app/qna/qa-list/[id]/page.tsx