포트폴리오/AutoReview

[트러블 슈팅] 배포 서버 CI 자동화 적용 이후 오류 발생

do_hyuk 2025. 1. 22. 14:07

배포 서버 CI 자동화 적용 이후 오류가 발생했다.AWS EC2 에서 docker에 올라온 log를 확인해보니 IncorrectResultSizeDataAccessException 이 발생한 것을 확인

위의 오류 내용을 보면 쿼리 결과값이 유니크하지 않아서 발생했고, 2개의 결과를 반환했다고 되어있다.

이 오류는 JPA 레포지토리에서 save 메서드를 통해 데이터 저장을 하면서 발생한 예외이다.

 

저장하고자 하는 데이터가 db에 이미 존재를 하고 Unique 값을 포함한 데이터인데 데이터 중복이 발생하여 예외가 발생했다. IncorrectResultSizeDataAccessException 에러는 데이터 조회 시 발생하는 에러인데 왜 저장할 때 문제냐고 한다면

 

// 테스터 생성 코드
Member memberA = Member.builder()
        .email("abc@naver.com")
        .nickname("kim")
        .role(Role.USER)
        .build();

memberRepository.save(memberA);
JwtDto jwtDtoA = loginService.issuedTokenByEmail(memberA.getEmail());
@Transactional
public JwtDto issuedTokenByEmail(String email) throws JsonProcessingException {
    Member member = memberService.saveOrFind(email);
   	...
}


위의 코드는 문제가 발생한 지점이라 생각하는 코드이다. 서버가 실행될 때 테스터를 생성하는 코드인데, 서버 배포할 때 DB에는 이미 존재하는 테스터를 한 번 더 저장하려 했기 때문이고, 이 후에 Member 단일 객체로 조회하려 했기 때문에 발생했다고 생각한다. 


문제해결

기존 코드에서 loginService.issuedTokenByEmail() 메서드만 남기고 memberRepository.save() 메서드를 지워주면 해결될 것으로 보인다.

 

main 브랜치에서 발생한 문제이기 때문에 Git Branch 전략대로 진행해보려고 한다.

Git Branch 전략

 

Git Flow

  1. main 브랜치에서 hotfix 브랜치 생성
  2. 오류 해결 후 hotfix 브랜치dev 브랜치에 merge
  3. 제대로 동작하는지 확인
  4. hotfix 브랜치main 브랜치에 merge

 


ps.

이번 오류같은 경우는 테스터 코드가 존재했기 때문에 배포서버에서는 불필요하다고 판단하여 dev 브랜치에만 적용했고, main 브랜치에는 삭제 후 merge를 했기 때문에 시점이 달라지는 문제가 발생했다. 그 문제는 서브 모듈같은 방식으로 이 후에 해결하겠다.