공지사항
NOTICE · /notice
기능
5
API 호출
1
가드레일
4
id 가 테스트 이름
구현 단계
5 / 5
개발 스펙
이 화면에서 할 수 있어야 하는 것 (4)
- 공지 목록을 페이지 단위로 본다(588건).
- 제목 · 내용 · 작성자로 검색한다.
- 최신순 / 조회순으로 정렬을 바꾼다.
- 상단 고정 공지가 먼저 보인다.
비즈니스 규칙 (4)
- 정렬은 항상 고정공지(notice desc) 가 우선이고, 그 다음이 선택한 정렬이다.근거: nt_list.php:33 — order by nt_notice desc, {정렬} desc
- 정렬 파라미터는 화이트리스트로 제한한다. 허용값 외에는 기본값으로 되돌린다.근거: nt_list.php:9
- 검색은 제목 · 내용 · 작성자를 함께 본다(LIKE).근거: nt_list.php:19
- 작성자명은 admin 테이블에서 조인해 가져온다.근거: nt_list.php:33 서브쿼리
API (1)
| 메서드 | 경로 | 권한 | 모듈 · 설명 |
|---|---|---|---|
GET | /api/community/notices | 공개 | 공지 목록. domains:community:community-web요청: ?page=1&size=15&keyword=&sort=latest|hits 응답: { items: [{ id, title, writer, hit, pinned, regdate }], total, page, size } |
가드레일 (4) — id 가 곧 테스트 이름이다
| id | 반드시 만족해야 하는 것 | 등급 |
|---|---|---|
board-sort-whitelist | 정렬 파라미터에 임의 컬럼명을 넣어도 SQL 에 그대로 들어가면 안 된다. 원본은 문자열을 그대로 order by 에 붙였다. 화이트리스트가 유일한 방어였다. | critical |
board-search-injection-safe | 검색어에 따옴표·SQL 예약어를 넣어도 정상 동작하고 오류가 나면 안 된다. | critical |
notice-pinned-first | 고정 공지는 정렬 방식과 무관하게 항상 목록 맨 위에 있어야 한다. | high |
board-paging-bounds | page=0, page=-1, 범위를 넘는 page 에도 오류 없이 빈 목록이나 첫 페이지를 돌려줘야 한다. | high |
구현 계획 (5/5)
- ●BoardType · BoardSort · BoardPost · BoardRepository
community-domain - ●BoardQueryUseCase — 목록·상세 공용
community-app - ●BoardTable · BoardRepositoryAdapter
community-infrastructure - ●/api/community/notices 구현
community-web - ●Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거
wvctesol
서버 사이드 구현 계획 — 자바 객체별 요구사항 (5/5)
| 객체 | 모듈 | 책임 · 지켜야 할 것 |
|---|---|---|
● BoardTypeenum | community-domain | 게시판 종류.
|
● BoardSortenum | community-domain | 정렬 기준. 열거형이 곧 화이트리스트다.
|
● BoardTablerecord | community-infrastructure | 게시판별 테이블·컬럼 차이를 모아 둔 곳.
|
● BoardRepositoryAdapterclass | community-infrastructure | 다섯 테이블을 하나의 포트로 조회.
|
● BoardQueryUseCaseservice | community-app | 목록·상세 조회.
|
테스트 방법 (4)
| 가드레일 | 종류 | 확인 방법 |
|---|---|---|
board-sort-whitelist | e2e | sort=nt_title;drop 같은 값으로 목록 요청 → 200 이고 기본 정렬로 동작 |
board-search-injection-safe | e2e | keyword=' OR 1=1 -- 로 검색 → 200 이고 결과가 전체가 되지 않음 |
notice-pinned-first | e2e | 조회순 정렬에서도 고정 공지가 첫 행 |
board-paging-bounds | e2e | page=0 · page=-1 · page=99999 각각 200 응답 |
스냅샷

기능 목록 (5)
데이터
- ·API 조회
/api/community/notices - ·조회 조건
page, keyword, orderby
입력
- ·폼
1개 - ·제출 버튼
1개 - ·입력 필드
1개
화면 이동
← 이 화면으로 오는 곳
HOME/NOTICE-DETAIL/notice/[id]
이 화면에서 가는 곳 →
NOTICE-DETAIL/notice/[id]
연결
API
/api/community/notices
소스
src/app/notice/page.tsx