• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

하나의 요청 트랜잭션에서 여러번의 쿼리를 날렸을 시 성능질문입니다.

21.05.06 16:27 작성 조회수 389

0

@Transactional
@PostMapping("/user/sign-up")
public ResponseEntity<?> test (String mailCode, String smsCode) {

    MailAuth mailAuth = mailAuthRepo.findByCode(mailCode);

    if (mailAuth == null) {
        return falied....
    }

    SmsAuth smsAuth = smsAuthRepo.findByCode(smsCode);

    if (smsAuth == null) {
        return failed...
    }

    userRepo.save(User.builder.username('test').email('test@test').build());
    return success
}

순수 JPA 수업인 해당 수업과 관련이 없는 질문이라 정말 죄송합니다.

하지만 너무 궁금한게 있어서 질문드리네요...

위 코드는 휴대폰 인증과 메일인증을 둘 다 필요로하는 회원가입에 대한 간단한 컨트롤러 코드입니다.

보이는 바와 같이 휴대폰과 이메일에 대해 둘다 인증여부를 확인하기 위해서는 각각의 SmsAuth, EmailAuth 엔티티에 대하여

각각 쿼리를 날려야하는 상황입니다..

하나의 트랜잭션 안이더라도 각각의 쿼리를 날리는 것은 서로 다른 영속성 컨텍스트와 서로 다른 커넥션으로 각자 쿼리를 날리는 것이니

더욱 더 비효율적인가요??

현재 테이블 구조가 이렇게 짜여져있어서 어떻게 조인을 해서 가져올 방법도 없고.. 하나의 회원가입 요청에 대해 이렇게 많은

쿼리를 날리는 것 자체가 성능적으로 보나 너무 많은 비용을 치뤄야 되지 않나싶네요..

한 번의 Servlet Request 에 대해 여러번의 단일 테이블 쿼리를 날리는 것과 한방 조인쿼리로 한번에 해결하는 것중

역시 조인문을 쓰는게 훨씬 낫겠죠??;;;

답변 1

답변을 작성해보세요.

1

안녕하세요. Coinvest님

쿼리수가 줄어들면 아무래도 더 빠르겠지요.

하지만 둘다 code성 조회여서 index를 매우 빠르게 타게 됩니다.

그래서 성능을 최적화해도 크게 이점이 없을 수 있습니다.

우리가 성능 최적화를 고민할 때는, 애플리케이션 전체를 두고 고민해야 합니다.

예를 들어서 join으로 바꾸어서 50ms -> 30ms 정도로 바꾸면 매우 크게 개선한 것 같지만, 이 기능을 자주 사용하는 것도 아니고, 애플리케이션 전체로 보면 주로 목록, 상세 조회 같은 기능이 훨씬 더 많은 트래픽이 발생합니다.

그리고 join으로 최적화를 하게 되면, 이 부분을 캐시 구조로 히트하도록 만드는 것이 어렵습니다. 지금 구조 처럼 단순하면 캐시를 만들기도 쉽지요.

도움이 되셨길 바래요.

Coinvest님의 프로필

Coinvest

질문자

2021.05.07

감사합니다^^. 많은 도움이 되었습니다.