일단 씻고 나가자
24.06.12 본문
2023. 06. 12 수요일
- [Effective Java] 동시성으로 일어날 수 있는 문제? Java 및 Spring에서의 해결법과 설명?
: 동시성이란 같은 자원에 각기 다른 스레드 및 프로세스가 접근하여 자원이 최신화되기 전에 서로 자원을 갱신하여 올바른 로직을 수행하지 못하는 현상으로, 갱신 손실 문제를 유발한다.
Java는 전통적으로 synchronized라는 키워드를 제공한다. 단, 해당 키워드는 성능 문제가 있을 뿐 아니라, 하나의 프로세스 내에서만 동시성을 보장하기에 실무에서의 scale up 된 하나 이상의 서버에서 작동하지 못한다. 또한 Spring에선, sychronized는 메서드 시그니처가 아니기 때문에 Spring의 @Transactional과 함께 사용할 경우 Spring의 프록시 객체의 함수 수행에는 붙지 않으므로 해결할 수 없다.
트랜잭션 격리 수준은 두 개의 프로세스가 동시에 쓰기 작업을 할 땐 적합하지 않다. 따라서 데이터에 직접 Lock을 거는 작업이 필요하고, JPA에서 제공하는 @Lock, 혹은 Redis 제공하는 라이브러리를 활용할 수 있다.