본문 바로가기

spring/[실습] 솔로프로젝트

2024-07-18 일의 솔로 프로젝트 중간 점검 설계

<질문 게시판> 

 

  • 질문 
    • 질문 엔티티
      • 질문ID Long
      • 질문 클래스 질문 (일대일)
      • 멤버클래스 멤버 (다대일) > 질문(다) : 멤버 (일)
      • 질문등록 날짜 > Auditble(추상 클래스) 로 보냄 
      • 수정 날짜 > Auditble(추상 클래스) 로 보냄    
      • 질문 제목 String @NotBlank
      • 질문 내용 (DB에서는 TEXT) @NotBlank
      • 좋아요 > 리스트 (리스트 사이즈로 좋아요수)
      • 조회수  > 리스트(리스트로 조회수)
      • 공개여부 Enum 
        • PUBLIC - 공개글 상태 
        • SECRET - 비밀글 상태
      • 질문 상태 (초기 상태 값은 QUESTION_REGISTERED) > ENUM 
        • QUESTION_REGISTERED- 질문 등록 상태 
        • QUESTION_ANSWERED - 답변 완료 상태
        • QUESTION_DELETED - 질문 삭제 상태
        • QUESTION_DEACTIVED - 질문 비활성화 상태: 회원 탈퇴 시, 질문 비활성화 상태

                
             
    • 질문 디티오
      • 등록 디티오 QuestionPostDTO
        • 작성자(멤버 아이디)
        • 제목 (공백이 아니어야함)
        • 내용 (공백이 아니어야함)
      •  수정 디티오  QuestionPatchDTO
        • 질문ID
        • 제목(공백이 아니어야함)
        • 내용(공백이 아니어야함)
        • 질문상태(답변여부나삭제비활성화)
        • 공개여부 
      • 질문 단건 리스폰스 디티오 QuestionResponseDTO
        • 질문Id
        • 멤버아이디
        • 제목
        • 내용
        • 등록날짜
        • 수정 날짜
        • 질문 상태(예) 답변됐는지)
        • 공개여부
        • 좋아요수
        • 조회수
      • 질문들 리스트 - List<질문 단건 리스폰스 디티오>
      • AnswerResponseDTO 답변 보내는 디티오
      • AnswerDTO //사용자로부터 답변 받는 디티오 
      • QnAResponseDTO //질문과 답변을 함께 반환하는 용도
            //디티오는 엔티티를 몰라야함.
            //빈 공감이나 마찬가지 > 매퍼로 연결.

  • QnA 컨트롤러
    • QnA서비스
    • QnA매퍼
    • 생성자
    • postQuestion > 디티오 받으면 매퍼 써서 엔티티로 바꾼다음에 서비스 써서 등록
    • patchQuestion >  
    • getQuestion > 
    • getQnAList > 
    • deleteQuestion> 질문이 사라지면 답변도 사라짐
    • deleteAnswer > 
  • Question 매퍼
    • questionPostDTOToQuestion
    • questionPatchDTOToQuestion
    • questionToQuestionResponseDTO
      • 빌더 씀 > 왜냐면 좋아요수랑 조회수를 int로 받아오고 싶어서 ( likes > 라이크 카운트 = likes.size로 몇개인지 매핑)
    • questionsToResponseDTOs
  • QnA 서비스
    • 질문 등록 : 파라미터로 받은 질문의 멤버를 검증 > 질문 레포지토리에 담음 

질문은 회원(고객)만 등록할 수 있다. > role : 회원인지 관리자인지  
- 질문 등록시 등록 날짜가 생성 되어야 한다.
- 질문은 질문의 상태 값이 필요하다
ㄴ QUESTION_REGISTERED- 질문 등록 상태 
ㄴ QUESTION_ANSWERED - 답변 완료 상태 
ㄴ QUESTION_DELETED - 질문 삭제 상태
ㄴ QUESTION_DEACTIVED - 질문 비활성화 상태: 회원 탈퇴 시, 질문 비활성화 상태
- 질문 등록 시, 초기 상태 값은 QUESTION_REGISTERED 이어야 한다.
- 질문 제목과 내용은 필수입력 사항이다.
- 질문은 비밀글과 공개글 둘 중에 하나로 설정되어야 한다.
ㄴ PUBLIC - 공개글 상태 
ㄴ SECRET - 비밀글 상태


질문 조회
 1건의 특정 질문은 회원(고객)과 관리자 모두 조회할 수 있다. 
- 비밀글 상태인 질문은 질문을 등록한 회원(고객)과 관리자만 조회할 수 있다. (ㅇ)
- 1건의 질문 조회 시, 해당 질문에 대한 답변이 존재한다면 답변도 함께 조회되어야 한다.(ㅇ)
- 이미 삭제 상태인 질문은 조회할 수 없다.(ㅇ) 

> 조회할때 검증해야할 것 :

 

0. 일치하는 질문이 있는지

isExistQuestion

if (isPublic(퀘스쳔))

 

1. 공개/비공개여부 {

>공개면

> 비공개면 질문의 겟멤버와 조회하는 멤버와 같은 멤버인지

> 일치하면 

     >답변있는지 

           > 없으면 질문만 리턴

> 불일치하면 익셉션 날리거나 안된다고 메세지 입력으로 리턴 }

1. 질문상태가 QUESTION_REGISTERED이거나 QUESTION_ANSWERED인지

  > 아니라면 불가능한 질문이라고 예외메세지 날림

2. 답변이 있는지

> 있으면 답변도 같이 리턴

> 없으면 질문만 리턴

 

불리언 isPublic > 퀘스쳔 들어오면 상태 판단  > t/f반환 

isVerifiedMember

isExistAnswer

isExistQuestion

 

질문 삭제
1건의 질문은 회원(고객)만 삭제할 수 있다.

- 1건의 질문 삭제는 질문을 등록한 회원만 가능하다.
- 질문 삭제 시, 테이블에서 row 자체가 삭제되는 것이 아니라 질문 상태 값이(QUESTION_DELETE)으로 변경되어야 한다.
- 이미 삭제 상태인 질문은 삭제할 수 없다.
> 조회할때 검증해야할 것 :

1.질문이 존재하는지

 

2.질문의 상태 여부 

    > 지운상태면 지울 수 없다고 예외메세지 출력

    >질문 QUESTION_REGISTERED || QUESTION_ANSWERED 일때 > QUESTION_DELETE로 변경

    > 아니면 불가능한 질문이라고 예외메세지 날림

 
 
질문들(목록) 조회
- 여러 건의 질문 목록은 회원(고객)과 관리자 모두 조회할 수 있다.
- 삭제 상태가 아닌 질문만 조회할 수 있다.
- 여러 건의 질문 목록에서 각각의 질문에 답변이 존재한다면 답변도 함께 조회할 수 있어야 한다.
- 여러 건의 질문 목록은 페이지네이션 처리가 되어 일정 건수 만큼의 데이터만 조회할 수 있어야 한다.
- 여러 건의 질문 목록은 아래의 조건으로 정렬해서 조회할 수 있어야 한다.
ㄴ 최신글 순으로 
ㄴ 오래된 글 순으로
ㄴ 좋아요가 많은 순으로(좋아요 구현 이후 적용)
ㄴ 좋아요가 적은 순으로(좋아요 구현 이후 적용)
ㄴ 조회수가 많은 순으로(조회수 구현 이후 적용)
ㄴ 조회수가 적은 순으로(조회수 구현 이후 적용)

 

 

대략 데이터테이블을 이렇게 짜봤다.

https://www.erdcloud.com/d/RQ65KZaKiZvunGqNn

 

1. 질문과 답변은 어차피 맵핑됨 
> 질문이 사라지면 답변도 사라짐
> 질문의 상태 여부에 따라 답변에 접근할 수 있는지도 결정됨
>but, 질문에는 답변이 없을 수도 있음 -> 그러면 기본 값으로 "Answer is not exist"로 넣어줘야 하나

>>그렇다면 QnA로 따로 맵을 만들어 구현해야하는가

2. 컨트롤러와 서비스도 따로 구현해야할까? 
    >답변은 질문의 옵션같은 느낌 아닌가?
    

'spring > [실습] 솔로프로젝트' 카테고리의 다른 글

2024-07-30  (0) 2024.07.31
2024-07-30  (0) 2024.07.30
까먹으면 안되는 것 - 추가  (0) 2024.07.18
URI 메서드 어떻게 쓰는데  (0) 2024.07.18
2일차  (0) 2024.07.12