작성
·
68
0
[질문 내용]
안녕하세요. 강의와 조금 다른 주제일 수 있으나 도움을 얻을 수 있지 않을까 하여 질문 남깁니다!!
토이 프로젝트 진행중 사용자의 최근 접속시간을 주기적으로 업데이트 시킬 필요가 있어 Spring Security 인가 필터에서 현재 로그인한 유저의 최근 접속시간을 업데이트하는 쿼리를 날리도록 작성했습니다. 이 때 Deadlock이 발생하였습니다. 현재까지 제가 찾아본 바로는 DispatcherServelt 전에는 톰캣 스레드가 락을 점유하고 이후에는 IO 스레드가 락을 점유하여 그렇다는 정보를 찾을 수 있었는데요. 정확히 이해가 안가 여기에 여쭤봅니다 ㅠㅠ. 데드락이 발생하는 원인에 어떤것이 있을까요? 참고로 인가 필터에서는 jpa 리포지토리를 의존성 주입받아 사용해서 쿼리를 날렸습니다.
(현재는 이 방법 자체가 데르락을 떠나 비효율적이라 판단하여 AOP로 해결한 상태입니다. 사실 이것도 효율적인 방법인지는 잘 모르겠습니다...)
답변 2
0
안녕하세요. jamsiman11님
죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다.
질문해주신 Deadlock 발생 관련 내용은 제공된 정보 내에서 직접적으로 관련된 내용을 찾을 수 없습니다. 그러나, 프로그래밍 및 데이터베이스 관련 이슈에서 데드락은 여러 요인에 의해 발생할 수 있습니다. 일반적으로 데드락은 두 개 이상의 트랜잭션이 상호간에 필요한 리소스를 점유하고 있어서, 각각의 트랜잭션이 상대방의 작업이 완료될 때까지 무한정 대기하는 상태를 말합니다.
사용자의 최근 접속시간을 업데이트 하는 과정에서 데드락이 발생했다면, 해당 쿼리를 실행하는 동안 동일한 리소스(예: 테이블의 특정 Row)에 대한 경쟁이 존재했을 수 있습니다. 특히, Spring Security 인가 필터와 같이 높은 빈도로 호출되는 로직에서 데이터베이스의 업데이트 쿼리를 실행할 경우, 동시성 제어에 주의가 필요합니다.
AOP를 활용한 해결 방법 또한 상황에 따라 유효할 수 있는데, 이것이 효율적인 방법인지 여부는 해당 로직의 실행 빈도, 데이터베이스의 부하, 구현된 AOP의 로직 처리 방식 등 여러 요소를 종합적으로 고려해 판단해야 합니다.
jamsiman11님의 상황에서는 데드락을 방지하기 위해 데이터베이스 락을 최소화하며, 복수의 트랜잭션이 동일 리소스를 경쟁하는 상황을 피하는 설계를 고려해 보시는 것도 좋을 것입니다. 예를 들어, 최적화된 쿼리, 적절한 트랜잭션 격리 수준 설정, 리소스에 대한 접근 순서 일정화 등이 해당될 수 있겠습니다.
또한, 스프링과 JPA를 사용한다면, 영속성 컨텍스트와 트랜잭션 관리 방법을 점검해보는 것도 중요합니다. 올바른 트랜잭션 경계 설정과 지연 로딩, 쓰기 지연 등의 JPA 기능을 효율적으로 사용하여 데드락의 위험을 줄일 수도 있습니다.