인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

창신동 장첸님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

문제점 해결하기

키생성 방식에 따른 성능

작성

·

63

·

수정됨

0

안녕하세요.

문제점 해결하기 강의에서 실습을 잘 진행했습니다.

실험을 하며 결과를 관측하던 중,

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor
@Entity
public class Coupon {

    @Id @GeneratedValue
    private Long id;

}

위와 같이 @GeneratedValue를 적용하면

로그패턴도 달라지고 성능이 급격하게 나빠지더라고요

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)

로 지정하면 실습이 잘 진행됩니다.

왜 이런차이가 발생하는지 알 수 있을까요?

strategy를 선택하지 않으면 AUTO이며 이는 mysql에서 IDENTITY를 선택한 것과 같게 나와야하는데 예상과 달라 질문드려봅니다.

 

image.pngimage.png

 

답변 2

0

창신동 장첸님의 프로필 이미지

JPA Dialect를 설정하지 않으면 어떤 DBMS가 연결됐는지 알 수 없습니다. 따라서, strategy를 명시하지 않으면 AUTO이긴 하나 최종적으로 SEQUENCE로 동작을 한다네요.


그런데 시퀀스생성방식은 다량의 쓰레드가 동시 트랜잭션을 발생시킬 때 DB에게 '동시에' 시퀀스값을 내놓으라는 시장바닥과 같은 상황이 벌어지므로 DB에서 동기화된 시퀀스를 생성하는데 부하가 걸려서 느려지는게 아닌가 생각됩니다.

 

실제로 로그를 관찰하면 32개씩 쓰레드가 경합만 하다가 TIMEOUT이 걸러 MySQL에 INSERT하는 작업을 포기해버리는 현상을 총 쓰레드의 레디스 increase횟수가 100건을 충족할 때까지 계속 반복합니다.

 

결국 경합만 하다가 10건 밖에 mysql기록을 못하고 나머지 90건에 대해서는 mysql에 데이터를 저장못하고 유실되는 결과를 초래합니다.

최상용님의 프로필 이미지
최상용
지식공유자

창신동 장첸님 공유해주셔서 감사합니다 😄

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 창신동 장첸님!

@GeneratedValue의 전략 설정에 따라 성능 차이가 나는 이유에 대해 설명 드리겠습니다.

@GeneratedValue는 엔티티의 기본 키 값을 자동으로 생성하기 위한 전략을 정의합니다. 이 전략은 데이터베이스의 기초 아키텍처에 영향을 미치며, 성능에 차이를 가져올 수 있습니다.

  1. AUTO 전략: JPA 구현체가 데이터베이스 벤더에 맞게 적절한 전략을 선택합니다. MySQL에서는 일반적으로 IDENTITY 전략을 사용하지만, 이를 강제로 적용하지 않으면 JPA 구현체에 따라 다른 전략이 사용될 수 있습니다. 특히, 하이버네이트 같은 경우 시퀀스를 에뮬레이션하거나 테이블 전략을 사용할 수 있는데 이 경우 추가 쿼리를 실행하여 성능이 저하됩니다.

  2. IDENTITY 전략: 데이터베이스 자체에서 자동으로 주키를 생성하도록 하는 방식입니다. MySQL의 경우에는 주로 이것을 사용하며, 자연스럽게 데이터베이스 레벨의 최적화가 이루어져 상대적으로 성능이 좋습니다. IDENTITY를 명시적으로 설정하면 이러한 최적화 혜택을 명확하게 받을 수 있습니다.

  3. 테이블 전략: 하이버네이트 등의 JPA 제공자가 테이블을 따로 만들어서 키를 관리하게 하는 방식입니다. 이 경우 INSERT 쿼리뿐 아니라, 키 값을 가져오기 위해 추가적인 SELECT 쿼리를 요구할 수 있어 성능이 떨어질 수 있습니다.

추가적으로, 성능 측면에서 IDENTITY 전략을 사용할 때와 AUTO를 사용할 때의 차이로 인해 테스트 결과가 달라보이는 부분에 대해 설명 드립니다. IDENTITY 전략은 보통 빠르고, AUTO는 설정에 따라 느릴 수 있습니다.

시험 중에는 가능한 모든 부분이 의도한대로 동작하는지 확인할 수 있도록, 데이터베이스 연결 설정과 기타 환경 설정을 정확히 검토해야 합니다.


이와 관련하여 이슈의 원인과 해결 방법에 대해 찾아볼 수 있는 게시물이 있습니다. 참고하시기 바랍니다.

저는 질문자님의 이해를 돕기 위해 기존의 지식공유자님의 답변을 참고하여 유사한 답변 링크를 제공하고 있습니다. 이번 베타 기능은 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금하신 점이 있으면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.