inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

트랜잭션 락 질문

399

by.kim

작성한 질문수 1

0

jpa 트랜잭션 락 기능중에 낙관적 락과 비관적 락이 있는데

실제로 이 락을 실무에서도 많이 사용하는지 궁금합니다.

인터넷 예시로 게시글 조회수 카운트나 좋아요 카운트 관리 할 때 많이 사용한다고 하는데

조회수나 좋아요 카운트는 카운트가 실시간으로 정확히 맞을 필요는 없는데 굳이 락을 이용해서 관리를 해야만 하는지 의문점이 들기도 합니다.

실제로 실무에서 많이 사용한다면, 좀 더 실무에 와 닿을 수 있는 케이스를 알려주시면 감사하겠습니다.

 

java spring spring-boot jpa

답변 2

0

김영한

안녕하세요. by.kim님

비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)은 데이터베이스에서 동시성 제어를 위해 사용되는 두 가지 접근 방식입니다. 각각의 락은 상황에 따라 적절하게 사용될 수 있습니다.

  1. 비관적 락(Pessimistic Lock)

  • 비관적 락은 데이터를 읽는 시점에 바로 락을 걸어서 다른 트랜잭션이 해당 데이터를 수정하는 것을 방지합니다.

  • 주로 데이터 수정이 빈번하고 충돌 가능성이 높은 경우에 사용됩니다.

  • 예를 들어, 은행 계좌 시스템에서 계좌 잔액을 업데이트할 때 비관적 락을 사용할 수 있습니다.

  1. 낙관적 락(Optimistic Lock)

  • 낙관적 락은 데이터를 읽는 시점에는 락을 걸지 않고, 업데이트할 때 충돌이 발생했는지 검사합니다.

  • 주로 데이터 수정이 빈번하지 않고 충돌 가능성이 낮은 경우에 사용됩니다.

     

실무에서는 시스템의 요구사항과 특성에 따라 적절한 락 메커니즘을 선택하고 사용해야 합니다. 낙관적 락은 충돌 가능성이 낮은 상황에서 유용하게 사용될 수 있지만, 모든 상황에 적용되는 것은 아닙니다.

참고로 낙관적 락에 대해서 제대로 이해하려면 JPA의 많은 부분을 알아야 합니다.

더 자세한 내용은 JPA 책 16.1 트랜잭션과 락을 참고해주세요.

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

by.kim님의 질문은 JPA에서 제공하는 트랜잭션 락 기능인 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)에 대한 실무적 사용 사례와 필요성에 관한 것으로 보입니다. 질문에서는 특히 인터넷에서 자주 언급되는 조회수나 좋아요 카운트 같은 도메인에서 락을 사용하는 것이 정말 필요한지에 대한 의문을 제기하고 계신 것 같습니다.

관련하여 김영한 강사님의 질문&답변 게시판에 비슷한 내용에 관한 질문이 있어 의견을 참고하시면 도움이 될 것으로 사료됩니다.

“비관적 락 질문드립니다.”
- 이 링크의 질문은 비관적 락에 대해 혼란을 느끼는 수강생에게 김영한 강사님이 설명을 제공한 내용입니다. 강사님은 비관적 락의 실무 사용에 대한 명확한 기준을 제시하지 않았지만, 데이터베이스의 격리 수준에 따라 다른 트랜잭션에서 SELECT FOR UPDATE로 잠긴 행을 읽을 수 있는지를 설명하셨습니다. 이는 비관적 락이 특정 상황에 적합할 수 있음을 시사합니다.

“낙관적인 락”
- 여기에서는 낙관적 락을 사용하는 실무 사례에 대해 궁금해하는 수강생에게 김영한 강사님이 낙관적 락이 해결할 수 있는 문제 상황을 설명하고 있습니다. 낙관적 락은 특정 데이터에 대한 동시 변경을 처리할 때 유용하며, 갱신 분실 문제를 해결하는 데 적합할 수 있음을 설명하고 있습니다.

위 답변들에서 얻을 수 있는 인사이트는 낙관적 락과 비관적 락이 실무에서 모두 사용될 수 있으며, 사용 상황에 따라 각기 다른 유형의 락이 적합할 수 있음을 알 수 있습니다. 예를 들어, 낙관적 락은 충돌 가능성이 적고 성능이 중요한 시나리오에서 유용하며, 비관적 락은 데이터의 일관성과 정합성이 매우 중요하거나 충돌 가능성이 높은 상황에서 고려될 수 있습니다.

추가적으로 질문자님이 언급한 조회수나 좋아요 카운트 같은 기능에서는 데이터의 정확성이 중요도가 낮을 수 있으므로, 성능에 영향을 덜 주는 낙관적 락을 선호할 수 있습니다. 하지만, 은행 계좌 이체와 같이 정확한 데이터 일치가 필요한 경우 비관적 락을 사용할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

by.kim

대부분의 서비스는 데이터의 정합성이 더 중요해서 비관적 락을 더 많이 사용 할 것 같은데
낙관적 락을 사용하는 예시를 좀 더 들어주셨으면 좋겠습니다.

 

0

galid

지나가다가 의견 남겨요~ ( 사견이고, 제 의견이 무조건 맞다고 말씀드리는건 아니에요 )


조회수 같은 경우에 낙관적 락을 사용한다면, 실패하는 경우가 많고, 재요청으로 서버에 부하가 생길 가능성이 있어보여요, (특히 인기글 같은 경우)

때문에 조회수 같은 경우는 락을 이용하기보다, 다른 방법을 이용해서 처리하면 어떨까 생각해봐요

 

낙관적 락의 예시는, 상품 구매를 생각해보시면 어떨까 해요!

강의 관련 외 질문입니다.

0

66

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

90

1

BeanCreationException

0

89

3

Update 후 UpdateMemberResponse 매핑할 때

0

47

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

99

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

82

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

63

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

110

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

85

2

fetch join과 영속화와 OSIV의 관계

0

86

2

Distinct 사용 전 결과에 대한 의문

0

113

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

57

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

78

2

dto 필드 속 엔티티 여부

0

60

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

86

1

DTO 대신 Form 사용은 안되나요?

0

136

1

OSIV ON 상태일 때

0

96

1

fetch join VS fetch join 페이징 궁금증

0

180

2

양방향 연관관계 알아보는 법?

0

105

1

16강 17강 간단 정리 이게 맞을까요 ?

0

165

2