공지 상세

NOTICE-DETAIL · /notice/[id]

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

개발 스펙

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

  • 공지 본문과 첨부파일을 본다.
  • 목록으로 돌아간다.

비즈니스 규칙 (2)

  • 상세를 열면 조회수가 1 오른다.
    근거: nt_view.php:17
  • 첨부는 file1 · file2 두 개까지.

API (1)

메서드경로권한모듈 · 설명
GET/api/community/notices/{id}공개
공지 상세. 조회수를 올린다.
domains:community:community-web
404 NOTICE_NOT_FOUND

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

id반드시 만족해야 하는 것등급
board-detail-matches-server-shape
상세 화면이 기대하는 응답 구조와 서버가 주는 구조가 같아야 한다.
화면은 {글, 이전, 다음} 을 기대했는데 서버는 글 하나만 줘서 상세가 전부 클라이언트 예외로 죽은 적이 있다.
critical
unknown-path-is-404
없는 경로는 404 다. 500 이면 장애로 오해한다.
catch-all 예외 핸들러가 NoResourceFound 까지 삼켜 500 을 내던 적이 있다.
high
board-hit-increments-once
상세 조회 시 조회수가 정확히 1 올라야 한다.
normal
board-detail-404
없는 id 로 열면 500 이 아니라 404 여야 한다.
high
board-content-xss-safe
본문 HTML 에 스크립트가 들어 있어도 실행되면 안 된다.
레거시 데이터에 관리자가 넣은 HTML 이 그대로 들어 있다.
critical

구현 계획 (5/5)

  1. BoardType · BoardSort · BoardPost · BoardRepositorycommunity-domain
  2. BoardQueryUseCase — 목록·상세 공용community-app
  3. BoardTable · BoardRepositoryAdaptercommunity-infrastructure
  4. /api/community/notices/{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 올린다.

테스트 방법 (5)

가드레일종류확인 방법
board-detail-matches-server-shapee2e목록에서 첫 글을 눌러 상세까지 이동 → 자바스크립트 오류 0, 오류 화면 없음
unknown-path-is-404integrationGET /api/community/no-such-board → 404
board-hit-increments-oncee2e상세 조회 전후 hit 값 차이가 정확히 1
board-detail-404e2e없는 id 조회 → 404
board-content-xss-safee2e<script>alert(1)</script> 가 든 본문을 열어도 다이얼로그가 뜨지 않음

스냅샷

NOTICE-DETAIL 스냅샷

기능 목록 (1)

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

화면 이동

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

연결

API
  • /api/community/notices/${id}
소스
src/app/notice/[id]/page.tsx