인프런 커뮤니티 질문&답변

rkdals213님의 프로필 이미지
rkdals213

작성한 질문수

스프링 핵심 원리 - 고급편

JpaRepository 로그 출력이 안됩니다

작성

·

366

0

안녕하세요 

 

강의를 우선 한번 다 듣고 예제를 직접 만들어보면 학습을 하고있는데 다음과같은 문제가 생겼습니다

 

간단한 controller - service - repository 구조의 api를 만들었는데

controller - service 까지는 로그가 잘 찍히는데 레포지토리에서 로그가 찍히지 않았습니다(소스가 코틀린이 죄송합니다..)

@Aspect
@Component
class LogTraceAspect(private val logTrace: LogTrace) {

// @Around("execution(* com.example.logger.app..*(..)) || target(com.example.logger.app.repository.MemberRepository)")
// @Around("execution(* com.example.logger.app..*.*(..))")
@Around("within(com.example.logger.app..*)")
@Throws(Throwable::class)
fun execute(joinPoint: ProceedingJoinPoint): Any {
var status: TraceStatus? = null
return try {
val message = joinPoint.signature.toShortString()
status = logTrace.begin(message)

val result = joinPoint.proceed()

logTrace.end(status)
result
} catch (e: Exception) {
logTrace.exception(status!!, e)
throw e
}
}
}
package com.example.logger.app.repository

import com.example.logger.app.entity.Member
import com.example.logger.app.entity.Team
import com.example.logger.app.redis.TeamDtoPoint
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.repository.CrudRepository

interface TeamRepository : JpaRepository<Team, Long>

interface MemberRepository : JpaRepository<Member, Long>

interface TeamRedisRepository : CrudRepository<TeamDtoPoint, String>

첫번째로 주석처리된 포인트컷처럼 target으로 직접 repository를 지정해주면 로그가 찍히는데 그렇지 않을 경우에는 로그가 찍히지 않았습니다.  (TeamRepository, MemberRepository 둘다)

 

그런데 이상한건 같은 패키지에 있는 redis용 레포지토리인 TeamRedisRepository는 로그가 찍힙니다..

 

제가 어떤 부분을 놓치고 있는 걸까요??

 

전체 소스코드는 https://github.com/rkdals213/logger 여기있습니다

 

답변 1

0

rkdals213님의 프로필 이미지
rkdals213
질문자

일단 원인을 찾았습니다.

 

TeamRepository와 MemberRepository는 JpaRepository를 상속받습니다.  그리고 정의된 함수들은 JpaRepository에 선언되어 있죠

그렇기 때문에 포인트컷으로 TeamRepository와 MemberRepository를 범위에 포함시키더라도 실제로 선언된 함수가 없고 사용한 함수는 JpaRepository에 선언되어 있기 때문에 로그가 찍히지 않던것입니다

또한 TeamRepository나 MemberRepository에 함수를 정의하여 호출하게 된다면 이는 로그에 찍히게 됩니다.

 

JpaRepository에 있는 함수 로그를 찍기위해선 포인트컷으로

execution(* org.springframework.data.jpa.repository.JpaRepository.*(..))

를 추가해주면 됩니다

 

그런데 CrudRepository를 상속받는 TeamRedisRepository 함수는 왜 로그에 찍혔을까요??

스스로 잘 해결하셨네요. 고생하셨습니다:)

rkdals213님의 프로필 이미지
rkdals213

작성한 질문수

질문하기