전체

    [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)의 일종이고 가장 많이 사용하는 경우는..

    [Spring] 영속성 프레임워크(JPA, R2DBC)에서 save 2번 진행 시 '생성 시간' 처리 방법

    이번 글에서는 영속성 프레임워크(JPA, R2DBC)에서 save를 두 번 호출할 때 발생할 수 있는 '생성 시간' 처리 이슈와 그 해결 방법을 소개하고자 합니다. 우선은 일반적으로 생각할 수 있는 생성 시간 처리 방법 부터 소개하겠습니다.생성 시간 처리의 일반적인 방법들코드에서 직접 생성 시간 설정가장 간단한 방법은 코드를 통해 직접 생성 시간을 설정하는 것입니다.entity.setCreateTime(LocalDateTime.now());엔티티의 createTime 필드에 LocalDateTime.now()와 같은 메서드를 호출하여 값을 할당하는 방식입니다.하지만 코드 중복이 많아진다는 단점이 있습니다.JPA의 @PrePersist 또는 @PreUpdate 사용@Entitypublic class MyE..

    [DB] Json을 RDBMS(MySQL, PostgreSQL)에 저장해도 좋을까?

    우선 키 밸류 형태의 값을 저장하기 위한 대표적인 저장소는 NoSQL입니다.하지만 어떠한 데이터를 저장하느냐에 따라 MySQL을 이용해도 무방한 경우가 있는데 여러 사이트를 참고한 결과를 정리해보겠습니다.아래의 조건을 다 통과한다면 RDBMS에서 사용해도 무방합니다.RDBMS에 저장하기 위한 조건1. 자주 업데이트 할 경우 성능에 영향을 끼친다. 예를 들어, 간단한 구조의 단순한 설정 데이터나 로그 데이터를 저장하는 경우, MySQL의 JSON 컬럼으로 충분할 수 있습니다. 2. 수정 과정이 일반 SQL보다 복잡하다. 3. 몽고 DB에 비해 집계 등 JSON에 대한 다양한 쿼리를 사용하기 어렵다. 4. 저장되는 Json이 크다면 속도 저하가 발생한다. (참고) 얼추 수천글자를 저장하는 케이스가 빈번하..