Skip to content

Conversation

@dlsrks1021
Copy link
Collaborator

@dlsrks1021 dlsrks1021 commented Aug 31, 2025

🛰️ Issue Number

🪐 작업 내용

TextQuestion을 ContentQuestion으로 변경

  • 작업 목적
    텍스트 문제와 이미지 문제의 공통점은 문제(content)와 정답(answer)으로 이루어져 있다는 점입니다.
    텍스트 문제의 content는 "1+1은 무엇인가?"와 같은 VARCHAR 값이 들어갈 것이고,
    이미지 문제의 content는 "images/question/UUID.png"와 같은 VARCHAR 값이 들어갈 것입니다.
    따라서, 기존 content를 담고 있던 TextQuestion을 ContentQuestion으로 변경해 텍스트 문제와 이미지 문제 모두 사용할 수 있도록 했습니다.

  • 변경 내용

    • Flyway: V2 sql 파일을 생성했습니다.
    • entity, dao: 기존 TextQuestion을 삭제하고 ContentQuestion으로 대체했습니다.
    • data.sql: text_question을 content_question으로 변경했습니다.

텍스트와 이미지 문제에 대한 API 분리

  • 작업 목적
    이미지 퀴즈는 각 문제에 대한 content를 MultipartFile로 요청받아야 하며, API의 역할 또한 명백하게 분리됩니다.
    따라서 텍스트 퀴즈와 이미지 퀴즈 생성에 대한 API를 분리했으며, 이는 /quizzes/text/quizzes/image 각각의 엔드포인트를 갖도록 설계했습니다.
    업데이트에 대한 API도 위와 같은 이유로 /quizzes/text/{quizId}/quizzes/image/{quizId} 두 엔드포인트로 분리했습니다.

  • 변경 내용

    • api: 퀴즈 생성, 업데이트에 대한 API를 수정/추가했습니다.
    • service: 텍스트 퀴즈 및 이미지 퀴즈에 대한 저장 시 ContentQuestion의 공통 entity로 저장될 수 있도록 설정했습니다.
    • dto: 텍스트 퀴즈와 이미지 퀴즈에 대한 생성/수정 dto를 분리했습니다.

문제 삭제 API 변경

  • 작업 목적
    기존 문제 삭제는 삭제가 필요한 각 문제마다 요청을 보내 n개의 문제 삭제가 필요할 경우 n개의 요청이 발생하는 형태였습니다.
    이를 개선하기 위해, 삭제가 필요한 문제 id들을 담아 하나의 요청으로 처리할 수 있도록 QuizController에 /quizzes/{quizId}/questions API를 추가했으며, 기존 QuestionController의 API는 삭제했습니다.

  • 변경 내용

    • api: 기존 QuestionController의 단일 questionId 삭제 요청에 대해 QuizController에서 questionId 리스트를 받아 처리하도록 수정했습니다.

GAME_START 메시지 수정

  • 작업 목적
    텍스트 퀴즈와 이미지 퀴즈는 ContentQuestion 엔티티를 공유 사용합니다.
    하지만, 프론트엔드에서는 이를 구분해 렌더링해야 하기 때문에 GAME_START 메시지에 quizType 항목을 추가했습니다.

  • 변경 내용

    • dto: GameStartResponse에 quizType을 추가했습니다.
    • service: GAME_START에 대한 브로드캐스트 및 유니캐스트 시 quizType 파라미터를 전달하도록 했습니다.

기타 수정 사항

  • 변경 내용
    • FileManager 추가: 파일 저장/삭제에 대한 역할을 FileManager 클래스로 분리했습니다.
    • GlobalExceptionHandler 수정: e.getMessage()를 통해 얻을 수 있는 정보가 한정적인 문제로, stack trace 확인이 가능하도록 수정했습니다.
    • application.yml 수정:
      • max-file-size: 파일당 최대 크기를 2MB로 설정했습니다. (프론트에서 각 파일을 1MB로 압축하도록 했습니다.)
      • max-request-size: 80개의 파일, 1개의 썸네일 파일을 고려해 (80 + 1) * 2MB의 값인 162MB로 설정했습니다.
      • max-part-count: multipart 요청에 대한 part 수가 기본 10개로 제한되어 있어 최대 82개의 part 발생이 가능한 이미지 문제에 대한 처리가 가능하도록 여유 값인 100으로 설정했습니다.
      • question-path: 이미지 문제 저장을 위한 경로를 추가했습니다.

기타 전달 사항

  • PR 머지 시 최종 변경 사항으로 명세서 및 ERD 수정하겠습니다.
  • 현재 퀴즈 생성에 대한 테스트만 추가해두었습니다. 수정/삭제에 대한 테스트는 추후 추가하도록 하겠습니다.
  • 프론트엔드는 현재 구현 완료된 상태로 PR 머지 시 프론트엔드 git도 push 하도록 하겠습니다.

📚 Reference

max-part-count

✅ Check List

  • 코드가 정상적으로 컴파일되나요?
  • 테스트 코드를 통과했나요?
  • merge할 브랜치의 위치를 확인했나요?
  • Label을 지정했나요?

@dlsrks1021 dlsrks1021 self-assigned this Aug 31, 2025
@dlsrks1021 dlsrks1021 added the enhancement New feature or request label Aug 31, 2025
@dlsrks1021 dlsrks1021 linked an issue Aug 31, 2025 that may be closed by this pull request
@dlsrks1021 dlsrks1021 closed this Aug 31, 2025
@dlsrks1021 dlsrks1021 reopened this Aug 31, 2025
@LimKangHyun
Copy link
Collaborator

먼저 많은 양 해주시느라 너무 고생 많으셨습니다 감사합니다!

String destination = getDestination(roomId);
String userDestination = getUserDestination();

Long quizId = room.getGameSetting().getQuizId();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L4-변경제안]
Room 클래스에 getQuiz() 메서드가 존재하는 걸로 알고 있습니다!
room.getQuizId()로 퀴즈아이디를 가져와도 좋을 것 같습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인해 보니 room 클래스 내부에 getQuizId 메서드가 있는 것을 확인하여 수정했습니다.
감사합니다!

@LimKangHyun
Copy link
Collaborator

LimKangHyun commented Sep 1, 2025

[L4-변경제안]
deleteQuiz() 메서드에서 반복문으로 Question을 삭제하는 부분을 deleteQuestion() 메서드를 사용하도록 변경하면, 코드 재사용성이 좋아질 것 같다는 의견입니다!

  • 퀴즈 서비스가 많이 길어서 인라인 코드리뷰가 안되는 것 같습니다.

@dlsrks1021
Copy link
Collaborator Author

[L4-변경제안] deleteQuiz() 메서드에서 반복문으로 Question을 삭제하는 부분을 deleteQuestion() 메서드를 사용하도록 변경하면, 코드 재사용성이 좋아질 것 같다는 의견입니다!

  • 퀴즈 서비스가 많이 길어서 인라인 코드리뷰가 안되는 것 같습니다.

퀴즈 서비스에서 말씀하신 코드를 살펴보니 deleteQuestion 메서드로 대체하는 것이 코드가 깔끔해지고 재사용성도 챙길 수 있는 좋은 방법인 것 같습니다.
내용 반영해 적용했습니다!

Copy link
Collaborator

@LimKangHyun LimKangHyun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

텍스트 퀘스천 테이블을 ContentQeustion으로 바꾸어 텍스트와 이미지 타입 퀴즈까지 활용하신 부분이
좋은 것 같습니다. 고생하셨습니다!

Copy link
Collaborator

@jiwon1217 jiwon1217 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

많은 양을 작업하시느라 고생하셨습니다 ! 이미지 퀴즈가 추가됨에 따라 발생한 구조 변화나 API 분리 등 다양한 이슈에 잘 대응해주신 것 같습니다 !

Copy link
Collaborator

@sehee123 sehee123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다! 👏

@dlsrks1021 dlsrks1021 merged commit 636ecc6 into dev Sep 11, 2025
@dlsrks1021 dlsrks1021 deleted the feat/176 branch September 11, 2025 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 이미지 문제 추가

5 participants