본문 바로가기
728x90

츄Log/기타 끄적20

Spring Batch의 JobParameter 설정 우선순위 spring batch의 Job을 실행할 때 사용되는 JobParameter 객체가 있습니다. 이 객체는 Job을 실행할 때 필요한 모든 파라미터를 담고 있고, 이 파라미터는 Job을 실행할 때 주입해줄 수도 있고 내부에서 코드를 통해 생성할 수도 있습니다. 외부와 내부에서 모두 같은 키에 대한 값을 생성할 때 어떤 것이 더 높은 우선순위를 가지는지 알아보겠습니다. 테스트를 위해 JobParametersIncrementer의 구현체를 하나 만들었습니다. public class CustomIdIncrementer implements JobParametersIncrementer { @Override public JobParameters getNext(final JobParameters parameters) .. 2024. 2. 3.
ULID (Universally Unique Lexicographically Sortable Identifier) 유일성을 보장히는 식별자를 만드는 방법은 다양합니다. 그 중 UUID는 많이 들어보았을 것입니다. > UUID는 128bit으로 표현하는 중복되지 않는 식별자를 만들기 위한 표준 규약입니다. (중복 확률이 0은 아니지만 0에 가깝습니다) UUID는 128bit을 16진수로 표현한 32개의 문자로 이루어져 있습니다 (규약대로 하이픈을 추가하면 문자열로 봤을 때는 36자입니다) UUID와 비슷하지만 조금 다른 것이 있는데 그것이 바로 ULID 입니다. ULID는 Timestamp와 Randomness로 구성되어 있습니다. ULID의 특징은 다음과 같습니다. 128-bit compatibility with UUID 1.21e+24 unique ULIDs per millisecond Lexicographical.. 2024. 1. 31.
checksum(체크섬, 검사합), CRC(순환중복검사) Checksum 체크섬은 중복 송/수신자간 데이터가 손상(data corruption)되었는지 확인하는 방법입니다. 여기서 송/수신자는 네트워크상 sender/receiver가 될 수 있고, client와 server가 될 수도 있습니다. 송신자는 전송할 데이터를 가지고 특정식을 수행한 후 전송합니다. (비트 단위로 구분하고 1의 보수를 취하고 그것들을 더하는 식) 수신자는 받은 데이터를 가지고 같은 방식으로 계산을 해 데이터 손상이 발생했는지 확인합니다. (계산 결과가 다르면 데이터 손상이 발생한 것입니다.) 네트워크 시스템에서는 TCP/IP가 위 checksum을 사용하고 있습니다. 굉장히 간단하지만, 데이터 순서가 바뀌는 오류에 대한 검출은 하지 못하는 점, 그리고 데이터의 무결성을 검증하는 것에 .. 2024. 1. 30.
MySQL on duplicate key update & affected rows 오늘은 upsert를 위해 많이 사용하는 on duplicated key update와 이 때 상황에 따른 affected rows를 알아보려고 합니다. on duplicate key update는 중복되는 고유키(Unique Key)가 없으면 insert, 고유키가 있으면 update를 하는 명령입니다. (고유키이므로 당연히 PK도 포함입니다.) INSERT INTO TABLE(A, B, C) VALUES ( X, Y, Z ) ON DUPLICATE KEY UPDATE A = X, C = Z 위 구문은 다음을 의미합니다. 중복되는 키가 없다면 insert구문을 실행하고, 중복되는 키가 있다면 update 구문을 실행하라. 이 때 해당 테이블에 설정된 고유키의 수와 관계 또한 중요하지만 이것은 다음에 알.. 2024. 1. 25.
다양한 캐시 전략들 캐시는 일정 기간동안 임시로 데이터 하위집합을 저장하기 위한 fast data storage layer입니다. 캐시란? 캐시에 대하여 캐시는 일정 기간동안 임시로 데이터 하위집합을 저장하기 위한 fast data storage layer입니다. 캐시는 어디에나 존재합니다. 하드웨어 캐시(ex. L1, L2), 페이지 캐시, 데이터베이스 캐시, API캐시, DNS캐 chupin-tech.tistory.com 이런 캐시를 구성하는데 다양한 전략이 있습니다. 내 애플리케이션의 읽기/쓰기 패턴에 맞는 전략을 선택하면 매우 효과적인 캐시 시스템을 구축할 수 있을 것입니다. 캐시에는 어떤 전략이 있는지 Read와 Write를 분리하여 알아보겠습니다. Read 전략 1. Cache-Aside 가장 기본적이고 일반적인.. 2024. 1. 5.
캐시란? 캐시에 대하여 캐시는 일정 기간동안 임시로 데이터 하위집합을 저장하기 위한 fast data storage layer입니다. 캐시는 어디에나 존재합니다. 하드웨어 캐시(ex. L1, L2), 페이지 캐시, 데이터베이스 캐시, API캐시, DNS캐시, 브라우저 캐시 등등.. Cache 는 ubiquitous 합니다. 캐시가 필요한 이유는 무엇일까요? 캐시는 origin data source보다 빠르므로 데이터 검색 속도를 높입니다. 또한 캐시는 복잡하거나 resource intensive한 작업을 미리 수행하여 데이터 조회를 효율적으로 만들 수 있습니다. 보통 우리는 생성 비용이 높거나, 잘 변하지 않는 데이터를 TTL을 두고 캐시해 두곤 합니다. 결과적으로 서버 혹은 데이터베이스로의 로드를 줄일 수 있고, end-us.. 2024. 1. 5.
Side Cache / Transparent Cache 캐시에 대해 공부하다가 Side Cache, Transparent Cache 키워드를 보았습니다. 이 두가지 키워드를 알아보겠습니다. Side Cache 전통적인 external cache의 형태를 뜻합니다. 캐시는 데이터베이스와 독립적으로 구성되어 있고, 애플리케이션 개발자가 캐시와 데이터베이스간 처리를 핸들링해야 합니다. (ex. 캐시의 일관성을 유지한다든지, write시에 캐시와 데이터베이스 모두에 쓴다든지..) 읽기는 캐시에서 수행되며 데이터가 miss되면 별도의 읽기를 데이터베이스에 전달해야 합니다. Transparent Cache 위에 설명한 Side Cache의 단점인 애플리케이션 개발자의 부담을 어느정도 해소한 모델입니다. 단일 데이터베이스 쿼리만 실행하면 됩니다. 애플리케이션에서 핸들링이.. 2024. 1. 4.
localhost.http-alt 란? PNS(Port Name Service) 안녕하세요. 오늘은 tcpdump를 볼 때 자주 보이는 localhost.http-alt에 대해 알아보겠습니다. 8080으로 서버를 띄우고 tcpdump를 보면 아래처럼 src/dst에 localhost.http-alt 가 보이곤 합니다. 여기서 localhost는 현재 실행중인 로컬호스트를 나타내고, 뒤의 http-alt는 이는 Port Name Service 의 일환으로 8080 포트 번호를 나타내는 것입니다. Port Name Service (PNS)는 TCP/UDP 포트 번호와 해당 포트가 사용되는 서비스의 이름을 매핑하는 서비스입니다. 이 매핑 정보는 주로 /etc/services 파일(유닉스계열)이나 유사한 데이터베이스에 저장되어 있습니다. PNS는 포트 번호에 의미 있는 이름을 부여하여 특정.. 2023. 12. 28.
MySQL 트랜잭션 격리 수준 (isolation level) 안녕하세요. 오늘은 MySQL의 격리수준을 알아보겠습니다. 트랜잭션에서 격리수준(isolation level)은 여러 트랜잭션이 동시에 처리될 때, 다른 트랜잭션의 변경사항을 어디까지 허용할 것인지 설정하는 매우 중요한 개념입니다. 트랜잭션의 격리수준에 따라서 고립도, 동시 처리 성능, 부정합 정도가 달라지게 됩니다. (격리 수준이 높아지면 고립도가 올라가고, 동시 처리 성능이 떨어지며 부정합 정도가 완화된다 라고 직관적으로 이해해볼 수 있습니다.) 위 표를 보면 행이 격리수준이고, 밑으로 내려갈 수록 격리 수준이 올라가는 것입니다. 열은 부정합의 종류입니다. 먼저 부정합의 종류부터 알아보겠습니다. 1. Dirty Read 특정 트랜잭션에서 처리한 작업이 완료되지 않았는 데도 다른 트랜잭션에서 볼 수 있.. 2023. 12. 21.
MVCC (Multi Version Concurrency Control) 안녕하세요. 오늘은 MVCC에 대해 알아보겠습니다. MVCC는 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이고, MVCC의 가장 큰 목적은 잠금을 사용하지 않고 일관된 읽기를 제공하는 데 있습니다. MySQL의 InnoDB는 Undo Log를 이용해 이 기능을 구현합니다. 멀티버전은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미입니다. MySQL의 격리수준에서 READ_COMMITTED 이상의 격리수준은 이 MVCC를 이용하여 잠금 없는 일관된 읽기(Non-Locking Consistent Read)를 제공합니다. 아래 그림이 MySQL에서 UPDATE문장이 실행될 때 절차를 보여주는 그림입니다. 격리 수준이 READ_UNCOMMITTED인 경우에는 InnoDB 버퍼 풀이 .. 2023. 12. 21.
템플릿 메소드 콜백 패턴(Template Method Callback Pattern) 안녕하세요. 지난 번 포스팅인 템플릿 메소드 패턴에 이어서 비슷한 결이지만 방식은 다른 템플릿 메소드 콜백 패턴을 알아보려고 합니다. 템플릿 메소드 콜백 패턴은 템플릿 메소드 + 콜백이 합쳐진 것이라고 생각합니다. 템플릿 메소드 : 기본 골격이 있고, 그 곳에서 일부 단계(혹은 일부 다른 부분)를 구현할 수 있게 합니다. 콜백 : 이를 상속이 아닌 인터페이스를 통한 위임을 사용하고, 메서드의 매개변수에 이 인터페이스를 전달하여 특정 시점이나 상황에 호출되게 합니다. 지난번 사용한 예제를 그대로 템플릿 메소드 콜백 패턴으로 변경해보겠습니다. 지난번과 같이 템플릿이 되어줄 클래스가 필요합니다. public class RestaurantRobot { public final void hello(final Nam.. 2023. 12. 14.
템플릿 메소드 패턴 (Template Method Pattern) 안녕하세요! 오늘은 템플릿 메소드 패턴을 한 번 만들어보려고 합니다. 템플릿 메소드 패턴은, 전체적인 구조(템플릿)를 상위클래스에서 정의하고 일부 영역을 변경할 수 있게끔 만들어서 중복을 줄이고 코드를 재사용할 수 있게 합니다. 일종의 IoC인 템플릿 메소드 패턴은 많은 프레임워크, 라이브러리에서 사용하고 있습니다. 왜 일종의 IoC냐면, 하위 클래스에서 구현한 추상메소드가 결국 상위 클래스의 흐름에 따라 호출되기 때문입니다. 즉 제어는 상위클래스에서 이루어지는 것입니다. UML Class Diagram에서 보이는 것처럼 템플릿 메소드 패턴은 상속을 통해 이루어집니다. 코드로 한 번 보겠습니다. 앞으로 나올 코드를 간단하게 설명하자면, 레스토랑에서 손님이 들어왔을 때 인사하는 로봇의 인사(hello) 메.. 2023. 12. 14.
728x90