본문 바로가기

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

까먹으면 안되는 것 - 추가

1. 질문들 리스트 조회 기능

구현 항목

  1. 질문들 리스트 DTO:
    • 질문의 기본 정보(예: 질문 ID, 제목, 작성자, 공개 여부)를 포함한 DTO를 생성.
    • 이 DTO는 목록 조회 시 클라이언트로 전달될 데이터 구조.
    public class QuestionListDto {
        private Long questionId;
        private String title;
        private String createdBy;
        private String visibility; // PUBLIC or SECRET
    }
    
  2. 매퍼:
    • Question 엔티티를 QuestionListDto로 변환하는 매퍼 구현.
    • List<Question> → List<QuestionListDto>로 변환하는 메서드 필요.
    @Component
    public class QuestionMapper {
        public QuestionListDto toDto(Question question) {
            return new QuestionListDto(
                question.getId(),
                question.getTitle(),
                question.getCreatedBy(),
                question.getVisibility()
            );
        }
    
        public List<QuestionListDto> toDtoList(List<Question> questions) {
            return questions.stream()
                .map(this::toDto)
                .collect(Collectors.toList());
        }
    }
    
  3. 서비스:
    • 매퍼를 활용하여 데이터베이스에서 가져온 질문 리스트를 DTO로 변환하고 반환.
    @Service
    public class QuestionService {
        private final QuestionRepository questionRepository;
        private final QuestionMapper questionMapper;
    
        public List<QuestionListDto> getQuestions() {
            List<Question> questions = questionRepository.findAll();
            return questionMapper.toDtoList(questions);
        }
    }
    

 

2. 질문 조회 시 답변 포함 여부

검토 사항

  1. 질문을 조회했을 때 질문과 관련된 답변을 함께 반환하는지 확인해야 함.
  2. 질문과 답변의 관계:
    • Question → List<Answer> 관계를 맺고 있다면, 질문 조회 시 답변을 함께 가져올 수 있음.

구현 방식

  • 옵션 1: QuestionResponseDto에 답변을 포함.
    • 질문과 함께 모든 답변 데이터를 제공.
  • 옵션 2: QuestionResponseDto에 답변 ID만 포함.
    • 답변 ID만 포함하고, 답변 상세 정보는 별도 API로 조회.
  •  

3. 질문 등록 시 공개 여부 설정

구현 항목

  1. 공개 여부 설정:
    • 질문 등록 시 visibility 필드를 받아, PUBLIC 또는 SECRET 설정.
    public class QuestionPostDto {
        private String title;
        private String content;
        private String visibility; // "PUBLIC" or "SECRET"
    }
    
  2. 등록 시 검증:
    • 질문 작성자가 본인의 질문을 SECRET으로 설정했을 경우:
      • 관리자만 해당 질문을 볼 수 있도록 권한 확인.
    • 서비스 로직:
      @Service
      public class QuestionService {
          public void createQuestion(QuestionPostDto dto, Member member) {
              if ("SECRET".equals(dto.getVisibility()) && !member.isAdmin()) {
                  throw new AccessDeniedException("SECRET 질문은 관리자만 등록할 수 있습니다.");
              }
      
              Question question = new Question(
                  dto.getTitle(),
                  dto.getContent(),
                  member,
                  dto.getVisibility()
              );
              questionRepository.save(question);
          }
      }
      

4. 남은 추가 구현 사항

  1. 답변 삭제 처리:
    • 질문이 삭제되면 해당 질문과 연관된 답변도 함께 삭제되거나 비활성화.
  2. 질문 검색 기능:
    • 제목 또는 작성자 기준으로 질문을 검색.
    • 공개 여부와 상태 값(삭제/등록/비활성화)에 따라 검색 조건 필터링.
  3. 질문 목록의 페이지네이션:
    • 질문이 많아질 경우, 페이지네이션을 구현하여 클라이언트 성능 최적화.
  4. 테스트 케이스 작성:
    • 질문 등록, 조회, 수정, 삭제에 대한 단위 테스트와 통합 테스트.