Skip to content

[FEAT] 성별 기반 방 목록 필터링 — Room 테이블 gender 컬럼 추가 및 인덱스 확장 #90

@ydking0911

Description

@ydking0911

문제 상황

User 엔티티에 Gender(MALE/FEMALE) 필드가 존재하고 회원가입 시 필수값으로 수집되지만, Room에는 성별 구분이 없어 다른 성별의 방 모집글이 그대로 노출된다.

구현 방안

방안 A

  • host_user_no → users.gender JOIN 방식
    이미 LEFT JOIN users u ON u.user_no = r.host_user_no가 LATERAL 쿼리에 존재하므로 AND u.gender = :gender 한 줄 추가로 구현 가능.

그러나 LATERAL 이후에 필터가 적용되는 구조가 된다:
room 스캔 → LATERAL 실행 (room_rule 체크) → users JOIN → gender 필터
room_rule LATERAL 서브쿼리가 필터링 전 전체 row에 대해 실행되고, room 테이블에 인덱스를 걸 수 없어 기존 성능 최적화 효과가 희석된다.

방안 B

  • Room에 gender 컬럼 추가 (채택)

room 테이블에 gender 컬럼을 두면 WHERE 절 첫 단계에서 필터링이 가능하다:
room 스캔 (room_status + gender 인덱스) → LATERAL 실행 → JOIN
gender 조건이 LATERAL 실행 전에 적용되므로 LATERAL 서브쿼리 실행 횟수가 ~50% 감소한다. 또한 인덱스에 gender를 포함시킬 수 있어 기존 Top-N 최적화 구조와 자연스럽게 통합된다.

방 생성 시 host user의 gender를 그대로 복사하므로 값이 변하지 않고, 비정규화에 대한 정합성 리스크가 없다.

세부 구현 계획

  1. Room 엔티티 및 인덱스 수정
  2. 방 생성 시 gender 자동 설정
  • CurrentUser로 받은 userNo로 host gender 조회 후 Room.gender 설정
  1. 쿼리 수정
  • QueryDSL: findByCursor -> .where()에 room.gender.eq(gender) 1줄 추가
  • LATERAL: findByCursorWithLateral -> WHERE r.room_status = :roomStatus 바로 아래에 AND r.gender = :gender 추가
  1. FindRoomsUseCase 수정
  • userNo 받을 수 있게 파라미터 수정 (서버에서 UserService로 조회하는 방식으로 처리)
  1. 방 신청 검증
  • 예외 처리

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions