[API 응답 표준화]
This commit is contained in:
103
README.md
103
README.md
@@ -32,7 +32,94 @@ src/main/java/com/bio/bio_backend/
|
||||
└── BioBackendApplication.java
|
||||
```
|
||||
|
||||
### 2. API 문서화 (Swagger)
|
||||
### 2. API 응답 표준화 (CustomApiResponse)
|
||||
|
||||
#### 응답 구조
|
||||
|
||||
모든 API 응답은 `CustomApiResponse<T>` 형태로 표준화되어 있습니다.
|
||||
|
||||
```java
|
||||
public class CustomApiResponse<T> {
|
||||
private int code; // HTTP 상태 코드
|
||||
private String message; // 응답 메시지 (ApiResponseCode enum 값)
|
||||
private String description; // 응답 설명
|
||||
private T data; // 실제 데이터 (제네릭 타입)
|
||||
}
|
||||
```
|
||||
|
||||
#### 응답 예시
|
||||
|
||||
**성공 응답 (201 Created)**
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 201,
|
||||
"message": "COMMON_SUCCESS_CREATED",
|
||||
"description": "Created successfully",
|
||||
"data": {
|
||||
"seq": 1,
|
||||
"userId": "user123",
|
||||
"name": "홍길동"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**실패 응답 (409 Conflict)**
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 409,
|
||||
"message": "USER_ID_DUPLICATE",
|
||||
"description": "User ID already exists",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 사용 방법
|
||||
|
||||
**Controller에서 응답 생성**
|
||||
|
||||
```java
|
||||
@PostMapping("/members")
|
||||
public ResponseEntity<CustomApiResponse<CreateMemberResponseDto>> createMember(@RequestBody CreateMemberRequestDto requestDto) {
|
||||
// ... 비즈니스 로직 ...
|
||||
|
||||
// 성공 응답
|
||||
CustomApiResponse<CreateMemberResponseDto> apiResponse =
|
||||
CustomApiResponse.success(ApiResponseCode.COMMON_SUCCESS_CREATED, responseDto);
|
||||
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(apiResponse);
|
||||
}
|
||||
```
|
||||
|
||||
**공용 응답 코드 사용**
|
||||
|
||||
```java
|
||||
// ApiResponseCode.java
|
||||
public enum ApiResponseCode {
|
||||
// 공용 성공 코드
|
||||
COMMON_SUCCESS_CREATED(HttpStatus.CREATED.value(), "Created successfully"),
|
||||
COMMON_SUCCESS_UPDATED(HttpStatus.OK.value(), "Updated successfully"),
|
||||
COMMON_SUCCESS_DELETED(HttpStatus.OK.value(), "Deleted successfully"),
|
||||
COMMON_SUCCESS_RETRIEVED(HttpStatus.OK.value(), "Retrieved successfully"),
|
||||
|
||||
// 공용 오류 코드
|
||||
COMMON_BAD_REQUEST(HttpStatus.BAD_REQUEST.value(), "Required request body is missing or Error"),
|
||||
COMMON_UNAUTHORIZED(HttpStatus.UNAUTHORIZED.value(), "Unauthorized"),
|
||||
COMMON_FORBIDDEN(HttpStatus.FORBIDDEN.value(), "Access is denied"),
|
||||
COMMON_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "Resource is not found"),
|
||||
COMMON_INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), "An error occurred on the server")
|
||||
}
|
||||
```
|
||||
|
||||
#### 핵심 규칙
|
||||
|
||||
- **모든 API 응답**: `CustomApiResponse<T>`로 감싸서 반환
|
||||
- **공용 응답 코드**: `COMMON_` 접두사로 시작하는 범용 코드 사용
|
||||
- **일관된 구조**: `code`, `message`, `description`, `data` 필드로 표준화
|
||||
- **제네릭 활용**: `<T>`를 통해 다양한 데이터 타입 지원
|
||||
|
||||
### 3. API 문서화 (Swagger)
|
||||
|
||||
#### Swagger UI 접속
|
||||
|
||||
@@ -45,8 +132,12 @@ src/main/java/com/bio/bio_backend/
|
||||
@Tag(name = "Member", description = "회원 관리 API")
|
||||
@Operation(summary = "회원 가입", description = "새로운 회원을 등록합니다.")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "201", description = "회원 가입 성공"),
|
||||
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터")
|
||||
@ApiResponse(responseCode = "201", description = "회원 가입 성공",
|
||||
content = @Content(schema = @Schema(implementation = CustomApiResponse.class))),
|
||||
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터",
|
||||
content = @Content(schema = @Schema(implementation = CustomApiResponse.class))),
|
||||
@ApiResponse(responseCode = "409", description = "중복된 사용자 정보",
|
||||
content = @Content(schema = @Schema(implementation = CustomApiResponse.class)))
|
||||
})
|
||||
```
|
||||
|
||||
@@ -55,7 +146,7 @@ src/main/java/com/bio/bio_backend/
|
||||
- **SwaggerConfig.java**: OpenAPI 기본 정보 설정
|
||||
- **application.properties**: Swagger UI 커스터마이징
|
||||
|
||||
### 3. 트랜잭션 관리
|
||||
### 4. 트랜잭션 관리
|
||||
|
||||
#### 기본 설정
|
||||
|
||||
@@ -79,14 +170,14 @@ public class MemberServiceImpl {
|
||||
- **메서드별**: 데이터 수정 시에만 `@Transactional` 개별 적용
|
||||
- **설정**: `spring.jpa.open-in-view=false` (성능 최적화)
|
||||
|
||||
### 4. 오류 등록 및 사용
|
||||
### 5. 오류 등록 및 사용
|
||||
|
||||
#### 오류 코드 등록
|
||||
|
||||
```java
|
||||
// ApiResponseCode.java
|
||||
public enum ApiResponseCode {
|
||||
USER_ID_DUPLICATE("400", "이미 존재하는 사용자 ID입니다."),
|
||||
USER_ID_DUPLICATE(HttpStatus.CONFLICT.value(), "User ID already exists"),
|
||||
}
|
||||
```
|
||||
|
||||
|
Reference in New Issue
Block a user