전체 글
[Spring] 동시성(Concurrency) 이슈 - 그 외(3)
ThreadLocalThreadLocal은 각 스레드마다 고유의 변수를 저장할 수 있게 해주는 클래스입니다.주로 트랜잭션에서 컨텍스트를 유지하는 데 사용됩니다.스프링 프레임워크나 Hibernate 같은 ORM에서는 데이터베이스 트랜잭션이 여러 메서드 호출이나 계층을 넘나드는 동안에도 같은 트랜잭션 상태를 유지해야 합니다.이때 ThreadLocal이 중요한 역할을 합니다. 트랜잭션에 동기화에 관한 클래스를 살펴보면 ThreadLocal로 구현된 것을 확인할 수 있습니다. 자신의 스레드에 고유의 변수를 저장하는 것인데, 왜 동시성 문제가 관련 있을까요?ThreadLocal은 동시성 문제가 발생하지 않도록 "회피"하는 방식입니다.여러 스레드가 사용하는 변수를 사용하지 않도록, 즉, 동시성을 애초에 차단하는 ..
[Spring] 동시성(Concurrency) 이슈 - Database(2)
데이터베이스의 동시성 이슈이제 데이터베이스의 동시성 이슈에 대해 얘기해보겠습니다.데이터베이스의 특징(격리 레벨과 MVCC)우선 흔히 사용하는 RDBMS에서 데이터베이스가 어느 정도까지 동시성을 허용하는지 알 필요가 있습니다.데이터베이스를 사용한다고 모든 동시성 문제를 해결해줄 수 있는게 아니기 때문입니다. 일단 데이터베이스의 동시성 이슈를 이해하기 위해 선행 지식으로 격리 레벨을 알아야 하지만 주제는 동시성 이슈이기 때문에 간단하게 설명하고 넘어 가겠습니다.Read Uncommitted - 커밋되지 않은 업데이트 내역을 읽을 수 있다Read Committed - 커밋된 업데이트 내역을 읽을 수 있다. 다만 하나의 트랜잭션에서 조회를 2번할 때 다른 곳에서 커밋한 값이 조회될 수 있다(Non-Repea..
[Spring] 동시성(Concurrency) 이슈 - 변수(1)
동시성 이슈란?동시성 이슈는 한 가지라고 단정할 수 없습니다.동시성 이슈의 종류의 예는 아래와 같습니다.여러 개의 스레드가 DB를 동시에 수정할 때 생기는 문제여러 개의 스레드가 하나의 변수를 공유해서 생기는 문제(공유하지 않도록 설계하는 방법)하나의 변수를 공유하도록 설계했지만 데이터의 정합성이 깨지는 문제갱신 분실 문제선착순, 조회수, 재고 관리 등 한번에 너무 많은 요청이 예상될 때 DB의 성능으로 인해 지연되다가 트랜잭션이 실패하는 문제 전부 동시성 문제로 간주할 수 있습니다.이제 동시성 이슈에 대해 단계적으로 살펴보도록 하겠습니다.변수에 대한 동시성 이슈 발생 조건변수에서 동시성 이슈가 발견되는 것은 변수가 스레드마다 공유되는 상황에서 발생합니다.주로 다음과 같은 경우에 발생합니다.멀티스레드 ..
[Spring] Web Push API(Push Notification) 구현 방법
모든 소스 코드는 깃헙에 있습니다.Web Push API란?서버에서 클라이언트로 비연결 기반으로 단방향 통신을 가능하게 하는 기술입니다.비연결이라는 것은 WebSocket, SSE처럼 연결한 상태로 사용하는 기술이 아니라는 뜻 입니다.기본 개념을 설명하자면 클라이언트는 VAPID Key를 이용해 서버에 구독 정보를 저장하고 서버는 후에 구독한 클라이언트에게 메시지를 전송하는 과정으로 동작합니다.VAPID의 뜻을 풀어보면 "자발적 애플리케이션 서버 식별(Voluntary Application Server Identification)"즉, 서버가 브라우저에게 자발적으로 자신을 인증하는 방법을 말합니다. Web Push API는 푸쉬 알림(Push Notification)의 일종이고 가장 많이 사용하는 경우는..