분류 전체보기

@Async스프링에서는 @Async 어노테이션을 사용하면 비동기로 메서드를 호출할 수 있다.@Async 어노테이션은 Spring AOP로 동작하며 요청 스레드와 별개의 스레드에서 해당 메서드를 비동기로 수행할 수 있게 한다. ThreadPoolTaskExecutor 빈 등록@EnableAsync 어노테이션도 같이 붙여야 @Async가 동작한다.근데 왜 ThreadPoolTaskExecutor 빈을 등록하라는 걸까?  기본적으로 @EnableAsync 어노테이션을 사용하면 TaskExecutor 타입의 빈을 찾고 해당 빈을 통해 비동기를 처리한다.만약 개발자가 직접 커스텀하게 등록한 TaskExecutor 빈이 존재하지 않으면 디폴트로 SimpleAsyncTaskExecutor를 사용하게 되는데, Simp..
RDB, AOF 둘 다 모두 redis 데이터를 영구적으로 저장하는 방식이다.차이점을 알아보자.RDB(Redis DataBase) RDB는 스냅샷을 찍어서 redis 데이터를 영구적으로 보관하는 방식이다.특정 시점의 redis 데이터를 dump.rdb 파일로 스냅샷을 뜬다.rdb 파일은 바이너리 파일이기 때문에 직접 읽을 수는 없다. 특정 시점(저장 시점) 설정하기RDB에는 저장하는 방식이 두 가지가 있다. SAVE와 BGSAVE이다. SAVE 방식은 blocking 방식으로 redis의 동작을 잠시 정지시킨 후 스냅샷을 생성하고 디스크에 저장한다.// redis.conf// 참고로 아래의 옵션 3개는 default이다.save 900 1 // 900초(15분) 동안 1번 이상 key 변경이 발생하..
발생한 문제Spring Validation을 사용하는 도중 @NotBlank 어노테이션의 message 필드 값을 지정하면 'Attribute value must be constant' 에러를 내면서 컴파일이 되지 않는 문제를 맞닥뜨렸다.분명 위 사진처럼 Enum을 사용하지 않고 String 리터럴 값을 넣으면 문제 없이 컴파일이 된다. 원인어노테이션은 JDK 1.8 기준 JVM 실행 시 클래스 로더에 의해 클래스 로딩 시점에 Metaspace 영역에 저장된다.이 때 어노테이션의 속성 값에 저장되는 message(위 사진)는 Metaspace 영역의 어노테이션 메타 데이터 구조 내에 포함된다.Metaspace 영역 안에 있는 데이터들은 한번 메모리에 올라가면 불변 성격을 갖는다.따라서 어노테이션에 사용되..
기본적으로 스레드 풀은 작업이 제출되면 corePoolSize의 새 스레드를 추가해서 작업을 할당하고 큐 작업을 바로 추가하지 않는다. corePoolSize를 초과해서 스레드가 실행 중이면 새 스레드를 추가해서 작업을 할당하는 대신 큐에 작업을 추가한다. 만약 큐가 가득차게 되면 스레드가 maxPoolSize 이상까지 늘어나게 되고 maxPoolSize 이상 실행 중이면 더 이상 작업은 추가되지 않고 거부된다. BlockingQueue 인터페이스를 구현한 구현체는 여러개가 있지만, ThreadPoolExecutor와 관련된 세 가지는 아래와 같다. SynchronousQueue LinkedBlockingQueue ArrayBlockingQueue SynchronousQueue BlockingQueue의..
VM OPTION에서 XMS와 XMX XMS: 자바 애플리케이션이 실행될 때의 JVM에 할당되는 초기 힙 크기(Initial Heap Size) XMX: JVM에 할당 가능한 최대 힙 크기(Max Heap Size) JVM이 실행될 때 메모리가 XMS에 설정된 값에서 시작하여 최대 XMX에 설정된 값까지 사용 가능하다는 의미이다. 만약 메모리가 XMX를 넘어서면 OutOfMemoryError가 발생하며 자바 애플리케이션이 셧다운된다. 물론 최소 힙 크기(Minimum Heap Size)도 존재한다. 만약 jar를 실행할 때 -xms와 -xmx를 설정하지 않는다면? 오라클 공식문서에 따르면 xms, xmx의 디폴트 값은 아래와 같다. xms: 현재 운영체제에 할당된 메모리의 1/64 xmx: 현재 운영체제..
MySQL on Docker Series 1. Master-Slave Replication 구성하기 2. Bridge Network를 이용한 Replication 구성하기 이전 포스팅에서 컨테이너 환경에서 MySQL 서버 3대(Master DB 1대, Slave DB 2대)를 구축했다. 그런데 MySQL Master DB 컨테이너가 재실행되면서 IP 주소가 변경되는 경우, Replication이 깨질 수 있기 때문에 Slave DB에 각각 접속해서 Master DB 컨테이너의 IP를 수정해야 하는 번거로움이 생긴다. 이러한 번거로움을 해결하기 위해 Docker Bridge Network를 구성하고 net alias를 사용하여 IP 변경에도 문제가 발생하지 않도록 할 수 있다. Bridge Network란..
MySQL on Docker Series 1. Master-Slave Replication 구성하기 2. Bridge Network를 이용한 Replication 구성하기 해당 포스팅은 컨테이너 환경에서 MySQL 서버 3대(Master DB 1대, Slave DB 2대)를 구축 것이 목표이다. Mac OS에 도커를 설치하여 아래와 같이 MySQL 5.7.30 서버 3대를 실행할 예정인데, 볼륨 마운트를 사용할 예정이다. 따라서 마운트할 호스트 디렉토리는 아래와 같다. // db001 (Master DB) $ ~/db/db001/data $ ~/db/db001/conf, ~/db/db001/conf/my.cnf $ ~/db/db001/log // db002 (Slave DB-1) $ ~/db/db002/..
여러 스레드가 동시에 하나의 데이터에 접근해서 값을 수정하는 경우 race condition(경쟁 조건)이 발생할 수 있다. 이를 해결하기 위한 방법에는 여러가지가 있는데 이번 포스팅에는 Optimistic Lock을 활용하여 해결해 보도록 한다. 데이터베이스 동시성 이슈 해결하기 시리즈 1. Optimistic Lock 2. Pessimistic Lock 3. Named Lock 4. Redis Lettuce 5. Redis Redisson Optimistic Lock(낙관적 락) 낙관적 락은 여러 사용자가 동시에 같은 데이터를 수정하는 경우가 드물다고 가정할 때 주로 사용한다. 따라서 Lock을 걸지 않고 충돌이 발생하면 그때마다 엔티티의 버전을 비교하여 동시성 이슈를 해결하는 방식이다. 즉, DB ..
ctp102
'분류 전체보기' 카테고리의 글 목록