본문 바로가기

분류 전체보기48

스프링 AOP - 톺아보기 aop 는 횡단 관심사를 분리하여 모듈화 한 것을 말한다.횡단 관심사란 비즈니스 로직이 아닌 그 외의 로깅, 트랜잭션과 같은 것들을 말한다.스프링을 사용하면 자주 만나게되는 @Transactional 이나 @Cacheable 과 같은 어노테이션들이 이런 스프링 AOP 를 통해 구현된 것이라고 볼 수 있다.이 스프링 AOP의 기반이 되는 proxy 와 bean post processor 에 대해 알아보고, 스프링 AOP 에 대해 알아보고자 한다.Spring-Aop 의 기반Proxy프록시는 디자인 패턴의 일종이다.아래와 같이 client 가 target 객체를 호출할 때, target 을 객체로 감싸서 중간에서 다른 작업을 하게 된다.간단하게 코드를 살펴보면 아래와 같다.// 인터페이스 기반class Foo.. 2024. 6. 6.
MySQL(InnoDB)이 잠금할 레코드를 고르는 방법 MySQL 을 처음 공부할 때, 레코드 잠금에 관해서 여러가지 궁금한 점들이 많았다. 그동안 궁금했던 세부적인 부분들에 대해서 정리해보고자 한다.MySQL 은 기본적으로 잠금 읽기(locking read), update, delete 문에 대해서 잠금을 걸 때, 스캔되는 모든 인덱스에 잠금을 건. WHERE 조건에 특정 행(row)를 제외할 수 있다고 하더라도, 이와 관계 없이 스캔되는 모든 인덱스에 잠금을 걸게 된다.Q. WHERE 절을 기반으로 스캔되는데, 왜 WHERE 절과 관계 없이 레코드 잠금이 걸린다고 할까?참고로, 이 내용은 REPEATABLE READ 에 해당하는 내용으로, READ COMMITTED 에서는 다르게 동작한다. WHERE 절을 기반으로 레코드를 조회하는 것은 맞다.하지만, M.. 2024. 6. 5.
카프카 톺아보기4-1 프로듀서 개념 카프카 프로듀서란 카프카 클러스터로 이벤트를 발행하는 클라이언트 어플리케이션을 의미한다.DDD 관점에서 보면, 서로 다른 바운디드 컨텍스트(일반적으로 서버가 분리되어 있음)에 속한 애그리거트의 상태 변경에 대한 도메인 이벤트를 시스템간의 이벤트로 변환하여 발행할 때 카프카 프로듀서를 통해 이벤트를 발행하곤 한다.예를들어, 주문이 취소되는 경우 주문이라는 애그리거트 (도메인의 제약사항을 공유하는 객체 묶음) 상태가 변경된 것을 이벤트로 발행하게 되는데, MSA 에서 다른 컨텍스트 예를 들어, 재고 시스템과 같은 컨텍스트가 이에 대한 처리가 필요한 경우 해당 이벤트를 받아서 로직을 처리하게 된다.기본적으로 카프카 프로듀서는 컨슈머에 비해 그렇게 복잡하지 않다.파티셔너파티셔너는 프로듀서가 메시지를 발행할 때 .. 2024. 5. 30.
카프카 톺아보기 3-1. 컨슈머 개념 커밋커밋이란 컨슈머가 자신이 어디까지 메시지를 소비했는지 메시지의 오프셋(offset)을 기록하는 행위이다.참고로 offset 을 커밋하는 방식은 여러가지가 있을 수 있다.offset 을 자동으로 커밋할 수도 있고 수동으로 커밋할 수도 있다. 또한 커밋에 대한 결과를 동기적으로 받을 수도 있고 비동기로 받을 수도 있다.아래 그림을 보면 poll 을 통해 1~500 개의 메시지를 가져온다. 그리고 offset 500을 커밋하게 된다.이렇게 되면, 해당 파티션과 연결된 컨슈머 그룹의 컨슈머는 다음에는 501 오프셋을 가진 메시지를 소비하게 된다.auto commit자동으로 커밋을 수행하는 경우, auto.commit.interval.ms 설정에 의해서, 메시지들을 poll 한 후에 해당 시간이 흐른뒤에 로직.. 2024. 5. 30.
카프카 톺아보기2 - CLI 카프카는 운영을 위한 커맨드 라인툴을 많이 제공한다.카프카를 운영하는 입장은 아니지만, 로컬에서 카프카를 세팅할때 필요한 명령어들을 조금 알아보려고한다.브로커 설정도커 컴포즈를 사용하여 카프카 세팅을 하는 경우, 아래와 같은 방식을 통해 설정할 수 있다.이번 포스팅에서는 커맨드라인 툴을 설명할 예정이라 추후에 다뤄보려고 한다.docker-compose 파일의 environment 프로퍼티로 설정server.properties 로 설정토픽 관련 - kafka-topics.sh위 쉘 스크립트를 통해서는 토픽의 생성, 정보 세팅, 정보 변경 등을 수행할 수 있다.옵션—create : 토픽의 생성. 별다른 설정을 주지 않으면, 브로커의 값을 따르게 된다.docker 명령어를 통해서 실행docker exec -i.. 2024. 5. 30.
카프카 - 메시지 유실 가능성 언젠가 면접에서 카프카 사용시 메시지가 유실될 수 있을까? 만약 유실될 수 있다면 언제 유실될 수 있을까? 라는 질문을 받은적이 있다. 당시 질문에 대답을 잘 못했는데, 카프카를 통신수단 이상으로 생각하지 않기도 했고 카프카 그 자체에 대해서는 잘 몰랐기 때문이었다. (지금도 잘모르지만)그렇다면, 카프카 사용시 메시지는 유실될 수 있을까? 한번 알아보려고 한다.복제https://pius712.tistory.com/16 카프카 톺아보기애플리케이션 개발자의 입장에서 카프카에 대해서 간단하게 살펴보고자 한다. (깊게는 필자도 잘 모른다.) 아파치 카프카는 분산 이벤트 스트리밍 플랫폼이다. 일반적인 pub/sub 구조의 rabbitMQ, redpius712.tistory.com 위 포스트에서 설명했듯, 카프카에.. 2024. 5. 23.
분산환경 동시성 처리 2 - redisson 활용 https://pius712.tistory.com/25 분산환경 동시성 처리 1 - db 사용동시성 이슈란 무엇인가?멀티 스레딩 환경에서는 동시성 이슈로 인해서 공유자원이 경쟁상태(race condition)에 놓이는 상황이 발생할 수 있다. JVM 진영에서는 객체의 상태 변수도 race condition 이 발pius712.tistory.com https://pius712.tistory.com/26 분산환경 동시성 처리 2 - redis SETNX 사용https://pius712.tistory.com/25 분산환경 동시성 처리 1 - db 사용동시성 이슈란 무엇인가?멀티 스레딩 환경에서는 동시성 이슈로 인해서 공유자원이 경쟁상태(race condition)에 놓이는 상황이 발생할 수 있pius712.t.. 2024. 5. 17.
분산환경 동시성 처리 2 - redis SETNX 사용 https://pius712.tistory.com/25 분산환경 동시성 처리 1 - db 사용동시성 이슈란 무엇인가?멀티 스레딩 환경에서는 동시성 이슈로 인해서 공유자원이 경쟁상태(race condition)에 놓이는 상황이 발생할 수 있다. JVM 진영에서는 객체의 상태 변수도 race condition 이 발pius712.tistory.com 위 포스팅에서는 database 기능을 통해서 동시성 처리 예제를 만들어 보았다.이번 포스팅에서는 redis 를 활용하여 동시성 제어를 해보려고한다.이번 포스팅에서는 redis 자체에 대해서는 깊게 다루지 않으려고 한다.선착순과는 다른점참고로, 이전 포스팅과 이번 포스팅의 사례는 선착순 시스템의 경우에는 적절하지 않을 수 있다.왜냐하면, 기본적으로 이전 포스팅에.. 2024. 5. 17.
분산환경 동시성 처리 1 - db 사용 동시성 이슈란 무엇인가?멀티 스레딩 환경에서는 동시성 이슈로 인해서 공유자원이 경쟁상태(race condition)에 놓이는 상황이 발생할 수 있다. JVM 진영에서는 객체의 상태 변수도 race condition 이 발생할 수 있는데, 이번에는 데이터베이스를 중점적으로 다뤄볼 예정이다.데이터베이스에서 발생하는 race condition 의 경우, JVM 언어가 아닌 nodejs 같은 싱글스레드 기반의 언어에서도 발생할 수 있다. 그 이유는 데이터베이스 자체가 멀티스레드로 동작하기 때문이다.동시성이 발생하는 이유는 하나의 공유 자원에 대해 여러 개의 연산이 원자적(atomic) 으로 동작하지 않기 때문이다.아래의 예시처럼 t1 스레드와 t2 스레드가 food 의 개수를 감소하는 로직을 다룬다고 했을 때,.. 2024. 5. 17.