Skip to content

[Fix] Q&A 도메인 타입 정합성 및 조회 성능 개선#208

Merged
issuejong merged 5 commits into
developfrom
fix/#207
Jun 16, 2026
Merged

[Fix] Q&A 도메인 타입 정합성 및 조회 성능 개선#208
issuejong merged 5 commits into
developfrom
fix/#207

Conversation

@issuejong

Copy link
Copy Markdown
Collaborator

#️⃣연관된 이슈

#207

📝작업 내용

출석/보증금 ID 타입 정합성을 수정하고, 질문 상세 조회 성능과 좋아요 카운트 동시성 문제를 개선했습니다.

  • 출석 및 보증금 ID 타입 정합성 수정

    • AttendanceCodeRepository의 ID 타입을 Long에서 Integer로 수정
    • AttendanceRepository의 ID 타입을 Long에서 Integer로 수정
    • DepositRepository의 ID 타입을 Long에서 Integer로 수정
    • 출석 체크 로직에서 불필요한 Long.valueOf() 변환 제거
    • 관리자 유저 상태 수정 로직에서도 출석 ID를 Integer 기준으로 처리하도록 수정
  • 질문 익명 번호 유니크 제약 정합성 수정

    • question_anonymous_identity의 유니크 제약 이름 정리

    • 기존 question_id + anonymous_no 유니크 제약 제거

    • 역할별 익명 번호 정책에 맞게 익명1운영진1이 같은 질문 내에서 공존할 수 있도록 수정

    • Flyway 마이그레이션 파일 추가

      • V8__drop_question_anonymous_no_unique_constraint.sql
  • 질문 상세 조회 N+1 개선

    • 질문 상세 조회 시 질문 작성자를 JOIN FETCH로 함께 조회
    • 댓글 조회 시 댓글 작성자와 부모 댓글을 한 번에 로딩하도록 수정
    • 댓글/대댓글 DTO 조립 과정에서 반복 조회가 발생하지 않도록 개선
    • 댓글 작성자들의 익명 번호를 한 번에 조회하는 repository 메서드 추가
    • 상세 댓글 응답 조립을 위한 DetailCommentContext 추가
  • 댓글/대댓글 구조 조립 로직 개선

    • 전체 댓글 목록을 한 번에 조회한 뒤 최상위 댓글과 대댓글을 메모리에서 분리
    • 부모 댓글 ID 기준으로 대댓글을 그룹화
    • 최상위 댓글과 대댓글 응답 변환 로직 분리
    • 익명 표시명 계산 시 미리 조회한 익명 번호 맵을 사용하도록 변경
  • 좋아요 카운트 동시성 보강

    • 좋아요 토글 시 질문 row에 PESSIMISTIC_WRITE 락 적용
    • 동시에 여러 사용자가 좋아요를 누를 때 likeCount lost update가 발생하지 않도록 처리
    • 좋아요 처리 전용 조회 메서드 findByIdAndDeletedAtIsNullForUpdate 추가

@issuejong issuejong requested a review from Copilot June 16, 2026 12:57
@issuejong issuejong linked an issue Jun 16, 2026 that may be closed by this pull request
@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
piro-in Ready Ready Preview, Comment Jun 16, 2026 1:15pm
piro-in-765d Ready Ready Preview, Comment Jun 16, 2026 1:15pm

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

이 PR은 출석/보증금 도메인의 PK 타입을 엔티티와 정합시키고, Q&A 질문 상세 조회의 N+1을 줄이며, 좋아요 카운트 동시성(lost update) 문제를 완화하는 변경을 포함합니다.

Changes:

  • Attendance/AttendanceCode/Deposit Repository의 ID 제네릭 타입을 Long -> Integer로 정합화하고 불필요한 변환 로직을 제거
  • 질문 상세 조회에서 작성자/댓글 작성자/부모댓글/익명번호를 배치 로딩하여 N+1을 줄이고 DTO 조립 로직을 재구성
  • 좋아요 토글 시 질문 row에 PESSIMISTIC_WRITE 락을 적용하는 전용 조회 메서드를 추가

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
backend/src/main/resources/db/migration/V8__drop_question_anonymous_no_unique_constraint.sql 질문 익명번호 제약(legacy) 제거 마이그레이션 추가
backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java 출석 ID 처리 타입을 Integer 기준으로 정리
backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java 상세 조회 댓글/대댓글 조립 로직 개선 및 좋아요 토글용 조회 분리
backend/src/main/java/com/example/Piroin/project/domain/question/repository/QuestionRepository.java 상세 조회(fetch join) / 좋아요 갱신용(for update) 조회 메서드 추가
backend/src/main/java/com/example/Piroin/project/domain/question/repository/QuestionCommentRepository.java 상세 조회용 댓글 목록을 fetch join으로 일괄 로딩하도록 변경
backend/src/main/java/com/example/Piroin/project/domain/question/repository/QuestionAnonymousIdentityRepository.java 상세 조회에서 익명번호를 일괄 조회하는 메서드 추가
backend/src/main/java/com/example/Piroin/project/domain/question/entity/QuestionAnonymousIdentity.java 익명번호 유니크 제약 정리(제약 제거/이름 정합)
backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java Deposit PK 타입 정합화(Integer)
backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java 출석 체크 로직에서 불필요한 Long.valueOf() 변환 제거
backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceRepository.java Attendance PK 타입 정합화(Integer)
backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceCodeRepository.java AttendanceCode PK 타입 정합화(Integer)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 10 to 16
@Table(
name = "question_anonymous_identity",
uniqueConstraints = {
@UniqueConstraint(
name = "uq_question_anon_question_user",
name = "uq_question_anonymous_identity_question_user",
columnNames = {"question_id", "user_id"}
),
@UniqueConstraint(
name = "uq_question_anon_question_no",
columnNames = {"question_id", "anonymous_no"}
)
Comment on lines +1 to +4
-- Anonymous numbers are scoped by role, so member #1 and admin #1 can coexist in the same question.
-- Drop the legacy question_id + anonymous_no constraint if it exists.
ALTER TABLE question_anonymous_identity
DROP CONSTRAINT IF EXISTS uq_question_anon_question_no;
@issuejong issuejong merged commit 1088616 into develop Jun 16, 2026
4 checks passed
@issuejong issuejong deleted the fix/#207 branch June 16, 2026 13:15
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.

[Refactor] 백엔드 안정성 및 성능 개선

2 participants