Skip to content

Conversation

@jueunk617
Copy link
Collaborator

📌 개요

스터디룸 채팅 기능의 안정성과 효율성을 높이기 위해 JWT 인증을 도입하고, 메시지 조회 로직을 QueryDSL로 개선했습니다.
기능 변경에 따른 테스트 코드와 API 문서를 추가하여 완성도를 높였습니다.

🔨 작업 내용

1. JWT 인증 로직 추가

  • REST API 엔드포인트에 @AuthenticationPrincipal을 적용하여 인증된 사용자만 API를 호출할 수 있도록 변경.
  • WebSocket 연결 시 Principal 객체에서 사용자 정보를 추출하여, 인증된 사용자의 채팅 메시지만 처리하도록 구현.

2. QueryDSL을 이용한 조회 성능 개선

  • 기존 Repository에 QueryDSL을 적용하여 동적 쿼리 생성 및 Fetch Join 구현.
  • 이를 통해 N+1 문제를 해결하고, before 파라미터를 이용한 이전 메시지 조회(무한 스크롤) 기능 구현. (기존 TODO 해결)

3. 기타 개선 사항

  • 테스트 코드 작성: 주요 로직 변경에 대한 테스트 코드를 작성.
  • API 문서 최신화: Swagger 어노테이션을 추가하여 API 명세를 명확하게 정리.
  • 리팩토링: 초기 와이어프레임 확인 후 불필요해진 로직을 제거하여 코드 간소화.

🔗 관련 이슈

Closes #48

📝 참고 사항

향후 작업 예정

  • 현재 구현된 스터디룸 채팅 구조를 바탕으로 개인 간 채팅(DM) 기능을 구현할 예정입니다.

✅ 체크리스트

  • 기능 동작 확인
  • 테스트 코드 작성
  • 문서/주석 추가 및 최신화

@github-actions github-actions bot changed the title Feat: 스터디룸 채팅 구현 마무리 Feat: 스터디룸 채팅 구현 마무리 (#48) Sep 24, 2025
1. 문제 원인
- @SuperBuilder는 필드 초기값(ex. new ArrayList<>())을 무시하여, 빌더로 생성된 객체의 컬렉션 필드가 null이 되는 문제가 있었음.
- 이로 인해 테스트 환경에서 NullPointerException 및 DB ConstraintViolationException (NOT NULL 제약 조건 위반)이 연쇄적으로 발생함.
- 일부 테스트에서는 엔티티 필드명(userProfile)과 다른 이름(userProfiles)을 리플렉션으로 참조하여 NoSuchFieldException이 발생함.

2. 해결 방법
- @Builder.Default 적용 : Room, User 등 @SuperBuilder를 사용하는 모든 엔티티의 컬렉션 필드 및 초기값을 가진 필드에 @Builder.Default 어노테이션을 추가함. 이를 통해 빌더 사용 시에도 필드가 null이 아닌 기본값으로 안전하게 초기화되도록 보장함.

- 테스트 코드 수정 : ChatWebSocketControllerTest에서 User의 userProfile 필드를 잘못된 이름("userProfiles")으로 참조하던 리플렉션 코드를 수정함.
@KSH0326 KSH0326 self-requested a review September 24, 2025 16:20
@jueunk617 jueunk617 merged commit 233a3b9 into dev Sep 25, 2025
2 checks passed
@github-actions github-actions bot deleted the Feat/48 branch September 25, 2025 00:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants