Skip to content

Commit 2730b09

Browse files
committed
test: 스터디룸 jwt 테스트 코드 통합
1 parent 732cdd9 commit 2730b09

File tree

2 files changed

+71
-104
lines changed

2 files changed

+71
-104
lines changed

README.md

Lines changed: 7 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -4,73 +4,10 @@
44
<br/>
55
<br/>
66

7-
---
8-
9-
# ✅ PR #1: JWT 인증 통합 완료
10-
11-
## 📋 작업 요약
12-
스터디룸 API에서 하드코딩된 사용자 ID를 제거하고, JWT 인증 시스템을 완전히 통합했습니다.
13-
14-
### 🔄 주요 변경 사항
15-
16-
#### 1. SecurityConfig 수정
17-
- `/api/rooms/**` 경로의 `permitAll()` 제거
18-
- 모든 방 API가 이제 JWT 인증 필수
19-
20-
#### 2. RoomController JWT 통합
21-
- `CurrentUser` 의존성 주입으로 실제 사용자 ID 추출
22-
- 하드코딩된 `Long currentUserId = 1L;` 제거 (10개 메서드)
23-
- 불필요한 `@RequestHeader("Authorization")` 파라미터 제거
24-
25-
### 🔐 인증 흐름
26-
1. **클라이언트 요청**: Authorization 헤더에 "Bearer {token}" 전달
27-
2. **JwtAuthenticationFilter**: 토큰 추출 및 검증
28-
3. **Controller**: `CurrentUser.getUserId()`로 사용자 ID 획득
29-
4. **인증 실패 시**: 401 Unauthorized 자동 응답
30-
31-
### 🧪 테스트 방법
32-
```bash
33-
# 1. 로그인하여 JWT 토큰 받기
34-
POST /api/auth/login
35-
{
36-
"username": "user",
37-
"password": "password"
38-
}
39-
40-
# 2. 토큰으로 방 생성
41-
POST /api/rooms
42-
Authorization: Bearer {받은_토큰}
43-
{
44-
"title": "테스트 방",
45-
"isPrivate": false
46-
}
47-
48-
# 3. 토큰 없이 요청 시 401 에러 확인
49-
POST /api/rooms # ❌ 401 Unauthorized
50-
```
51-
52-
### 📊 영향받는 API 엔드포인트
53-
| 엔드포인트 | 메서드 | 변경 사항 |
54-
|-----------|--------|----------|
55-
| `/api/rooms` | POST | JWT 인증 필수 |
56-
| `/api/rooms/{roomId}/join` | POST | JWT 인증 필수 |
57-
| `/api/rooms/{roomId}/leave` | POST | JWT 인증 필수 |
58-
| `/api/rooms` | GET | JWT 인증 필수 |
59-
| `/api/rooms/{roomId}` | GET | JWT 인증 필수 |
60-
| `/api/rooms/my` | GET | JWT 인증 필수 |
61-
| `/api/rooms/{roomId}` | PUT | JWT 인증 필수 |
62-
| `/api/rooms/{roomId}` | DELETE | JWT 인증 필수 |
63-
| `/api/rooms/{roomId}/members` | GET | JWT 인증 필수 |
64-
| `/api/rooms/popular` | GET | JWT 인증 필수 |
65-
66-
---
67-
<br/>
68-
<br/>
69-
707
# 개발 및 배포 프로세스 & Git 컨벤션 가이드
718
해당 프로젝트는 `dev` 브랜치에서 개발하고, `main`브랜치에서 배포합니다. <br/> <br/>
729
아래에 브랜치 전략, 커밋/PR 컨벤션, 워크플로우 전략, 브랜치 보호 규칙, 응답 데이터 및 예외처리 전략을 정리하였습니다. <br/> <br/>
73-
개발 전에 꼭 읽어봐주세요!
10+
개발 전에 꼭 읽어봐주세요!
7411
<br/>
7512
<br/>
7613

@@ -84,7 +21,7 @@ POST /api/rooms # ❌ 401 Unauthorized
8421
- 안정화된 코드를 머지하여 배포
8522
- `dev``main` PR은 관리자 혹은 릴리즈 담당자만 생성 및 승인 가능
8623
- 직접 push 및 외부 PR 제한
87-
<br/>
24+
<br/>
8825

8926
## 2. 커밋/PR 컨벤션
9027

@@ -216,11 +153,11 @@ public ResponseEntity<RsData<Void>> handleCustomException(
216153
// 응답 데이터 예시 (json)
217154

218155
{
219-
"code": ErrorCode.code,
220-
"message": ErrorCode.message,
221-
"data": {...} or {null},
222-
"success": false
223-
}
156+
"code": ErrorCode.code,
157+
"message": ErrorCode.message,
158+
"data": {...} or {null},
159+
"success": false
160+
}
224161
```
225162

226163
<br/>

src/test/java/com/back/domain/studyroom/controller/RoomControllerTest.java

Lines changed: 64 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.back.domain.user.entity.UserProfile;
99
import com.back.domain.user.entity.UserStatus;
1010
import com.back.global.common.dto.RsData;
11+
import com.back.global.security.CurrentUser;
1112
import org.junit.jupiter.api.BeforeEach;
1213
import org.junit.jupiter.api.DisplayName;
1314
import org.junit.jupiter.api.Test;
@@ -32,12 +33,15 @@
3233
import static org.mockito.Mockito.verify;
3334

3435
@ExtendWith(MockitoExtension.class)
35-
@DisplayName("RoomController 테스트")
36+
@DisplayName("RoomController 테스트 - JWT 인증 통합")
3637
class RoomControllerTest {
3738

3839
@Mock
3940
private RoomService roomService;
4041

42+
@Mock
43+
private CurrentUser currentUser;
44+
4145
@InjectMocks
4246
private RoomController roomController;
4347

@@ -75,12 +79,16 @@ void setUp() {
7579

7680
// 테스트 멤버 생성
7781
testMember = RoomMember.createHost(testRoom, testUser);
82+
83+
// CurrentUser Mock 설정은 각 테스트에서 필요할 때만 설정
7884
}
7985

8086
@Test
81-
@DisplayName("방 생성 API 테스트")
87+
@DisplayName("방 생성 API 테스트 - JWT 인증")
8288
void createRoom() {
8389
// given
90+
given(currentUser.getUserId()).willReturn(1L);
91+
8492
CreateRoomRequest request = new CreateRoomRequest(
8593
"테스트 방",
8694
"테스트 설명",
@@ -95,59 +103,66 @@ void createRoom() {
95103
anyBoolean(),
96104
any(),
97105
anyInt(),
98-
anyLong()
106+
eq(1L)
99107
)).willReturn(testRoom);
100108

101109
// when
102-
ResponseEntity<RsData<RoomResponse>> response = roomController.createRoom(request, "Bearer token");
110+
ResponseEntity<RsData<RoomResponse>> response = roomController.createRoom(request);
103111

104112
// then
105113
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
106114
assertThat(response.getBody()).isNotNull();
107115
assertThat(response.getBody().isSuccess()).isTrue();
108116
assertThat(response.getBody().getData().getTitle()).isEqualTo("테스트 방");
109117

118+
verify(currentUser, times(1)).getUserId();
110119
verify(roomService, times(1)).createRoom(
111120
anyString(),
112121
anyString(),
113122
anyBoolean(),
114123
any(),
115124
anyInt(),
116-
anyLong()
125+
eq(1L)
117126
);
118127
}
119128

120129
@Test
121-
@DisplayName("방 입장 API 테스트")
130+
@DisplayName("방 입장 API 테스트 - JWT 인증")
122131
void joinRoom() {
123132
// given
133+
given(currentUser.getUserId()).willReturn(1L);
134+
124135
JoinRoomRequest request = new JoinRoomRequest(null);
125-
given(roomService.joinRoom(anyLong(), any(), anyLong())).willReturn(testMember);
136+
given(roomService.joinRoom(eq(1L), any(), eq(1L))).willReturn(testMember);
126137

127138
// when
128-
ResponseEntity<RsData<JoinRoomResponse>> response = roomController.joinRoom(1L, request, "Bearer token");
139+
ResponseEntity<RsData<JoinRoomResponse>> response = roomController.joinRoom(1L, request);
129140

130141
// then
131142
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
132143
assertThat(response.getBody()).isNotNull();
133144
assertThat(response.getBody().isSuccess()).isTrue();
134145

135-
verify(roomService, times(1)).joinRoom(anyLong(), any(), anyLong());
146+
verify(currentUser, times(1)).getUserId();
147+
verify(roomService, times(1)).joinRoom(eq(1L), any(), eq(1L));
136148
}
137149

138150
@Test
139-
@DisplayName("방 나가기 API 테스트")
151+
@DisplayName("방 나가기 API 테스트 - JWT 인증")
140152
void leaveRoom() {
141153
// given
154+
given(currentUser.getUserId()).willReturn(1L);
155+
142156
// when
143-
ResponseEntity<RsData<Void>> response = roomController.leaveRoom(1L, "Bearer token");
157+
ResponseEntity<RsData<Void>> response = roomController.leaveRoom(1L);
144158

145159
// then
146160
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
147161
assertThat(response.getBody()).isNotNull();
148162
assertThat(response.getBody().isSuccess()).isTrue();
149163

150-
verify(roomService, times(1)).leaveRoom(anyLong(), anyLong());
164+
verify(currentUser, times(1)).getUserId();
165+
verify(roomService, times(1)).leaveRoom(eq(1L), eq(1L));
151166
}
152167

153168
@Test
@@ -174,29 +189,34 @@ void getRooms() {
174189
}
175190

176191
@Test
177-
@DisplayName("방 상세 정보 조회 API 테스트")
192+
@DisplayName("방 상세 정보 조회 API 테스트 - JWT 인증")
178193
void getRoomDetail() {
179194
// given
180-
given(roomService.getRoomDetail(anyLong(), anyLong())).willReturn(testRoom);
181-
given(roomService.getRoomMembers(anyLong(), anyLong())).willReturn(Arrays.asList(testMember));
195+
given(currentUser.getUserId()).willReturn(1L);
196+
197+
given(roomService.getRoomDetail(eq(1L), eq(1L))).willReturn(testRoom);
198+
given(roomService.getRoomMembers(eq(1L), eq(1L))).willReturn(Arrays.asList(testMember));
182199

183200
// when
184-
ResponseEntity<RsData<RoomDetailResponse>> response = roomController.getRoomDetail(1L, "Bearer token");
201+
ResponseEntity<RsData<RoomDetailResponse>> response = roomController.getRoomDetail(1L);
185202

186203
// then
187204
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
188205
assertThat(response.getBody()).isNotNull();
189206
assertThat(response.getBody().isSuccess()).isTrue();
190207
assertThat(response.getBody().getData().getTitle()).isEqualTo("테스트 방");
191208

192-
verify(roomService, times(1)).getRoomDetail(anyLong(), anyLong());
193-
verify(roomService, times(1)).getRoomMembers(anyLong(), anyLong());
209+
verify(currentUser, times(1)).getUserId();
210+
verify(roomService, times(1)).getRoomDetail(eq(1L), eq(1L));
211+
verify(roomService, times(1)).getRoomMembers(eq(1L), eq(1L));
194212
}
195213

196214
@Test
197-
@DisplayName("내 참여 방 목록 조회 API 테스트")
215+
@DisplayName("내 참여 방 목록 조회 API 테스트 - JWT 인증")
198216
void getMyRooms() {
199217
// given
218+
given(currentUser.getUserId()).willReturn(1L);
219+
200220
// Room에 ID 설정 (리플렉션 사용)
201221
try {
202222
java.lang.reflect.Field idField = testRoom.getClass().getSuperclass().getDeclaredField("id");
@@ -206,11 +226,11 @@ void getMyRooms() {
206226
throw new RuntimeException(e);
207227
}
208228

209-
given(roomService.getUserRooms(anyLong())).willReturn(Arrays.asList(testRoom));
210-
given(roomService.getUserRoomRole(eq(1L), anyLong())).willReturn(RoomRole.HOST);
229+
given(roomService.getUserRooms(eq(1L))).willReturn(Arrays.asList(testRoom));
230+
given(roomService.getUserRoomRole(eq(1L), eq(1L))).willReturn(RoomRole.HOST);
211231

212232
// when
213-
ResponseEntity<RsData<List<MyRoomResponse>>> response = roomController.getMyRooms("Bearer token");
233+
ResponseEntity<RsData<List<MyRoomResponse>>> response = roomController.getMyRooms();
214234

215235
// then
216236
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
@@ -219,13 +239,16 @@ void getMyRooms() {
219239
assertThat(response.getBody().getData()).hasSize(1);
220240
assertThat(response.getBody().getData().get(0).getTitle()).isEqualTo("테스트 방");
221241

222-
verify(roomService, times(1)).getUserRooms(anyLong());
242+
verify(currentUser, times(1)).getUserId();
243+
verify(roomService, times(1)).getUserRooms(eq(1L));
223244
}
224245

225246
@Test
226-
@DisplayName("방 설정 수정 API 테스트")
247+
@DisplayName("방 설정 수정 API 테스트 - JWT 인증")
227248
void updateRoom() {
228249
// given
250+
given(currentUser.getUserId()).willReturn(1L);
251+
229252
UpdateRoomSettingsRequest request = new UpdateRoomSettingsRequest(
230253
"변경된 제목",
231254
"변경된 설명",
@@ -236,48 +259,54 @@ void updateRoom() {
236259
);
237260

238261
// when
239-
ResponseEntity<RsData<Void>> response = roomController.updateRoom(1L, request, "Bearer token");
262+
ResponseEntity<RsData<Void>> response = roomController.updateRoom(1L, request);
240263

241264
// then
242265
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
243266
assertThat(response.getBody()).isNotNull();
244267
assertThat(response.getBody().isSuccess()).isTrue();
245268

269+
verify(currentUser, times(1)).getUserId();
246270
verify(roomService, times(1)).updateRoomSettings(
247-
anyLong(),
271+
eq(1L),
248272
anyString(),
249273
anyString(),
250274
anyInt(),
251275
anyBoolean(),
252276
anyBoolean(),
253277
anyBoolean(),
254-
anyLong()
278+
eq(1L)
255279
);
256280
}
257281

258282
@Test
259-
@DisplayName("방 종료 API 테스트")
283+
@DisplayName("방 종료 API 테스트 - JWT 인증")
260284
void deleteRoom() {
261285
// given
286+
given(currentUser.getUserId()).willReturn(1L);
287+
262288
// when
263-
ResponseEntity<RsData<Void>> response = roomController.deleteRoom(1L, "Bearer token");
289+
ResponseEntity<RsData<Void>> response = roomController.deleteRoom(1L);
264290

265291
// then
266292
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
267293
assertThat(response.getBody()).isNotNull();
268294
assertThat(response.getBody().isSuccess()).isTrue();
269295

270-
verify(roomService, times(1)).terminateRoom(anyLong(), anyLong());
296+
verify(currentUser, times(1)).getUserId();
297+
verify(roomService, times(1)).terminateRoom(eq(1L), eq(1L));
271298
}
272299

273300
@Test
274-
@DisplayName("방 멤버 목록 조회 API 테스트")
301+
@DisplayName("방 멤버 목록 조회 API 테스트 - JWT 인증")
275302
void getRoomMembers() {
276303
// given
277-
given(roomService.getRoomMembers(anyLong(), anyLong())).willReturn(Arrays.asList(testMember));
304+
given(currentUser.getUserId()).willReturn(1L);
305+
306+
given(roomService.getRoomMembers(eq(1L), eq(1L))).willReturn(Arrays.asList(testMember));
278307

279308
// when
280-
ResponseEntity<RsData<List<RoomMemberResponse>>> response = roomController.getRoomMembers(1L, "Bearer token");
309+
ResponseEntity<RsData<List<RoomMemberResponse>>> response = roomController.getRoomMembers(1L);
281310

282311
// then
283312
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
@@ -286,7 +315,8 @@ void getRoomMembers() {
286315
assertThat(response.getBody().getData()).hasSize(1);
287316
assertThat(response.getBody().getData().get(0).getNickname()).isEqualTo("테스트유저");
288317

289-
verify(roomService, times(1)).getRoomMembers(anyLong(), anyLong());
318+
verify(currentUser, times(1)).getUserId();
319+
verify(roomService, times(1)).getRoomMembers(eq(1L), eq(1L));
290320
}
291321

292322
@Test

0 commit comments

Comments
 (0)