Skip to content

Commit 4c286c6

Browse files
authored
feat : global exception하고 response 추가 (#4)
* fix : gradle 설정 수정 #3 * feat : BaseResponse 추가 #3 * feat : Exception 추가 #3 * feat : 기타 개발중이던 파일들 추가 #3
1 parent 40b8480 commit 4c286c6

File tree

11 files changed

+209
-0
lines changed

11 files changed

+209
-0
lines changed

build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,20 @@ repositories {
1818
}
1919

2020
dependencies {
21+
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
2122
implementation 'org.springframework.boot:spring-boot-starter-webflux'
2223
testImplementation 'org.springframework.boot:spring-boot-starter-test'
24+
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2325
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
26+
27+
//swagger
28+
implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.5.0'
29+
2430
testImplementation 'io.projectreactor:reactor-test'
2531
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
32+
33+
compileOnly 'org.projectlombok:lombok'
34+
annotationProcessor 'org.projectlombok:lombok'
2635
}
2736

2837
tasks.named('test') {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.backend.crame.domain.terms;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
@Getter
9+
@Setter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class Terms {
13+
private boolean termsOfService;
14+
private boolean privacyPolicy;
15+
private boolean marketing;
16+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.backend.crame.domain.user;
2+
3+
import org.springframework.data.mongodb.core.mapping.Document;
4+
import org.springframework.data.mongodb.core.mapping.Field;
5+
6+
import com.backend.crame.domain.terms.Terms;
7+
8+
import jakarta.persistence.Column;
9+
import jakarta.persistence.Entity;
10+
import jakarta.persistence.GeneratedValue;
11+
import jakarta.persistence.GenerationType;
12+
import jakarta.persistence.Id;
13+
import lombok.AccessLevel;
14+
import lombok.AllArgsConstructor;
15+
import lombok.Builder;
16+
import lombok.Data;
17+
import lombok.Getter;
18+
import lombok.NoArgsConstructor;
19+
20+
@Document(collection = "user")
21+
@Getter
22+
@Builder
23+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
24+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
25+
public class User {
26+
@Id
27+
private String user_uuid;
28+
29+
private String wallet_uuid;
30+
31+
private String email;
32+
33+
@Field("terms")
34+
private Terms terms;
35+
36+
private Boolean subscribe;
37+
38+
private String select_model;
39+
40+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.backend.crame.global.config;
2+
3+
public class CorsConfig {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.backend.crame.global.config;
2+
3+
public class SecurityConfig {
4+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.backend.crame.global.exception;
2+
3+
public class BaseException extends RuntimeException{
4+
private final ErrorCode errorCode;
5+
6+
public BaseException(ErrorCode errorCode) {
7+
super(errorCode.getMessage());
8+
this.errorCode = errorCode;
9+
}
10+
11+
public ErrorCode getErrorCode() {
12+
return errorCode;
13+
}
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.backend.crame.global.exception;
2+
3+
import org.springframework.http.HttpStatus;
4+
5+
import lombok.Getter;
6+
7+
@Getter
8+
public enum ErrorCode {
9+
10+
LOGIN_FAIL(HttpStatus.BAD_REQUEST,"로그인에 오류가 발생하였습니다."),
11+
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"서버에 오류가 발생하였습니다.");
12+
13+
private final HttpStatus code;
14+
private final String message;
15+
16+
17+
ErrorCode(HttpStatus code, String message){
18+
this.code = code;
19+
this.message = message;
20+
}
21+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.backend.crame.global.exception;
2+
3+
import java.nio.charset.StandardCharsets;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
8+
import org.springframework.core.annotation.Order;
9+
import org.springframework.core.io.buffer.DataBufferFactory;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.stereotype.Component;
12+
import org.springframework.web.server.ServerWebExchange;
13+
14+
import com.fasterxml.jackson.databind.ObjectMapper;
15+
16+
import lombok.RequiredArgsConstructor;
17+
import reactor.core.publisher.Mono;
18+
19+
@Component
20+
@Order(-2)
21+
@RequiredArgsConstructor
22+
public class GlobalExceptionHandler implements ErrorWebExceptionHandler {
23+
private final ObjectMapper objectMapper;
24+
25+
@Override
26+
public Mono<Void> handle(ServerWebExchange exchange, Throwable exception) {
27+
ErrorCode errorCode = ErrorCode.INTERNAL_SERVER_ERROR;
28+
Map<String, Object> response = new HashMap<>();
29+
30+
if (exception instanceof BaseException baseEx) {
31+
errorCode = baseEx.getErrorCode();
32+
}
33+
34+
exchange.getResponse().setStatusCode(errorCode.getCode());
35+
exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
36+
37+
response.put("code", errorCode.getCode());
38+
response.put("message", errorCode.getMessage());
39+
40+
41+
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
42+
try {
43+
byte[] bytes = objectMapper.writeValueAsBytes(response);
44+
return exchange.getResponse().writeWith(Mono.just(bufferFactory.wrap(bytes)));
45+
} catch (Exception e) {
46+
byte[] fallback = "예외 처리 중 오류가 발생했습니다.".getBytes(StandardCharsets.UTF_8);
47+
return exchange.getResponse().writeWith(Mono.just(bufferFactory.wrap(fallback)));
48+
}
49+
}
50+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.backend.crame.global.response;
2+
3+
import org.springframework.http.ResponseEntity;
4+
5+
import com.backend.crame.global.response.dto.ResponseDto;
6+
import com.backend.crame.global.exception.ErrorCode;
7+
import com.backend.crame.global.response.enums.SuccessCode;
8+
9+
public class BaseResponse {
10+
11+
public static <T> ResponseEntity<ResponseDto<T>> success(SuccessCode successCode,T data){
12+
return ResponseEntity.status(successCode.getCode())
13+
.body(new ResponseDto<>(successCode.getCode(),successCode.getMessage(),data));
14+
}
15+
16+
public static ResponseEntity<ResponseDto<Void>> fail(ErrorCode errorCode){
17+
return ResponseEntity.status(errorCode.getCode())
18+
.body(new ResponseDto<>(errorCode.getCode(), errorCode.getMessage(),null));
19+
}
20+
21+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.backend.crame.global.response.dto;
2+
3+
import org.springframework.http.HttpStatus;
4+
5+
public record ResponseDto<T>(
6+
HttpStatus code,
7+
String message,
8+
T result
9+
) {
10+
}

0 commit comments

Comments
 (0)