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

작성자 없음

작성자 정보가 삭제된 글입니다.

실전! 스프링 데이터 JPA

Auditing transaction

작성

·

219

0

안녕하세요, auditing 강의를 듣고 적용해보았습니다.

게시글을 처음에 만들때 원하는 값들이 잘 들어가지만

게시글을 수정하여 다시 저장할 경우audit 부분에서 createdBy, modifiedBy 를 못가져오면서 transaction 에러를 냅니다..!

혹시 실무에 적용하기 위해 추가로 적용해야 할 부분이 있을까요?

아마 AuditorAwareImpl에서 @Autowired MemberRepository memberRepository; 부분이 이상한 것 같은데...이유는 모르겠습니다 ㅠ_ㅠ

public class AuditorAwareImpl implements AuditorAware<Long> {

    @Autowired
    MemberRepository memberRepository;

    @Override
    public Optional<LonggetCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (null == authentication || !authentication.isAuthenticated()) {
            return null;
        }
        DefaultOAuth2User principal = (DefaultOAuth2User) authentication.getPrincipal();
        String email = (String) principal.getAttributes().get("email");
        if(email == null ){
            return null;
        }

        Member member = memberRepository.findByEmail(email).orElse(null);
        if(member == null){
            return null;
        }

        return Optional.of(member.getId());
    }
}

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. WON JONGPIL님

어떤 오류가 발생하는지 오류 로그를 남겨주세요.

추가로 오류와 관련된 소스 코드를 최대한 많이 남겨주세요.

감사합니다.

 

안녕하세요!

우선 테스트를 설명하자면 , oAuth2.0 google 로그인을 한 상태이고요,

게시물을 작성하였을 때 audit에 따른 createdBy, modifiedBy 이 제대로 작성 된 것을 확인하였습니다.

수정을 할 경우에 문제가 발생합니다.

수정을 할 경우에도 내용 변경없이 수정을 할 경우 아무 문제 없지만

내용을 변경 한 후 저장을 누르면 다음과 같은 에러가 발생합니다

Hibernate: select post0_.id as id1_1_0_, post0_.created_by as created_2_1_0_, post0_.createdDate as createdd3_1_0_, post0_.last_modified_by as last_mod4_1_0_, post0_.modifiedDate as modified5_1_0_, post0_.content as content6_1_0_, post0_.title as title7_1_0_ from Post post0_ where post0_.id=?
2021-10-05 23:47:32.426 ERROR 24008 --- [nio-8888-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction] with root cause

java.lang.StackOverflowError: null
	at org.springframework.data.jpa.repository.query.JpaQueryMethod.getParameters(JpaQueryMethod.java:410) ~[spring-data-jpa-2.5.5.jar:2.5.5]
	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154) ~[spring-data-jpa-2.5.5.jar:2.5.5]
	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143) ~[spring-data-jpa-2.5.5.jar:2.5.5]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.10.jar:5.3.10]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.10.jar:5.3.10]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.10.jar:5.3.10]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.10.jar:5.3.10]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145) ~[spring-data-jpa-2.5.5.jar:2.5.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.10.jar:5.3.10]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.10.jar:5.3.10]
	at com.sun.proxy.$Proxy187.findByEmail(Unknown Source) ~[na:na]
	at com.example.demo.config.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:30) ~[main/:na]
	at java.base/java.util.Optional.map(Optional.java:265) ~[na:na]
	at org.springframework.data.auditing.AuditingHandler.getAuditor(AuditingHandler.java:109) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.data.auditing.AuditingHandler.markModified(AuditingHandler.java:104) ~[spring-data-commons-2.5.5.jar:2.5.5]
	at org.springframework.data.jpa.domain.support.AuditingEntityListener.touchForUpdate(AuditingEntityListener.java:112) ~[spring-data-jpa-2.5.5.jar:2.5.5]
	at jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source) ~[na:na]

 

관련 된 코드를 https://github.com/JPWon-1/git-audit-test

에 남겨봅니다

양해 바라는 점은, oAuth를 통한 로그인을 하다보니 application-oauth.yml 파일에

id와 password 부분은 따로 첨부를 하진 못하였습니다..

 

이와 관련되어 어떤 방식으로 소스코드를 공유하는게 좋은지 알려주신다면 다음엔 그 방법을 참조하여 질문을 남기도록 하겠습니다

 

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. WON JONGPIL님

링크에 사이트에 접속하니 404가 나옵니다.

추가로 저희가 예제를 직접 실행할 수 있어야 합니다. oauth를 빼고, 가짜 회원 같은 것으로 외부 접속 없이 완전하게 확인해 볼 수 있는 예제를 올려주셔야 도움을 드릴 수 있습니다.

감사합니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기