스트래티지 패턴이라는 이름을 처음 들어봤어도 스프링을 사용해보았다면 아마 금방 이해할 수 있을 것이다. 우리가 스프링을 사용해 웹 애플리케이션을 구현할 때, 일반적으로 사용할 빈 타입을 클래스 내에 멤버 변수로 포함시키고 스프링이 해당 빈 객체를 주입함으로써 사용하게 된다. @Controllerpublic class HelloController { private final HelloService service; public HelloController(HelloService service) { this.service = service; }} 이렇게 함으로써 HelloController의 HelloService 객체는 런타임에서 어떤 객체가 주입되느냐에 따라 실행할 동작을 결..

언론사나 매거진 등은 구독 서비스를 제공한다. 해당 매체에 구독을 신청하게 되면 구독자가 직접 매체에 방문하지 않더라도 매체에 새로운 글이 발행되는 등의 이벤트에 따라 구독자에게 메일을 전송해 알려준다. 그럼 구독자는 메일을 보고 글을 읽는 등의 이벤트를 처리하게 된다.옵저버 패턴은 이와 동일하다. 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 옵저버 패턴의 참여자는 둘로 나뉜다.주제 객체(subject) : 언론사나 매거진 같이 데이터를 제공하는 객체옵저버(observer) : 주제 객체를 구독하고 있는 객체 옵저버 객체들은 주제 객체를 구독한다. 주제 객체의 상태가 업데이트되면..

스프링을 배웠다면 수도 없이 많이 들었던 개념 중 하나가 싱글턴 패턴일 것이다. 스프링은 빈으로 등록된 객체들은 기본적으로 싱글턴으로 관리되기 때문이다. 객체들 중에는 사실 단 하나만 존재해도 되는 것들이 있다. 스레드 풀이나 로그 기록용 객체 등이 이에 해당한다. 예를 들어 스레드 풀 객체가 두 개가 존재한다고 생각해 보자. 어떤 객체는 스레드 풀 A에서, 또 어떤 객체는 스레드 풀 B에서 스레드를 가져와 사용했을 때, 스레드 풀 A에서 가져다 쓰는 객체의 호출 빈도가 높다면 A 스레드 풀 내의 스레드는 쉴 틈 없이 사용되고 있을 것이고 이에 비해 B 스레드 풀의 스레드들은 놀고 있는 상황이 되어 모든 자원을 효율적으로 사용하지 못해 성능을 온전히 낼 수 없게 된다. 즉, 하나만 존재해도 되는 객체가 ..

동시성 제어 문제먼저 동시성 제어가 제대로 이루어지지 않았을 때 발생할 수 있는 문제들을 알아보자. Lost Update - 갱신 손실하나의 트랜잭션에서 갱신한 데이터 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효화 되는 문제를 의미한다.초기 값이 `x = 1`데이터에 대해 두 트랜잭션이 동시에 실행된다고 생각해보자.트랜잭션 A : `x + 10`트랜잭션 B : `x + 20`트랜잭션 A가 먼저 실행되어 x = x + 10 연산을 통해 값을 `11`로 갱신한다.트랜잭션 A보다 조금 늦게 시작한 트랜잭션 B가 x = x + 20 연산을 통해 값을 `21`으로 갱신한다.결과적으로 x의 값은 21이되며 트랜잭션 A의 갱신은 손실된다.두 트랜잭션이 직렬로 실행되었다면 `x` 값은 31이 되어야 한다. 하지만 ..

트랜잭션이 나올 때마다 단골처럼 나오는 예시가 은행 송금 상황이다. 예를들어 예전에 친구에게 만원을 빌렸다가 갚는 상황을 생각해보자. 은행 어플을 열고 친구의 계좌번호와 만원을 입력하고 송금 버튼을 눌러서 내 계좌에서 돈이 빠져나갔다. 하지만 어떤 이유에서인지 친구의 계좌에는 만원이 입금되지 않았다. 일반적인 생각에서는 송금에 실패했다면 다시 내 계좌로 만원이 되돌아오는게 정상적이다. 트랜잭션은 이러한 정상적인 상황을 보장하기 위한 개념이다. 트랜잭션이란, 하나의 작업 단위로 간주되는 일련의 연산 또는 명령 집합을 의미한다. 위 예시로 생각하자면 하나의 작업이라는 것은 `송금`이 될 것이고 명령의 집합은 `{출금, 입금}`이 될 것이다. 즉, 내 계좌에서 만원이 빠지고 친구 계좌에 만원이 입금되는 모든 ..

운영체제에서 여러 스레드가 동일한 자원에 접근할 때 동시성 문제가 발생할 수 있는 것처럼 데이터베이스에서도 여러 트랜잭션이 동시에 실행되고 이 트랜잭션들이 동일한 자원에 접근할 때 동시성 문제가 발생한다. 이를위해 데이터베이스에서도 락을 제공해 여러 트랜잭션이 동시에 데이터를 처리할 때, 데이터의 무결성과 일관성을 보장할 수 있도록 돕는다. Lock의 수준Database Level전체 데이터베이스에 대한 락을 설정하는 가장 큰 범위의 락이다.관리 비용이 매우 적고 데이터베이스 백업 또는 복구와 같은 특정 유지보수 작업 시에 유용하다.하지만 동시성이 전혀 보장되지 않아 작업 중인 트랜잭션 외의 모든 트랜잭션은 대기해야한다.Table Level테이블 전체에 대해 락을 설정한다.매우 간단하고 관리 비용도 적다..