
동시성 문제란? 공유 자원에 둘 이상의 스레드가 접근하여 생기는 경쟁 상황(race condition)을 동시성 문제라고 한다. 둘 이상의 스레드가 공유 데이터에 접근 가능한 상황에서 하나의 스레드가 공유 데이터를 수정 중일 때, 다른 스레드에서 수정 전의 데이터를 조회해 로직을 처리함으로써 데이터의 정합성이 깨지는 문제를 말한다. 자바 스프링 기반의 웹 애플리케이션은 기본적으로 멀티 스레드 환경에서 구동된다. 따라서 공유 자원에 대해 race condition이 발생하지 않도록 별도의 처리가 필요하다. 분산 락이란? 자바는 Synchronized 라는 키워드를 제공해 상호 배제 기능을 제공한다. 하지만 Sychronized는 하나의 프로세스 안에서만 상호 배제를 보장한다. 서버가 1대일 때는 문제가 없..

문제 상황 동아리 면접 중, 동시성 문제와 관련해서 내 로직에서는 연관 엔티티의 아이디가 중복 생성 가능해보인다. 어떻게 하면 중복 생성을 막을 수 있을까? 라는 질문을 받았다. 정확히는 모르겠지만, 낙관적 락을 사용하면 해결할 수 있을거 같다 답했다. 면접관은 낙관적 락을 사용해서도 해결할 수 있지만, UNIQUE 제약조건을 통해서도 해결할 수 있다고 했다. 그래서 UNIQUE 제약조건을 통해 직접 중복 생성을 막아보려 한다! 낙관적 락은 좀 더 공부한 뒤 추후 포스팅해 볼 예정이다. 문제 상황 재현 예를 들면, 아래와 같은 상황이다. userId와 articleId를 갖고 있는 Like 엔티티가 존재한다고 하자. @Entity @NoArgsConstructor @Table(name = "likes")..

UNIQUE 제약 조건이란? 대상의 컬럼에 중복된 값이 저장될 수 없게 하는 제약조건 컬럼 옆 unique 키워드를 붙인 것과, 여러 컬럼 조합에 UNIQUE 제약 조건을 설정하는 것의 차이를 알아보자. 1. 컬럼 옆 unique 키워드로 제약조건 설정 create table user( age int, name varchar(255) unique ); name 필드에 중복된 값을 insert 해보자. 그러면 아래와 같은 오류가 발생한다. insert into user(age, name) values(1, 'sky'); insert into user(age, name) values(2, 'sky'); 즉, unique 키워드가 붙은 각 컬럼은 중복된 값을 저장할 수 없다. 2. CONSTRAINTS로 여러..