Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# 개발 및 배포 프로세스 & Git 컨벤션 가이드
해당 프로젝트는 `dev` 브랜치에서 개발하고, `main`브랜치에서 배포합니다. <br/> <br/>
아래에 브랜치 전략, 커밋/PR 컨벤션, 워크플로우 전략, 브랜치 보호 규칙, 응답 데이터 및 예외처리 전략을 정리하였습니다. <br/> <br/>
개발 전에 꼭 읽어봐주세요!
개발 전에 꼭 읽어봐주세요!
<br/>
<br/>

Expand All @@ -21,7 +21,7 @@
- 안정화된 코드를 머지하여 배포
- `dev` → `main` PR은 관리자 혹은 릴리즈 담당자만 생성 및 승인 가능
- 직접 push 및 외부 PR 제한
<br/>
<br/>

## 2. 커밋/PR 컨벤션

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

{
"code": ErrorCode.code,
"message": ErrorCode.message,
"data": {...} or {null},
"success": false
}
"code": ErrorCode.code,
"message": ErrorCode.message,
"data": {...} or {null},
"success": false
}
```

<br/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import com.back.domain.studyroom.entity.RoomMember;
import com.back.domain.studyroom.service.RoomService;
import com.back.global.common.dto.RsData;
import com.back.global.security.CurrentUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -27,16 +27,18 @@
import java.util.stream.Collectors;

/**
* - 모든 API는 Authorization 헤더 필요 (JWT 토큰)
* - 현재는 임시로 하드코딩된 사용자 ID 사용
* - JWT 연동@CurrentUser 애노테이션으로 교체 예정
* 스터디 룸 관련 API 컨트롤러
* - JWT 인증 필수 (Spring Security + CurrentUser)
* - Swagger에서 테스트"Authorize" 버튼으로 토큰 입력
*/
@RestController
@RequestMapping("/api/rooms")
@RequiredArgsConstructor
@Tag(name = "Room API", description = "스터디 룸 관련 API")
@SecurityRequirement(name = "Bearer Authentication")
public class RoomController {
private final RoomService roomService;
private final CurrentUser currentUser;

@PostMapping
@Operation(
Expand All @@ -49,10 +51,9 @@ public class RoomController {
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<RoomResponse>> createRoom(
@Valid @RequestBody CreateRoomRequest request,
@RequestHeader("Authorization") String authorization) {
@Valid @RequestBody CreateRoomRequest request) {

Long currentUserId = 1L; // 임시 하드코딩 - JWT 연동 시 @CurrentUser로 교체
Long currentUserId = currentUser.getUserId();

Room room = roomService.createRoom(
request.getTitle(),
Expand Down Expand Up @@ -83,10 +84,9 @@ public ResponseEntity<RsData<RoomResponse>> createRoom(
})
public ResponseEntity<RsData<JoinRoomResponse>> joinRoom(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@RequestBody(required = false) JoinRoomRequest request,
@RequestHeader("Authorization") String authorization) {
@RequestBody(required = false) JoinRoomRequest request) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

String password = null;
if (request != null) {
Expand All @@ -112,10 +112,9 @@ public ResponseEntity<RsData<JoinRoomResponse>> joinRoom(
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<Void>> leaveRoom(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@RequestHeader("Authorization") String authorization) {
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

roomService.leaveRoom(roomId, currentUserId);

Expand Down Expand Up @@ -169,10 +168,9 @@ public ResponseEntity<RsData<Map<String, Object>>> getRooms(
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<RoomDetailResponse>> getRoomDetail(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@RequestHeader("Authorization") String authorization) {
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

Room room = roomService.getRoomDetail(roomId, currentUserId);
List<RoomMember> members = roomService.getRoomMembers(roomId, currentUserId);
Expand All @@ -197,10 +195,9 @@ public ResponseEntity<RsData<RoomDetailResponse>> getRoomDetail(
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<List<MyRoomResponse>>> getMyRooms(
@RequestHeader("Authorization") String authorization) {
public ResponseEntity<RsData<List<MyRoomResponse>>> getMyRooms() {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

List<Room> rooms = roomService.getUserRooms(currentUserId);

Expand Down Expand Up @@ -230,10 +227,9 @@ public ResponseEntity<RsData<List<MyRoomResponse>>> getMyRooms(
})
public ResponseEntity<RsData<Void>> updateRoom(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@Valid @RequestBody UpdateRoomSettingsRequest request,
@RequestHeader("Authorization") String authorization) {
@Valid @RequestBody UpdateRoomSettingsRequest request) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

roomService.updateRoomSettings(
roomId,
Expand Down Expand Up @@ -263,10 +259,9 @@ public ResponseEntity<RsData<Void>> updateRoom(
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<Void>> deleteRoom(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@RequestHeader("Authorization") String authorization) {
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

roomService.terminateRoom(roomId, currentUserId);

Expand All @@ -287,10 +282,9 @@ public ResponseEntity<RsData<Void>> deleteRoom(
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<List<RoomMemberResponse>>> getRoomMembers(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@RequestHeader("Authorization") String authorization) {
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

Long currentUserId = 1L; // 임시 하드코딩
Long currentUserId = currentUser.getUserId();

List<RoomMember> members = roomService.getRoomMembers(roomId, currentUserId);

Expand Down
27 changes: 23 additions & 4 deletions src/main/java/com/back/global/config/SpringDocConfig.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,35 @@
package com.back.global.config;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@OpenAPIDefinition(info = @Info(title = "Catfe API 서버", version = "beta", description = "Catfe API 문서입니다."))
public class SpringDocConfig {

// API 버전별 그룹화
@Bean
public OpenAPI openAPI() {
String securitySchemeName = "Bearer Authentication";

return new OpenAPI()
.info(new Info()
.title("Catfe API 서버")
.version("beta")
.description("Catfe API 문서입니다."))
.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))
.components(new Components()
.addSecuritySchemes(securitySchemeName, new SecurityScheme()
.name(securitySchemeName)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")));
}

@Bean
public GroupedOpenApi groupApiV1() {
return GroupedOpenApi.builder()
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/back/global/security/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
auth -> auth
.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/ws/**").permitAll()
.requestMatchers("/api/rooms/**").permitAll() // 테스트용 임시 허용
.requestMatchers("/api/rooms/*/messages/**").permitAll() //스터디 룸 내에 잡혀있어 있는 채팅 관련 전체 허용
//.requestMatchers("/api/rooms/RoomChatApiControllerTest").permitAll() // 테스트용 임시 허용
.requestMatchers("/","/swagger-ui/**", "/v3/api-docs/**").permitAll() // Swagger 허용
.requestMatchers("/h2-console/**").permitAll() // H2 Console 허용
.anyRequest().authenticated()
Expand Down
Loading