diff --git a/cakey-api/src/main/java/com/cakey/common/response/ApiResponseUtil.java b/cakey-api/src/main/java/com/cakey/common/response/ApiResponseUtil.java new file mode 100644 index 0000000..d1fb016 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/common/response/ApiResponseUtil.java @@ -0,0 +1,29 @@ +package com.cakey.common.response; + +import com.cakey.ApiCode; +import com.cakey.exception.ErrorCode; +import org.springframework.http.ResponseEntity; + +public class ApiResponseUtil { + public static ResponseEntity> success(final SuccessCode successCode) { + return org.springframework.http.ResponseEntity.status(successCode.getHttpStatus()) + .body(BaseResponse.of(successCode)); + } + + public static ResponseEntity> success(final SuccessCode successCode, final T data) { + return ResponseEntity.status(successCode.getHttpStatus()) + .body(BaseResponse.of(successCode, data)); + } + + public static ResponseEntity> failure(final ErrorCode errorCode) { + return ResponseEntity.status(errorCode.getHttpStatus()) + .body(BaseResponse.of(errorCode)); + } + + //따로 error message 넣어줄 때, 사용 + public static ResponseEntity> failure(final ErrorCode errorCode, final String message) { + return ResponseEntity + .status(errorCode.getHttpStatus()) + .body(BaseResponse.of(errorCode.getCode(), message)); + } +} diff --git a/cakey-api/src/main/java/com/cakey/common/response/BaseResponse.java b/cakey-api/src/main/java/com/cakey/common/response/BaseResponse.java new file mode 100644 index 0000000..4b50558 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/common/response/BaseResponse.java @@ -0,0 +1,43 @@ +package com.cakey.common.response; + +import com.cakey.ApiCode; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = lombok.AccessLevel.PRIVATE) +@AllArgsConstructor(access = lombok.AccessLevel.PRIVATE) +@Builder(access = lombok.AccessLevel.PRIVATE) +public class BaseResponse { + private int code; + private String message; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private T data; + + public static BaseResponse of(final ApiCode apiMessage) { + return BaseResponse.builder() + .code(apiMessage.getCode()) + .message(apiMessage.getMessage()) + .build(); + } + + public static BaseResponse of(SuccessCode successCode, T data) { + return BaseResponse.builder() + .code(successCode.getCode()) + .message(successCode.getMessage()) + .data(data) + .build(); + } + + //error 메시지 따로 넣어줄 때, 사용 + public static BaseResponse of(final int code, final String message) { + return BaseResponse.builder() + .code(code) + .message(message) + .build(); + } +} diff --git a/cakey-api/src/main/java/com/cakey/common/response/SuccessCode.java b/cakey-api/src/main/java/com/cakey/common/response/SuccessCode.java new file mode 100644 index 0000000..3767153 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/common/response/SuccessCode.java @@ -0,0 +1,40 @@ +package com.cakey.common.response; + +import com.cakey.ApiCode; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +public enum SuccessCode implements ApiCode { + /** + * 200 OK + */ + OK(HttpStatus.OK, 20000, "요청이 성공했습니다."), + + /** + * 201 Created + */ + CREATED(HttpStatus.CREATED, 200100, "요청이 성공했습니다."); + + private final HttpStatus httpStatus; + private final int code; + private final String message; + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public int getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/cakey-api/src/main/java/com/cakey/controller/.gitkeep b/cakey-api/src/main/java/com/cakey/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/dto/.gitkeep b/cakey-api/src/main/java/com/cakey/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java b/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..db555bb --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java @@ -0,0 +1,7 @@ +package com.cakey.exception.handler; + +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { +} diff --git a/cakey-api/src/main/java/com/cakey/exception/user/.gitkeep b/cakey-api/src/main/java/com/cakey/exception/user/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/facade/.gitkeep b/cakey-api/src/main/java/com/cakey/facade/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/user/controller/.gitkeep b/cakey-api/src/main/java/com/cakey/user/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/user/dto/.gitkeep b/cakey-api/src/main/java/com/cakey/user/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-api/src/main/java/com/cakey/user/exception/UserApiException.java b/cakey-api/src/main/java/com/cakey/user/exception/UserApiException.java new file mode 100644 index 0000000..454615a --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/user/exception/UserApiException.java @@ -0,0 +1,6 @@ +package com.cakey.user.exception; + +import com.cakey.exception.UserBaseException; + +public class UserApiException extends UserBaseException { +} diff --git a/cakey-api/src/main/java/com/cakey/user/exception/UserErrorCode.java b/cakey-api/src/main/java/com/cakey/user/exception/UserErrorCode.java new file mode 100644 index 0000000..29e2072 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/user/exception/UserErrorCode.java @@ -0,0 +1,23 @@ +package com.cakey.user.exception; + +import com.cakey.ApiCode; +import org.springframework.http.HttpStatus; + +public enum UserErrorCode implements ApiCode { + ; + + @Override + public HttpStatus getHttpStatus() { + return null; + } + + @Override + public int getCode() { + return 0; + } + + @Override + public String getMessage() { + return ""; + } +} diff --git a/cakey-api/src/main/java/com/cakey/user/facade/.gitkeep b/cakey-api/src/main/java/com/cakey/user/facade/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-common/src/main/java/com/cakey/ApiCode.java b/cakey-common/src/main/java/com/cakey/ApiCode.java new file mode 100644 index 0000000..8dfea99 --- /dev/null +++ b/cakey-common/src/main/java/com/cakey/ApiCode.java @@ -0,0 +1,9 @@ +package com.cakey; + +import org.springframework.http.HttpStatus; + +public interface ApiCode { + HttpStatus getHttpStatus(); + int getCode(); + String getMessage(); +} diff --git a/cakey-common/src/main/java/com/cakey/Main.java b/cakey-common/src/main/java/com/cakey/Main.java deleted file mode 100644 index 4a3a482..0000000 --- a/cakey-common/src/main/java/com/cakey/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cakey; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/cakey-common/src/main/java/com/cakey/exception/CakeyException.java b/cakey-common/src/main/java/com/cakey/exception/CakeyException.java new file mode 100644 index 0000000..44a4e51 --- /dev/null +++ b/cakey-common/src/main/java/com/cakey/exception/CakeyException.java @@ -0,0 +1,5 @@ +package com.cakey.exception; + +public class CakeyException extends RuntimeException { + +} diff --git a/cakey-common/src/main/java/com/cakey/exception/ErrorCode.java b/cakey-common/src/main/java/com/cakey/exception/ErrorCode.java new file mode 100644 index 0000000..a848415 --- /dev/null +++ b/cakey-common/src/main/java/com/cakey/exception/ErrorCode.java @@ -0,0 +1,73 @@ +package com.cakey.exception; + +import com.cakey.ApiCode; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public enum ErrorCode implements ApiCode { + /** + * 400 Bad Request + */ + BAD_REQUEST(HttpStatus.BAD_REQUEST, 40000, "잘못된 요청입니다."), + BAD_REQUEST_REQUEST_BODY_VALID(HttpStatus.BAD_REQUEST, 40001, "request body 검증 실패입니다."), + BAD_REQUEST_REQUEST_PARAM_MODELATTRI(HttpStatus.BAD_REQUEST, 40002, "request param 혹은 modelattribute 검증 실패입니다."), + BAD_REQUEST_MISSING_PARAM(HttpStatus.BAD_REQUEST, 40003, "필수 param이 없습니다."), + BAD_REQUEST_METHOD_ARGUMENT_TYPE(HttpStatus.BAD_REQUEST, 40004, "메서드 인자타입이 잘못되었습니다."), + BAD_REQUEST_NOT_READABLE(HttpStatus.BAD_REQUEST, 40005, "json 오류 혹은 reqeust body 필드 오류 입니다."), + + /** + * 401 Unauthorized + */ + UNAUTHORIZED(HttpStatus.UNAUTHORIZED, 40100, "리소스 접근 인증 권한이 없습니다."), + + /** + * 403 Forbidden + */ + FORBIDDEN(HttpStatus.FORBIDDEN, 40300, "리소스 접근 인가 권한이 없습니다."), + + /** + * 404 Not Found + */ + NOT_FOUND_ENTITY(HttpStatus.NOT_FOUND, 40400, "대상을 찾을 수 없습니다."), + NOT_FOUND_API(HttpStatus.NOT_FOUND, 40401, "잘못된 API입니다."), + + /** + * 405 Method Not Allowed + */ + METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, 40500, "잘못된 HTTP method 요청입니다."), + + /** + * 409 Conflict + */ + CONFLICT(HttpStatus.CONFLICT, 40900, "이미 존재하는 리소스입니다."), + INTEGRITY_CONFLICT(HttpStatus.CONFLICT, 40901, "데이터 무결성 위반입니다."), + + /** + * 500 Internal Server Error + */ + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 50000, "서버 내부 오류입니다."); + + private final HttpStatus httpStatus; + private final int code; + private final String message; + + @Override + public HttpStatus getHttpStatus() { + return httpStatus; + } + + @Override + public int getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} + diff --git a/cakey-common/src/main/java/com/cakey/exception/UserBaseException.java b/cakey-common/src/main/java/com/cakey/exception/UserBaseException.java new file mode 100644 index 0000000..281ec79 --- /dev/null +++ b/cakey-common/src/main/java/com/cakey/exception/UserBaseException.java @@ -0,0 +1,5 @@ +package com.cakey.exception; + +public class UserBaseException extends CakeyException { + +} diff --git a/cakey-domain/build.gradle b/cakey-domain/build.gradle index 2da0965..a1367e7 100644 --- a/cakey-domain/build.gradle +++ b/cakey-domain/build.gradle @@ -5,4 +5,7 @@ dependencies { implementation project(':cakey-common') // 공통 모듈 의존성 implementation project(':cakey-auth') // 인증 모듈 의존성 implementation project(':cakey-external') // 외부 모듈 의존성 + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + } diff --git a/cakey-domain/src/main/java/com/cakey/Main.java b/cakey-domain/src/main/java/com/cakey/Main.java deleted file mode 100644 index 4a3a482..0000000 --- a/cakey-domain/src/main/java/com/cakey/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cakey; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/cakey-domain/src/main/java/com/cakey/common/BaseTimeEntity.java b/cakey-domain/src/main/java/com/cakey/common/BaseTimeEntity.java new file mode 100644 index 0000000..79adbb5 --- /dev/null +++ b/cakey-domain/src/main/java/com/cakey/common/BaseTimeEntity.java @@ -0,0 +1,19 @@ +package com.cakey.common; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Getter +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +public abstract class BaseTimeEntity { + @Column(updatable = false) + @CreatedDate + private LocalDateTime createdDate; +} diff --git a/cakey-domain/src/main/java/com/cakey/common/JpaAuditingConfig.java b/cakey-domain/src/main/java/com/cakey/common/JpaAuditingConfig.java new file mode 100644 index 0000000..d2efee6 --- /dev/null +++ b/cakey-domain/src/main/java/com/cakey/common/JpaAuditingConfig.java @@ -0,0 +1,9 @@ +package com.cakey.common; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { +} diff --git a/cakey-domain/src/main/java/com/cakey/user/domain/.gitkeep b/cakey-domain/src/main/java/com/cakey/user/domain/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-domain/src/main/java/com/cakey/user/exception/UserDomainException.java b/cakey-domain/src/main/java/com/cakey/user/exception/UserDomainException.java new file mode 100644 index 0000000..050c562 --- /dev/null +++ b/cakey-domain/src/main/java/com/cakey/user/exception/UserDomainException.java @@ -0,0 +1,6 @@ +package com.cakey.user.exception; + +import com.cakey.exception.UserBaseException; + +public class UserDomainException extends UserBaseException { +} diff --git a/cakey-domain/src/main/java/com/cakey/user/repository/.gitkeep b/cakey-domain/src/main/java/com/cakey/user/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-domain/src/main/java/com/cakey/user/service/.gitkeep b/cakey-domain/src/main/java/com/cakey/user/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cakey-external/src/main/java/com/cakey/Main.java b/cakey-external/src/main/java/com/cakey/Main.java deleted file mode 100644 index 4a3a482..0000000 --- a/cakey-external/src/main/java/com/cakey/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cakey; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/cakey-external/src/main/java/com/cakey/aws/.gitkeep b/cakey-external/src/main/java/com/cakey/aws/.gitkeep new file mode 100644 index 0000000..e69de29