From 33e4a4fda4f37739bfe374f84c8204c506d5dd16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Mon, 8 Dec 2025 12:14:03 +0900 Subject: [PATCH 1/9] chore: add APP_ADMIN_EMAIL to deploy configuration --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0cb68650..673c53b9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -37,6 +37,7 @@ jobs: USER_APIKEY=${{ secrets.USER_APIKEY }} SSL_PASSWORD=${{ secrets.SSL_PASSWORD }} EC2_PORT=${{ secrets.EC2_PORT }} + APP_ADMIN_EMAIL=${{ secrets.APP_ADMIN_EMAIL }} ENV_EOF - name: Build with Gradle From 0d82310fd3ec710c92ece3da6703c8e44a686438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Mon, 8 Dec 2025 12:24:58 +0900 Subject: [PATCH 2/9] chore: remove admin email configuration from application-dev.yml --- src/main/resources/application-dev.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e29924ef..337c8b84 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -31,11 +31,6 @@ spring: starttls.enable: true ssl.trust: smtp.gmail.com - - app: - admin: - email: ${app.admin.email} - server: port: 8080 From aaf8e7e56c7c5505b6c241a8a1e0f328978360c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Mon, 8 Dec 2025 12:31:02 +0900 Subject: [PATCH 3/9] chore: update deploy script to preserve environment variables during Spring Boot launch --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 673c53b9..c41d0a25 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -108,7 +108,7 @@ jobs: # 5️⃣ Start Spring Boot on HTTPS port echo "=== Launching Spring Boot on port $EC2_PORT ===" - nohup sudo java -jar -Dspring.profiles.active=prod $JAR_PATH > /home/ubuntu/app.log 2>&1 & + nohup sudo -E java -jar -Dspring.profiles.active=prod $JAR_PATH > /home/ubuntu/app.log 2>&1 & sleep 5 From 37d7a56a2fc220a370718860360133c963f27b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Mon, 8 Dec 2025 23:15:49 +0900 Subject: [PATCH 4/9] fix: error logging --- .../oneclass/global/exception/GlobalExceptionHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java b/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java index cbdc528d..3a324f2d 100644 --- a/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package oneclass.oneclass.global.exception; +import lombok.extern.slf4j.Slf4j; import oneclass.oneclass.domain.attendance.entity.AttendanceStatus; import oneclass.oneclass.domain.attendance.error.AttendanceError; import oneclass.oneclass.global.dto.ApiResponse; @@ -13,12 +14,14 @@ import java.util.stream.Collectors; +@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { // CustomException 처리 @ExceptionHandler(CustomException.class) public ResponseEntity> handleCustomException(CustomException e) { + log.warn("CustomException: {} - {}", e.getStatus(), e.getMessage()); return ResponseEntity.status(e.getStatus()) .body(ApiResponse.error(e)); } @@ -32,6 +35,8 @@ public ResponseEntity> handleValidationExceptions(MethodArgume .map(FieldError::getDefaultMessage) .collect(Collectors.joining(", ")); + log.info("Validation Error: {}", errors); // 간단한 정보 로그 + CustomException customException = new CustomException(CommonError.INVALID_INPUT_VALUE, errors); @@ -43,6 +48,7 @@ public ResponseEntity> handleValidationExceptions(MethodArgume // Enum 타입 불일치 등 @RequestParam / @PathVariable 타입 오류 처리 @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { + log.info("Type Mismatch: {}", ex.getValue()); // 정보 로그 if (ex.getRequiredType() == AttendanceStatus.class) { CustomException customException = new CustomException(AttendanceError.INVALID_STATUS, ex.getValue() + "는 올바른 출석 상태가 아닙니다."); @@ -64,6 +70,7 @@ public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMi // 그 외 모든 예외 처리 @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception e) { + log.error("🚨 Unhandled Exception occurred: ", e); ErrorResponse errorResponse = new ErrorResponse( "INTERNAL_SERVER_ERROR", HttpStatus.INTERNAL_SERVER_ERROR.value(), From bb12ed4d50b23dd4a797b2ef5c87f6a897160e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Mon, 8 Dec 2025 23:33:49 +0900 Subject: [PATCH 5/9] fix: error logging --- .../java/oneclass/oneclass/global/exception/CommonError.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/oneclass/oneclass/global/exception/CommonError.java b/src/main/java/oneclass/oneclass/global/exception/CommonError.java index f7fd3888..844361d8 100644 --- a/src/main/java/oneclass/oneclass/global/exception/CommonError.java +++ b/src/main/java/oneclass/oneclass/global/exception/CommonError.java @@ -6,7 +6,7 @@ @Getter @RequiredArgsConstructor public enum CommonError implements CustomError { - INVALID_INPUT_VALUE(400, "유효하지 않은 입력입니다."); + INVALID_INPUT_VALUE(400, "유효하지 않은 입력입니다. %s"); private final int status; private final String message; From b0cead0418a373c95d6bf160b7159214d9b036f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Tue, 9 Dec 2025 11:01:16 +0900 Subject: [PATCH 6/9] =?UTF-8?q?fix:=20=EA=B8=B4=EA=B8=89=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20email=20=EB=B9=88=EC=B9=B8=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/oneclass/oneclass/domain/member/entity/Member.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/oneclass/oneclass/domain/member/entity/Member.java b/src/main/java/oneclass/oneclass/domain/member/entity/Member.java index 536faf4d..1fe0a275 100644 --- a/src/main/java/oneclass/oneclass/domain/member/entity/Member.java +++ b/src/main/java/oneclass/oneclass/domain/member/entity/Member.java @@ -30,8 +30,7 @@ public class Member { @NotBlank private String username; - @Column(nullable = false, length = 100) - @NotBlank + @Column(length = 100) private String email; @JsonIgnore From 57bce9551a28c9d0abfa488b40a6bb5cdbffef3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Tue, 9 Dec 2025 11:10:53 +0900 Subject: [PATCH 7/9] =?UTF-8?q?chore:=20log=20=EB=8D=AE=EC=96=B4=EC=93=B0?= =?UTF-8?q?=EA=B8=B0=20X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 2 +- .../oneclass/global/exception/GlobalExceptionHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c41d0a25..ad86d7e1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -108,7 +108,7 @@ jobs: # 5️⃣ Start Spring Boot on HTTPS port echo "=== Launching Spring Boot on port $EC2_PORT ===" - nohup sudo -E java -jar -Dspring.profiles.active=prod $JAR_PATH > /home/ubuntu/app.log 2>&1 & + nohup sudo -E java -jar -Dspring.profiles.active=prod $JAR_PATH >> /home/ubuntu/app.log 2>&1 & sleep 5 diff --git a/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java b/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java index 3a324f2d..622d1d7c 100644 --- a/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/oneclass/oneclass/global/exception/GlobalExceptionHandler.java @@ -70,7 +70,7 @@ public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMi // 그 외 모든 예외 처리 @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception e) { - log.error("🚨 Unhandled Exception occurred: ", e); + log.error("🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 Unhandled Exception occurred: ", e); ErrorResponse errorResponse = new ErrorResponse( "INTERNAL_SERVER_ERROR", HttpStatus.INTERNAL_SERVER_ERROR.value(), From 0f1e62d339c7ccb1f0f9f04e477e135d8ecd59bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Tue, 9 Dec 2025 11:22:06 +0900 Subject: [PATCH 8/9] =?UTF-8?q?chore:=20log=20=EB=8D=AE=EC=96=B4=EC=93=B0?= =?UTF-8?q?=EA=B8=B0=20X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 2 +- src/main/resources/logback-spring.xml | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/logback-spring.xml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ad86d7e1..e4dfc19f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -108,7 +108,7 @@ jobs: # 5️⃣ Start Spring Boot on HTTPS port echo "=== Launching Spring Boot on port $EC2_PORT ===" - nohup sudo -E java -jar -Dspring.profiles.active=prod $JAR_PATH >> /home/ubuntu/app.log 2>&1 & + nohup sudo -E java -jar -Dspring.profiles.active=prod $JAR_PATH > /dev/null 2>> /home/ubuntu/error.log & sleep 5 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..99463d39 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,20 @@ + + + + + + + ${LOG_PATH}/${LOG_FILE_NAME}.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + ${LOG_PATH}/${LOG_FILE_NAME}-%d{yyyy-MM-dd}.log + 30 + + + + + + + \ No newline at end of file From a6039e275f4809afe41f627a42a63affe8ac7d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Tue, 9 Dec 2025 14:39:08 +0900 Subject: [PATCH 9/9] fix: update log pattern to include timezone(Seoul) --- src/main/resources/logback-spring.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 99463d39..24b81908 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -6,7 +6,7 @@ ${LOG_PATH}/${LOG_FILE_NAME}.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS, Asia/Seoul} [%thread] %-5level %logger{36} - %msg%n ${LOG_PATH}/${LOG_FILE_NAME}-%d{yyyy-MM-dd}.log