Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
e508157
refactor: 스더티룸 권한에 대한 로직 개선
loseminho Oct 2, 2025
8b766f3
Merge remote-tracking branch 'origin/dev' into refactor/146
loseminho Oct 2, 2025
ef46ed0
fix: ci에서 통과 못한 테스트코드 수정
loseminho Oct 3, 2025
23e55ea
fix:rest api와 웹소켓 중간 경로 통합
loseminho Oct 4, 2025
2979e6e
fix:rest api와 웹소켓 중간 경로 통합
loseminho Oct 4, 2025
2de8631
fix: 병합 충돌 제어
loseminho Oct 4, 2025
e576231
Merge remote-tracking branch 'origin/dev' into refactor/146
loseminho Oct 5, 2025
98c9e4c
fix: 에러 확인을 위한 통합테스트 추가, Room.create()메서드 수정
loseminho Oct 5, 2025
8cb4561
refactor, feat
loseminho Oct 5, 2025
be970fd
Merge remote-tracking branch 'origin/dev' into refactor/146
loseminho Oct 5, 2025
57c38ae
refactor: redis 로직 최적화 및 중복 검증 로직 제거
loseminho Oct 7, 2025
ad752e7
fix : 병합 충돌 제어
loseminho Oct 7, 2025
1af4d1e
fix: 에러 번호 수정
loseminho Oct 8, 2025
483a0fc
feat: 스터디룸 방 비밀번호 변경 및 삭제 기능 구현
loseminho Oct 9, 2025
89971f2
Merge remote-tracking branch 'origin/dev' into feat-215
loseminho Oct 9, 2025
77ab976
fix:app-dev 제거
loseminho Oct 9, 2025
7a17167
feat: 웹소켓 기반 소극적 하트비트
loseminho Oct 9, 2025
dd229f2
Merge remote-tracking branch 'origin/dev' into feat/217
loseminho Oct 10, 2025
cf32230
feat: 스터디룸 썸네일 기능 추가 및 webrtc 설정 변경에서 주석처리
loseminho Oct 10, 2025
be00c11
Merge branch 'feat/217' of https://github.com/prgrms-web-devcourse-fi…
loseminho Oct 10, 2025
da453f6
fix:소극적 하트비트 사용 주석처리
loseminho Oct 10, 2025
70813b6
Merge remote-tracking branch 'origin/dev' into feat/217
loseminho Oct 11, 2025
2de5447
Feat: 스터디 룸 내에 고양이 아바타 시스템과 프로필 이미지 url 연동
loseminho Oct 11, 2025
2bc4e95
Merge remote-tracking branch 'origin/dev' into feat/217
loseminho Oct 11, 2025
7d4237c
fix: 기존 작성되어있던 test 코드 수정
loseminho Oct 11, 2025
ad988c8
Merge remote-tracking branch 'origin/dev' into feat/217
loseminho Oct 12, 2025
030cbc8
Merge remote-tracking branch 'origin/dev' into feat/217
loseminho Oct 12, 2025
08a976f
test: 아바타 테스트 코드 완료
loseminho Oct 12, 2025
8761b03
refactor: 프론트엔드 요청 사항에 따른 스터디룸 조회 마스킹 제거
loseminho Oct 13, 2025
4a770d6
Merge remote-tracking branch 'origin/dev' into refactor/257
loseminho Oct 13, 2025
a096d93
Merge remote-tracking branch 'origin/dev' into refactor/257
loseminho Oct 13, 2025
df98fc7
feat: 스터디룸 방 초대 코드 시스템
loseminho Oct 13, 2025
4be3aab
Infra: main branch 로컬 환경과 운영 환경 동기화
namgigun Oct 13, 2025
e0a3af3
Infra: docker-compose 파일 수정
namgigun Oct 1, 2025
3aaebb6
Fix: 백엔드 CD 파일 수정
namgigun Oct 2, 2025
cdf13b7
Infra: EC2 환경변수 수정
namgigun Oct 13, 2025
bc471c4
Chore: CD 파일 수정
namgigun Oct 2, 2025
eee9529
Chore: 백엔드 CD 파일 수정
namgigun Oct 2, 2025
849fbf5
Infra: 백엔드 CD 파일 수정
namgigun Oct 2, 2025
670984c
Infra: 도커 컴포즈 수정
namgigun Oct 5, 2025
2fc31f0
Infra: 운영환경 설정
namgigun Oct 13, 2025
401fa4b
Fix: SecurityConfig 수정
namgigun Oct 13, 2025
f68ff22
test,fix: 방 초대에 대한 테스트 코드 작성 및 에러 수정
loseminho Oct 13, 2025
2c49fc6
Merge remote-tracking branch 'origin/dev' into fix/279
loseminho Oct 14, 2025
8cbb11f
fix: 스터디룸 파일 업로드 맵핑 형식으로 변환
loseminho Oct 14, 2025
6c9e254
Merge remote-tracking branch 'origin' into fix/279
loseminho Oct 14, 2025
0cea892
fix: 병합충돌 제어 수정
loseminho Oct 14, 2025
4563fef
fix: 병합충돌 제어
loseminho Oct 14, 2025
6f5596a
fix: 스터디 룸 내 프론트엔드 요구 사항 및 오류사항 수정
loseminho Oct 14, 2025
b23ba21
Merge remote-tracking branch 'origin/dev' into fix/287
loseminho Oct 14, 2025
ab6baa8
feat: 방 즐겨찾기, 방 공지사항 구현
loseminho Oct 15, 2025
1c05a8a
Merge remote-tracking branch 'origin/dev' into fix/287
loseminho Oct 15, 2025
b70548c
fix: mockbean 수정
loseminho Oct 15, 2025
03419b6
fix: 테스트에서 빠진 비로그인 사용자 추가
loseminho Oct 15, 2025
f33a5fb
Merge remote-tracking branch 'origin/dev' into fix/287
loseminho Oct 15, 2025
1c7e23d
hotfix: 누락된 사용자 추방에 대한 컨트롤러 추가
loseminho Oct 15, 2025
3eaa5a8
hotfix: VISITOR도 추방 가능하도록 수정
loseminho Oct 15, 2025
e00990d
fix: 누락된 테스트코드 추가 및 테스트코드 로직 수정
loseminho Oct 15, 2025
5343996
refactor: 아바타 시스템 db와 분리 및 테스트 코드 수정
loseminho Oct 15, 2025
8b6fee4
Merge remote-tracking branch 'origin/dev' into refactor/302
loseminho Oct 15, 2025
723f49c
fix: 턴서버 dev에 맞춤
loseminho Oct 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.back.domain.studyroom.controller;

import com.back.domain.studyroom.dto.AvatarResponse;
import com.back.domain.studyroom.dto.UpdateAvatarRequest;
import com.back.domain.studyroom.service.AvatarService;
import com.back.global.common.dto.RsData;
Expand All @@ -13,16 +12,14 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
* 방 아바타 관리 API 컨트롤러
* - JWT 인증 필수
* - MEMBER 등급 이상만 아바타 변경 가능
* - 아바타는 숫자(ID)로만 관리
* - 프론트엔드에서 숫자에 맞는 이미지 매핑
*/
@RestController
@RequestMapping("/api/rooms/{roomId}/avatars")
Expand All @@ -34,42 +31,19 @@ public class RoomAvatarController {
private final AvatarService avatarService;
private final CurrentUser currentUser;

/**
* 사용 가능한 아바타 목록 조회
*/
@GetMapping
@Operation(
summary = "아바타 목록 조회",
description = "선택 가능한 아바타 목록을 조회합니다. 고양이, 강아지 등 다양한 아바타를 제공합니다."
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<List<AvatarResponse>>> getAvatars(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

List<AvatarResponse> avatars = avatarService.getAvailableAvatars();

return ResponseEntity.ok(
RsData.success("아바타 목록 조회 완료", avatars)
);
}

/**
* 내 아바타 변경 (모든 사용자 가능)
*/
@PutMapping("/me")
@Operation(
summary = "아바타 변경",
description = "방에서 사용할 아바타를 변경합니다.\n\n" +
"- VISITOR: Redis에만 저장 (퇴장 시 삭제, 재입장 시 랜덤 배정)\n" +
"- MEMBER 이상: DB에 저장 (재입장 시에도 유지)"
"- 프론트에서 원하는 숫자(avatarId)를 전송하면 그대로 저장됩니다.\n" +
"- DB 검증 없이 Redis에만 저장됩니다.\n" +
"- 모든 사용자(VISITOR 포함) 변경 가능합니다."
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "변경 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 아바타 ID"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 방 또는 아바타"),
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<Void>> updateMyAvatar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public ResponseEntity<RsData<RoomResponse>> createRoom(
@PostMapping("/{roomId}/join")
@Operation(
summary = "방 입장",
description = "특정 스터디 룸에 입장합니다. 공개방은 바로 입장 가능하며, 비공개방은 비밀번호가 필요합니다."
description = "특정 스터디 룸에 입장합니다. 공개방은 바로 입장 가능하며, 비공개방은 비밀번호가 필요합니다. 입장 시 랜덤 아바타(1~3)가 배정됩니다."
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "방 입장 성공"),
Expand All @@ -96,8 +96,11 @@ public ResponseEntity<RsData<JoinRoomResponse>> joinRoom(
password = request.getPassword();
}

RoomMember member = roomService.joinRoom(roomId, password, currentUserId);
JoinRoomResponse response = JoinRoomResponse.from(member);
// 방 입장 + 아바타 ID 반환
com.back.domain.studyroom.dto.JoinRoomWithAvatarResult result =
roomService.joinRoomWithAvatar(roomId, password, currentUserId);

JoinRoomResponse response = JoinRoomResponse.of(result.getMember(), result.getAvatarId());

return ResponseEntity
.status(HttpStatus.OK)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class RoomInvitePublicController {
private final RoomInviteService inviteService;
private final RoomService roomService;
private final CurrentUser currentUser;
private final com.back.domain.studyroom.service.AvatarService avatarService;

@PostMapping("/{inviteCode}")
@SecurityRequirement(name = "Bearer Authentication")
Expand Down Expand Up @@ -59,7 +60,11 @@ public ResponseEntity<RsData<JoinRoomResponse>> joinByInviteCode(

// 방 입장 권한 체크 (비밀번호 무시, Redis 등록 건너뜀)
RoomMember member = roomService.joinRoom(room.getId(), null, userId, false);
JoinRoomResponse response = JoinRoomResponse.from(member);

// 랜덤 아바타 ID 생성
Long avatarId = avatarService.assignRandomAvatar();

JoinRoomResponse response = JoinRoomResponse.of(member, avatarId);

return ResponseEntity
.status(HttpStatus.OK)
Expand Down
30 changes: 0 additions & 30 deletions src/main/java/com/back/domain/studyroom/dto/AvatarResponse.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ public class JoinRoomResponse {
private Long roomId;
private Long userId;
private RoomRole role;
private Long avatarId; // 부여받은 아바타 ID (숫자만)
private LocalDateTime joinedAt;

public static JoinRoomResponse from(RoomMember member) {
public static JoinRoomResponse of(RoomMember member, Long avatarId) {
return JoinRoomResponse.builder()
.roomId(member.getRoom().getId())
.userId(member.getUser().getId())
.role(member.getRole())
.avatarId(avatarId)
.joinedAt(member.getJoinedAt())
.build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.back.domain.studyroom.dto;

import com.back.domain.studyroom.entity.RoomMember;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* 방 입장 결과 + 아바타 ID
* 내부 전달용 DTO
*/
@Getter
@AllArgsConstructor
public class JoinRoomWithAvatarResult {
private RoomMember member;
private Long avatarId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ public class RoomMemberResponse {
private Long userId;
private String nickname;
private String profileImageUrl;
private Long avatarId;
private String avatarImageUrl;
private Long avatarId; // 아바타 ID (숫자만, 프론트에서 매핑)
private RoomRole role;
private LocalDateTime joinedAt;
private LocalDateTime promotedAt;
Expand All @@ -36,15 +35,14 @@ public static RoomMemberResponse from(RoomMember member) {
}

/**
* 아바타 정보를 포함된 내용으로 생성
* 아바타 ID 포함하여 생성
*/
public static RoomMemberResponse of(RoomMember member, Long avatarId, String avatarImageUrl) {
public static RoomMemberResponse of(RoomMember member, Long avatarId) {
return RoomMemberResponse.builder()
.userId(member.getUser().getId())
.nickname(member.getUser().getNickname())
.profileImageUrl(member.getUser().getProfileImageUrl())
.avatarId(avatarId)
.avatarImageUrl(avatarImageUrl)
.role(member.getRole())
.joinedAt(member.getJoinedAt())
.promotedAt(member.getPromotedAt())
Expand Down
36 changes: 0 additions & 36 deletions src/main/java/com/back/domain/studyroom/entity/Avatar.java

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading