Q&A

QNA-QA-LIST · /qna/qa-list

실제 화면 열기 ↗
기능
9
API 호출
2
가드레일
6
id 가 테스트 이름
구현 단계
12 / 12
완료커뮤니티wvctesol-api :8080서버 컴포넌트72

개발 스펙

이 화면에서 할 수 있어야 하는 것 (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-web
401 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-web
401 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)

  1. QnaCategory · NewQnaPost 정의 — 분류를 열거형으로 잠근다community-domain
  2. WriteQnaUseCase — 로그인 확인 후 토큰 주인으로 등록community-app
  3. createQna — NOT NULL 컬럼을 전부 채우고 regid 는 member 에서 끌어온다community-infrastructure
  4. POST /api/community/qna · GET /qna/categories 구현community-web
  5. /qna/qa-list/write 작성 화면 신설wvctesol
  6. BoardType · BoardSort · BoardPost · BoardRepositorycommunity-domain
  7. BoardQueryUseCase — 목록·상세 공용community-app
  8. BoardTable · BoardRepositoryAdaptercommunity-infrastructure
  9. /api/community/qna 구현community-web
  10. /api/community/faqs 구현community-web
  11. /api/community/qna 구현community-web
  12. Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거wvctesol

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

객체모듈책임 · 지켜야 할 것
QnaCategory
enum
community-domain
문의 분류. 원본 $_array_qna_category 그대로.
  • JOIN(가입문의) · TESOL(테솔문의) 둘뿐이다. 실데이터도 이 둘이다.
  • from() 이 알 수 없는 값에 DomainException 을 던진다 — 임의 문자열이 DB 로 내려가지 않는다.
NewQnaPost
record
community-domain
새 문의. 생성자에서 검증을 끝낸다.
  • 제목 · 내용 · 분류가 비면 만들어지지 않는다(원본 fieldCheck 3줄).
  • STATUS_APPLY · REGTYPE_MEMBER 를 상수로 둔다 — 회원이 낸 미답변 문의라는 뜻이다.
  • 작성자 이름은 받되 아이디는 받지 않는다. regid 는 저장 시 member 에서 끌어온다.
WriteQnaUseCase
service
community-app
문의 등록.
  • Actor 가 null 이면 UnauthorizedException — 원본 login_check() 에 해당한다.
  • 작성자를 Command 로 받지 않는다. actor.id · actor.name 만 쓴다.
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 올린다.

테스트 방법 (7)

가드레일종류확인 방법
qna-writer-from-tokene2e요청에 name·regid 를 실어 등록 → 저장된 작성자가 토큰 주인이다
qna-category-whiteliste2ecategory 에 임의 문자열 → 400 INVALID_CATEGORY
qna-write-validatese2e제목 또는 내용을 비우고 등록 → 400
qna-write-requires-logine2e비로그인으로 /qna/qa-list/write 접근 → 로그인 화면, API 직접 호출 → 401
qna-write-requires-logine2e토큰 없이 문의 작성 POST → 401, qna 행 미생성
qna-answer-status-accuratee2eanswer 가 빈 문의의 목록 표시가 "답변대기"
faq-hidden-not-exposede2eshow='N' FAQ 가 목록 응답에 없음

정하지 못한 것 · 확인이 필요한 것

  • 원본에 비밀글 기능이 없다. 문의 내용이 목록에서 전부 공개되는데, 개인정보가 섞여 있을 수 있어 정책 확인이 필요하다.

스냅샷

QNA-QA-LIST 스냅샷

기능 목록 (9)

데이터
  • ·API 조회/api/community/faqs
  • ·API 조회/api/community/qna
  • ·조회 조건page, keyword, cate
입력
  • ·1개
  • ·제출 버튼1개
  • ·입력 필드1개
상태
  • ·화면 상태activeTab, openIndex, faqPage
하드코딩
  • ·하드코딩 데이터tabs
  • ·하드코딩 데이터cateTabs

화면 이동

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

연결

API
  • /api/community/faqs
  • /api/community/qna
소스
src/app/qna/qa-list/page.tsx