From aa83932dd9b3779f3518047312f36322e054f228 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Fri, 1 Mar 2024 03:58:10 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20HttpMediaTypeNotAcceptableException?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bagel/controller/ExceptionController.java | 15 +++++++++++++++ .../mjulikelion/bagel/errorcode/ErrorCode.java | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java b/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java index e2a3e76..c38d844 100644 --- a/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java +++ b/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java @@ -1,5 +1,7 @@ package org.mjulikelion.bagel.controller; +import static org.mjulikelion.bagel.errorcode.ErrorCode.HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR; + import lombok.extern.slf4j.Slf4j; import org.mjulikelion.bagel.dto.response.ResponseDto; import org.mjulikelion.bagel.errorcode.ErrorCode; @@ -13,6 +15,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.FieldError; +import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -157,4 +160,16 @@ public ResponseEntity> handleJpaException(JpaException jpaExce log.error("SqlException: {}", message); return new ResponseEntity<>(ResponseDto.res(code, message), HttpStatus.INTERNAL_SERVER_ERROR); } + + //HttpMediaTypeNotAcceptableException + @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) + @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) + public ResponseEntity> handleHttpMediaTypeNotAcceptableException( + HttpMediaTypeNotAcceptableException httpMediaTypeNotAcceptableException) { + ErrorCode errorCode = HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR; + String code = errorCode.getCode(); + String message = errorCode.getMessage() + " : " + httpMediaTypeNotAcceptableException.getMessage(); + log.error("HttpMediaTypeNotAcceptableException: {}", message); + return new ResponseEntity<>(ResponseDto.res(code, message), HttpStatus.NOT_ACCEPTABLE); + } } diff --git a/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java b/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java index aed38fe..5ce7265 100644 --- a/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java +++ b/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java @@ -25,7 +25,9 @@ public enum ErrorCode { INVALID_AGREEMENT_ERROR("4004", "유효하지 않은 동의 항목 입니다."),//유효하지 않은 동의 항목 INVALID_INTRODUCE_MISSING_ERROR("4005", "자기소개 항목이 누락되었습니다."),//자기소개 항목이 누락됨 INVALID_AGREEMENT_MISSING_ERROR("4006", "동의 항목이 누락되었습니다."),//동의 항목이 누락됨 - INVALID_INTRODUCE_LENGTH_ERROR("4007", "자기소개 항목의 길이가 유효하지 않습니다.");//자기소개 항목의 길이가 유효하지 않음 + INVALID_INTRODUCE_LENGTH_ERROR("4007", "자기소개 항목의 길이가 유효하지 않습니다."),//자기소개 항목의 길이가 유효하지 않음 + //415 Unsupported Media Type + HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR("4150", "지원되지 않는 미디어 타입입니다.");//지원되지 않는 미디어 타입(지원되지 않는 Content-Type) private final String code; From ea8d9095319754cab4a14cd8fce45b829c27fc90 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 2 Mar 2024 00:33:14 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20ipv4=EB=A5=BC=20=EC=84=A0=ED=98=B8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 597d226..7d99b82 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ FROM openjdk:17-jdk ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar +ENV JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true" ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-Duser.timezone=Asia/Seoul", "-jar", "app.jar"] \ No newline at end of file From c86f08c03928d7cd1e4c98f411196c1ae5b1636a Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 2 Mar 2024 00:33:57 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20HTTP=20=EB=AF=B8=EB=94=94=EC=96=B4?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java b/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java index 5ce7265..ccd3644 100644 --- a/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java +++ b/src/main/java/org/mjulikelion/bagel/errorcode/ErrorCode.java @@ -26,8 +26,9 @@ public enum ErrorCode { INVALID_INTRODUCE_MISSING_ERROR("4005", "자기소개 항목이 누락되었습니다."),//자기소개 항목이 누락됨 INVALID_AGREEMENT_MISSING_ERROR("4006", "동의 항목이 누락되었습니다."),//동의 항목이 누락됨 INVALID_INTRODUCE_LENGTH_ERROR("4007", "자기소개 항목의 길이가 유효하지 않습니다."),//자기소개 항목의 길이가 유효하지 않음 - //415 Unsupported Media Type - HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR("4150", "지원되지 않는 미디어 타입입니다.");//지원되지 않는 미디어 타입(지원되지 않는 Content-Type) + //미디어 타입 오류들 + HTTP_MEDIA_TYPE_NOT_ACCEPTABLE_ERROR("4060", "지원하지 않는 미디어 타입입니다."),//지원하지 않는 미디어 타입 + HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR("4150", "수락할 수 없는 미디어 타입입니다.");//지원하지 않는 미디어 타입 private final String code; From 8c04ac82a6ca54e8fee291f5f14d2ff33a07bca0 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 2 Mar 2024 00:34:18 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20HTTP=20=EB=AF=B8=EB=94=94=EC=96=B4?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20Exception=20=ED=95=B8=EB=93=A4=EB=9F=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bagel/controller/ExceptionController.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java b/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java index c38d844..ba884a6 100644 --- a/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java +++ b/src/main/java/org/mjulikelion/bagel/controller/ExceptionController.java @@ -1,5 +1,6 @@ package org.mjulikelion.bagel.controller; +import static org.mjulikelion.bagel.errorcode.ErrorCode.HTTP_MEDIA_TYPE_NOT_ACCEPTABLE_ERROR; import static org.mjulikelion.bagel.errorcode.ErrorCode.HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR; import lombok.extern.slf4j.Slf4j; @@ -16,6 +17,7 @@ import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotAcceptableException; +import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -166,10 +168,22 @@ public ResponseEntity> handleJpaException(JpaException jpaExce @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public ResponseEntity> handleHttpMediaTypeNotAcceptableException( HttpMediaTypeNotAcceptableException httpMediaTypeNotAcceptableException) { - ErrorCode errorCode = HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR; + ErrorCode errorCode = HTTP_MEDIA_TYPE_NOT_ACCEPTABLE_ERROR; String code = errorCode.getCode(); String message = errorCode.getMessage() + " : " + httpMediaTypeNotAcceptableException.getMessage(); log.error("HttpMediaTypeNotAcceptableException: {}", message); return new ResponseEntity<>(ResponseDto.res(code, message), HttpStatus.NOT_ACCEPTABLE); } + + //HttpMediaTypeNotSupportedException + @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public ResponseEntity> handleHttpMediaTypeNotSupportedException( + org.springframework.web.HttpMediaTypeNotSupportedException httpMediaTypeNotSupportedException) { + ErrorCode errorCode = HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR; + String code = errorCode.getCode(); + String message = errorCode.getMessage() + " : " + httpMediaTypeNotSupportedException.getMessage(); + log.error("HttpMediaTypeNotSupportedException: {}", message); + return new ResponseEntity<>(ResponseDto.res(code, message), HttpStatus.UNSUPPORTED_MEDIA_TYPE); + } } From fd75ec3da24b0cc18ec3561e676047608bcbe360 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 2 Mar 2024 00:34:39 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EB=A1=9C=EA=B7=B8=20=EB=82=A8=EA=B8=B0=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mjulikelion/bagel/config/WebConfig.java | 15 ++++ .../interceptor/CustomLoggingInterceptor.java | 80 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/org/mjulikelion/bagel/config/WebConfig.java create mode 100644 src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java diff --git a/src/main/java/org/mjulikelion/bagel/config/WebConfig.java b/src/main/java/org/mjulikelion/bagel/config/WebConfig.java new file mode 100644 index 0000000..9ef7da6 --- /dev/null +++ b/src/main/java/org/mjulikelion/bagel/config/WebConfig.java @@ -0,0 +1,15 @@ +package org.mjulikelion.bagel.config; + +import org.mjulikelion.bagel.interceptor.CustomLoggingInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new CustomLoggingInterceptor()); + } +} diff --git a/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java b/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java new file mode 100644 index 0000000..fd96198 --- /dev/null +++ b/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java @@ -0,0 +1,80 @@ +package org.mjulikelion.bagel.interceptor; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.net.Inet4Address; +import java.net.UnknownHostException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.HandlerInterceptor; + +@Slf4j +public class CustomLoggingInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + String ipAddress = getClientIP(request); + String method = request.getMethod(); + String uri = request.getRequestURI(); + + log.info("----- {} {} {} -----", ipAddress, method, uri); + + // 추가적인 로깅 + logUserAgent(request); + logQueryString(request); + logRequestHeaders(request); + + log.info("----- Request end -----"); + + return true; + } + + private String getClientIP(HttpServletRequest request) throws UnknownHostException { + String ip = request.getHeader("X-Forwarded-For"); + + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {` + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-RealIP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("REMOTE_ADDR"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + log.info(String.valueOf(Inet4Address.getByName(ip))); + + return ip; + } + + private void logUserAgent(HttpServletRequest request) { + String userAgent = request.getHeader("User-Agent"); + log.info("User-Agent: {}", userAgent); + } + + private void logQueryString(HttpServletRequest request) { + String queryString = request.getQueryString(); + log.info("Query String: {}", queryString); + } + + private void logRequestHeaders(HttpServletRequest request) { + String contentType = request.getHeader("Content-Type"); + String userAgent = request.getHeader("User-Agent"); + log.info("Content-Type: {}", contentType); + log.info("User-Agent: {}", userAgent); + } +} + From 1bca3645bcfe7ca4b384a33117422cb34cda76b4 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sat, 2 Mar 2024 01:56:50 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=EB=AC=B8=EB=B2=95=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20-=20#95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java b/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java index fd96198..f744a03 100644 --- a/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java +++ b/src/main/java/org/mjulikelion/bagel/interceptor/CustomLoggingInterceptor.java @@ -37,7 +37,7 @@ private String getClientIP(HttpServletRequest request) throws UnknownHostExcepti if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } - if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {` + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {