Q&A
QNA-QA-LIST · /qna/qa-list
기능
9
API 호출
2
가드레일
6
id 가 테스트 이름
구현 단계
12 / 12
개발 스펙
이 화면에서 할 수 있어야 하는 것 (3)
- 자주 묻는 질문(FAQ)을 분류별로 본다.
- 문의 목록과 답변 여부를 본다(3,599건).
- 로그인한 회원이 문의를 작성한다.
비즈니스 규칙 (3)
- 문의 작성은 로그인이 필요하다.근거: qna/qa_proc.php:5 login_check()
- 목록에 답변여부를 표시한다(answer 채워짐 여부).근거: qa_list.php:313
- FAQ 는 cate 로 분류하고 show 플래그로 노출을 제어한다.
API (5)
| 메서드 | 경로 | 권한 | 모듈 · 설명 |
|---|---|---|---|
GET | /api/community/qna/categories | 공개 | 문의 분류(가입문의 · 테솔문의). 화면이 선택지를 하드코딩하지 않게 서버가 준다. domains:community:community-web |
POST | /api/community/qna | 수강생 | 문의 등록. 작성자는 토큰에서 정한다. domains:community:community-web401 UNAUTHORIZED 400 INVALID_CATEGORY 400 INVALID_INPUT |
GET | /api/community/qna | 공개 | 문의 목록(답변여부 포함). domains:community:community-web |
GET | /api/community/faqs | 공개 | FAQ 목록(분류별). domains:community:community-web |
POST | /api/community/qna | 수강생 | 문의 작성. domains:community:community-web401 UNAUTHORIZED |
가드레일 (6) — id 가 곧 테스트 이름이다
| id | 반드시 만족해야 하는 것 | 등급 |
|---|---|---|
qna-writer-from-token | 작성자를 요청 본문으로 지정할 수 없어야 한다. 이름 · 아이디는 토큰에서만 온다. 요청에 name·regid 를 실어 보내도 무시해야 한다 — 아니면 남의 이름으로 문의를 낼 수 있다. | critical |
qna-category-whitelist | 분류는 join · tesol 둘뿐이다. 임의 문자열이 저장되면 안 된다. 원본 _lib/_Env.php:247~249. 목록 필터에 영영 걸리지 않는 글이 된다. | high |
qna-write-validates | 제목 · 내용 · 분류가 비면 등록되지 않아야 한다. 원본 qa_proc.php:29~31 의 fieldCheck 세 줄. | normal |
qna-write-requires-login | 비로그인 상태로 문의 작성 API 를 호출하면 거부돼야 한다. | critical |
qna-answer-status-accurate | 답변이 없는 문의가 답변완료로 표시되면 안 된다. | high |
faq-hidden-not-exposed | show 플래그가 꺼진 FAQ 는 목록에 나오면 안 된다. | high |
구현 계획 (12/12)
- ●QnaCategory · NewQnaPost 정의 — 분류를 열거형으로 잠근다
community-domain - ●WriteQnaUseCase — 로그인 확인 후 토큰 주인으로 등록
community-app - ●createQna — NOT NULL 컬럼을 전부 채우고 regid 는 member 에서 끌어온다
community-infrastructure - ●POST /api/community/qna · GET /qna/categories 구현
community-web - ●/qna/qa-list/write 작성 화면 신설
wvctesol - ●BoardType · BoardSort · BoardPost · BoardRepository
community-domain - ●BoardQueryUseCase — 목록·상세 공용
community-app - ●BoardTable · BoardRepositoryAdapter
community-infrastructure - ●/api/community/qna 구현
community-web - ●/api/community/faqs 구현
community-web - ●/api/community/qna 구현
community-web - ●Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거
wvctesol
서버 사이드 구현 계획 — 자바 객체별 요구사항 (8/8)
| 객체 | 모듈 | 책임 · 지켜야 할 것 |
|---|---|---|
● QnaCategoryenum | community-domain | 문의 분류. 원본 $_array_qna_category 그대로.
|
● NewQnaPostrecord | community-domain | 새 문의. 생성자에서 검증을 끝낸다.
|
● WriteQnaUseCaseservice | community-app | 문의 등록.
|
● BoardTypeenum | community-domain | 게시판 종류.
|
● BoardSortenum | community-domain | 정렬 기준. 열거형이 곧 화이트리스트다.
|
● BoardTablerecord | community-infrastructure | 게시판별 테이블·컬럼 차이를 모아 둔 곳.
|
● BoardRepositoryAdapterclass | community-infrastructure | 다섯 테이블을 하나의 포트로 조회.
|
● BoardQueryUseCaseservice | community-app | 목록·상세 조회.
|
테스트 방법 (7)
| 가드레일 | 종류 | 확인 방법 |
|---|---|---|
qna-writer-from-token | e2e | 요청에 name·regid 를 실어 등록 → 저장된 작성자가 토큰 주인이다 |
qna-category-whitelist | e2e | category 에 임의 문자열 → 400 INVALID_CATEGORY |
qna-write-validates | e2e | 제목 또는 내용을 비우고 등록 → 400 |
qna-write-requires-login | e2e | 비로그인으로 /qna/qa-list/write 접근 → 로그인 화면, API 직접 호출 → 401 |
qna-write-requires-login | e2e | 토큰 없이 문의 작성 POST → 401, qna 행 미생성 |
qna-answer-status-accurate | e2e | answer 가 빈 문의의 목록 표시가 "답변대기" |
faq-hidden-not-exposed | e2e | show='N' FAQ 가 목록 응답에 없음 |
정하지 못한 것 · 확인이 필요한 것
- 원본에 비밀글 기능이 없다. 문의 내용이 목록에서 전부 공개되는데, 개인정보가 섞여 있을 수 있어 정책 확인이 필요하다.
스냅샷

기능 목록 (9)
데이터
- ·API 조회
/api/community/faqs - ·API 조회
/api/community/qna - ·조회 조건
page, keyword, cate
입력
- ·폼
1개 - ·제출 버튼
1개 - ·입력 필드
1개
상태
- ·화면 상태
activeTab, openIndex, faqPage
하드코딩
- ·하드코딩 데이터
tabs - ·하드코딩 데이터
cateTabs
화면 이동
← 이 화면으로 오는 곳
HOME/QNA-QA-LIST-DETAIL/qna/qa-list/[id]QNA-QA-LIST-WRITE/qna/qa-list/write
이 화면에서 가는 곳 →
QNA-QA-LIST-WRITE/qna/qa-list/writeQNA-QA-LIST-DETAIL/qna/qa-list/[id]
연결
API
/api/community/faqs/api/community/qna
소스
src/app/qna/qa-list/page.tsx