Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ repositories {
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter-aop")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.wafflestudio.spring2025.common.aop

import com.wafflestudio.spring2025.common.exception.DomainException
import org.aspectj.lang.annotation.AfterThrowing
import org.aspectj.lang.annotation.Aspect
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component

@Aspect
@Component
class LoggingAspect {
private val log = LoggerFactory.getLogger(javaClass)

@AfterThrowing(
pointcut = "within(com.wafflestudio.spring2025.domain..service..*)",
throwing = "ex",
)
fun logException(ex: Throwable) {
if (ex is DomainException && ex.httpErrorCode.is4xxClientError) {
log.warn("Expected domain exception: {}", ex.toString())
} else {
log.error("Unhandled exception in service", ex)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.wafflestudio.spring2025.common.filter

import jakarta.servlet.FilterChain
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.slf4j.MDC
import org.springframework.core.Ordered
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
import org.springframework.web.filter.OncePerRequestFilter
import java.util.UUID

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class RequestIdFilter : OncePerRequestFilter() {
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain,
) {
val requestId = UUID.randomUUID().toString()
MDC.put("requestId", requestId)
response.setHeader("X-Request-Id", requestId)
try {
filterChain.doFilter(request, response)
} finally {
MDC.remove("requestId")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,7 @@ class AuthenticationInterceptor : HandlerInterceptor {
response: HttpServletResponse,
handler: Any,
): Boolean {
logger.info("AuthenticationInterceptor pre-handle")

val handlerMethod = handler as? HandlerMethod ?: return true
logger.info(handlerMethod.toString())

val authRequired =
handlerMethod.hasMethodAnnotation(AuthRequired::class.java) ||
handlerMethod.beanType.isAnnotationPresent(AuthRequired::class.java)
Expand Down
11 changes: 11 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,14 @@ oci:
vault:
secret-ids: ocid1.vaultsecret.oc1.ap-chuncheon-1.amaaaaaat2m5lbqameflpkt7abivvrauqwheybzrkqipf7msv3ol6ikhd3aq
region: ap-chuncheon-1
logging:
level:
org:
springframework:
data:
jdbc: INFO
jdbc:
core:
JdbcTemplate: INFO
namedparam:
NamedParameterJdbcTemplate: INFO
30 changes: 30 additions & 0 deletions src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId:-}] %-5level %logger{36} - %msg%n"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>

<!-- prod 외 (local, dev): 큐가 가득 차도 로그 버리지 않음 -->
<springProfile name="!prod">
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="CONSOLE"/>
</appender>
<logger name="com.wafflestudio.spring2025" level="DEBUG"/>
<root level="INFO"><appender-ref ref="ASYNC"/></root>
</springProfile>

<!-- prod: 큐 80% 이상 시 DEBUG/INFO 버림 (기본값), 앱 코드 INFO -->
<springProfile name="prod">
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="CONSOLE"/>
</appender>
<logger name="com.wafflestudio.spring2025" level="INFO"/>
<root level="WARN"><appender-ref ref="ASYNC"/></root>
</springProfile>
</configuration>
Loading