diff --git a/build.gradle b/build.gradle index 8bf1650..43f2611 100644 --- a/build.gradle +++ b/build.gradle @@ -18,11 +18,20 @@ repositories { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + + //swagger + implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.5.0' + testImplementation 'io.projectreactor:reactor-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { diff --git a/src/main/java/com/backend/crame/domain/terms/Terms.java b/src/main/java/com/backend/crame/domain/terms/Terms.java new file mode 100644 index 0000000..e905319 --- /dev/null +++ b/src/main/java/com/backend/crame/domain/terms/Terms.java @@ -0,0 +1,16 @@ +package com.backend.crame.domain.terms; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class Terms { + private boolean termsOfService; + private boolean privacyPolicy; + private boolean marketing; +} diff --git a/src/main/java/com/backend/crame/domain/user/User.java b/src/main/java/com/backend/crame/domain/user/User.java new file mode 100644 index 0000000..270b1bf --- /dev/null +++ b/src/main/java/com/backend/crame/domain/user/User.java @@ -0,0 +1,40 @@ +package com.backend.crame.domain.user; + +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +import com.backend.crame.domain.terms.Terms; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Document(collection = "user") +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User { + @Id + private String user_uuid; + + private String wallet_uuid; + + private String email; + + @Field("terms") + private Terms terms; + + private Boolean subscribe; + + private String select_model; + +} diff --git a/src/main/java/com/backend/crame/global/config/CorsConfig.java b/src/main/java/com/backend/crame/global/config/CorsConfig.java new file mode 100644 index 0000000..62627c5 --- /dev/null +++ b/src/main/java/com/backend/crame/global/config/CorsConfig.java @@ -0,0 +1,4 @@ +package com.backend.crame.global.config; + +public class CorsConfig { +} diff --git a/src/main/java/com/backend/crame/global/config/SecurityConfig.java b/src/main/java/com/backend/crame/global/config/SecurityConfig.java new file mode 100644 index 0000000..4c5310d --- /dev/null +++ b/src/main/java/com/backend/crame/global/config/SecurityConfig.java @@ -0,0 +1,4 @@ +package com.backend.crame.global.config; + +public class SecurityConfig { +} diff --git a/src/main/java/com/backend/crame/global/exception/BaseException.java b/src/main/java/com/backend/crame/global/exception/BaseException.java new file mode 100644 index 0000000..829f6a8 --- /dev/null +++ b/src/main/java/com/backend/crame/global/exception/BaseException.java @@ -0,0 +1,14 @@ +package com.backend.crame.global.exception; + +public class BaseException extends RuntimeException{ + private final ErrorCode errorCode; + + public BaseException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } + + public ErrorCode getErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/com/backend/crame/global/exception/ErrorCode.java b/src/main/java/com/backend/crame/global/exception/ErrorCode.java new file mode 100644 index 0000000..276115f --- /dev/null +++ b/src/main/java/com/backend/crame/global/exception/ErrorCode.java @@ -0,0 +1,21 @@ +package com.backend.crame.global.exception; + +import org.springframework.http.HttpStatus; + +import lombok.Getter; + +@Getter +public enum ErrorCode { + + LOGIN_FAIL(HttpStatus.BAD_REQUEST,"로그인에 오류가 발생하였습니다."), + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"서버에 오류가 발생하였습니다."); + + private final HttpStatus code; + private final String message; + + + ErrorCode(HttpStatus code, String message){ + this.code = code; + this.message = message; + } +} diff --git a/src/main/java/com/backend/crame/global/exception/GlobalExceptionHandler.java b/src/main/java/com/backend/crame/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..598672f --- /dev/null +++ b/src/main/java/com/backend/crame/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,50 @@ +package com.backend.crame.global.exception; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Mono; + +@Component +@Order(-2) +@RequiredArgsConstructor +public class GlobalExceptionHandler implements ErrorWebExceptionHandler { + private final ObjectMapper objectMapper; + + @Override + public Mono handle(ServerWebExchange exchange, Throwable exception) { + ErrorCode errorCode = ErrorCode.INTERNAL_SERVER_ERROR; + Map response = new HashMap<>(); + + if (exception instanceof BaseException baseEx) { + errorCode = baseEx.getErrorCode(); + } + + exchange.getResponse().setStatusCode(errorCode.getCode()); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON); + + response.put("code", errorCode.getCode()); + response.put("message", errorCode.getMessage()); + + + DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory(); + try { + byte[] bytes = objectMapper.writeValueAsBytes(response); + return exchange.getResponse().writeWith(Mono.just(bufferFactory.wrap(bytes))); + } catch (Exception e) { + byte[] fallback = "예외 처리 중 오류가 발생했습니다.".getBytes(StandardCharsets.UTF_8); + return exchange.getResponse().writeWith(Mono.just(bufferFactory.wrap(fallback))); + } + } +} diff --git a/src/main/java/com/backend/crame/global/response/BaseResponse.java b/src/main/java/com/backend/crame/global/response/BaseResponse.java new file mode 100644 index 0000000..18d340e --- /dev/null +++ b/src/main/java/com/backend/crame/global/response/BaseResponse.java @@ -0,0 +1,21 @@ +package com.backend.crame.global.response; + +import org.springframework.http.ResponseEntity; + +import com.backend.crame.global.response.dto.ResponseDto; +import com.backend.crame.global.exception.ErrorCode; +import com.backend.crame.global.response.enums.SuccessCode; + +public class BaseResponse { + + public static ResponseEntity> success(SuccessCode successCode,T data){ + return ResponseEntity.status(successCode.getCode()) + .body(new ResponseDto<>(successCode.getCode(),successCode.getMessage(),data)); + } + + public static ResponseEntity> fail(ErrorCode errorCode){ + return ResponseEntity.status(errorCode.getCode()) + .body(new ResponseDto<>(errorCode.getCode(), errorCode.getMessage(),null)); + } + +} diff --git a/src/main/java/com/backend/crame/global/response/dto/ResponseDto.java b/src/main/java/com/backend/crame/global/response/dto/ResponseDto.java new file mode 100644 index 0000000..337afb7 --- /dev/null +++ b/src/main/java/com/backend/crame/global/response/dto/ResponseDto.java @@ -0,0 +1,10 @@ +package com.backend.crame.global.response.dto; + +import org.springframework.http.HttpStatus; + +public record ResponseDto( + HttpStatus code, + String message, + T result +) { +} diff --git a/src/main/java/com/backend/crame/global/response/enums/SuccessCode.java b/src/main/java/com/backend/crame/global/response/enums/SuccessCode.java new file mode 100644 index 0000000..6afcdeb --- /dev/null +++ b/src/main/java/com/backend/crame/global/response/enums/SuccessCode.java @@ -0,0 +1,20 @@ +package com.backend.crame.global.response.enums; + +import org.springframework.http.HttpStatus; + +import lombok.Getter; + +@Getter +public enum SuccessCode { + LOGIN_SUCCESS(HttpStatus.OK,"로그인에 성공하였습니다."); + + + private final HttpStatus code; + private final String message; + + + SuccessCode(HttpStatus code, String message){ + this.code = code; + this.message = message; + } +}