inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

Auditing transaction

256

작성자 없음

작성한 질문수 0

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());
    }
}

audit spring spring-boot JPA java

답변 1

0

김영한

안녕하세요. WON JONGPIL님

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

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

감사합니다.

 

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 부분은 따로 첨부를 하진 못하였습니다..

 

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

 

0

김영한

안녕하세요. WON JONGPIL님

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

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

감사합니다.

changeTeam 메서드 질문

0

34

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

87

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

127

3

MemberRepository 구현체

0

71

1

pdf 표현 질문드립니다.

0

77

1

로그가 남지 않는 문제.

0

98

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

78

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

75

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

102

2

Sort 인터페이스는 잘 사용 안하나요?

0

59

1

스캔대상 질문드립니다.

0

48

1

하이버네이트6에서의 최적화에 이은 질문

0

92

1

save() vs saveAndFlush DB 통신 횟수

0

58

1

순수 JPA 리포지토리 코드 수정부분

0

92

2

bulk연산 후 flush하는 이유를 모르겠어요

0

163

3

bulk insert 질문입니다.

0

191

2

교만했던 것 같아요.

0

152

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

154

2

동적 테이블에 대한 질문

0

89

1

영속성 전이와 연관관계

0

141

2

강의 10:25 질문

0

78

1

단건 update 질문

0

104

2

엔티티 와 도메인의 경계

0

129

1

UsernameOnlyDto 타입 type mismatch 오류

0

123

1