본문 바로가기

분류 전체보기134

Redis를 이용한 트랜잭션 처리와 분산 락 구현 Redis는 뛰어난 성능과 간단한 사용법으로 많이 사랑받는 인메모리 데이터 구조 저장소입니다. Redis의 다양한 기능 중에서도 트랜잭션과 분산 락은 분산 시스템에서 중요한 역할을 합니다. 이번 포스트에서는 SETNX 명령어를 중심으로 Redis에서 트랜잭션을 처리하고 분산 락을 구현하는 방법을 설명하겠습니다.Redis 트랜잭션 처리Redis에서 트랜잭션을 처리하기 위해 MULTI, EXEC, DISCARD, WATCH와 같은 명령어들을 사용할 수 있습니다. 하지만 간단한 경우에는 SETNX 명령어를 사용하여 트랜잭션 없이도 원자적으로 값을 설정할 수 있습니다.SETNX 명령어SETNX는 "SET if Not Exists"의 약자로, 주어진 키가 존재하지 않을 때만 값을 설정합니다. 이는 경쟁 상태를 방.. 2024. 7. 16.
MySQL 현재 시각 조회(NOW, SYSDATE) 두 함수 모두 현재의 시간을 반환하는 함수로서 같은 기능을 수행한다. 하지만 NOW()와 SYSDATE() 함수는 작동 방식에서 큰 차이가 있다. 하나의 SQL에서 모든 NOW() 함수는 같은 값을 가지지만 SYSDATE() 함수는 하나의 SQL 내에서 호출되는 시점에 따라 결괏값이 달라진다. CASE 1. NOW() CASE 2. SYSDATE() NOW() 함수를 사용한 첫 번째 예제에서는 두 번의 NOW() 함수 결과가 같은 값을 반환했다. 하지만 두 번째 예제에서 사용된 SYSDATE() 함수는 SLEEP() 함수의 대기 시간인 2초 동안의 차이가 있음을 알 수 있다. SYSDATE() 함수는 이러한 특성 탓에 두 가지 큰 잠재적인 문제가 있다. 첫 번째로는 SYSDATE() 함수가 사용된 SQL.. 2022. 7. 5.
MYSQL 사용자 계정 추가 (비밀번호관리) 1. MySQL 사용자 계정 추가 (인증플러그인) 2. MYSQL 사용자 계정 추가 (비밀번호관리/잠금) 기본 예 1 2 3 4 5 6 7 8 9 CREATE USER 'user'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'password' REQUIRE NONE PASSWORD EXPIRE INTERVAL 30 DAY ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFUALT PASSWORD REQUIRE CURRENT DEFUALT; cs 3. PASSWORD EXPIRE 비밀번호의 유효 기간을 서정하는 옵션이며, 별도로 명시하지 않으면 default_password_lifetime 시스템.. 2022. 6. 28.
MySQL 사용자 계정 추가 (인증플러그인) 1. MySQL 사용자 계정 추가 (인증플러그인) 2. MYSQL 사용자 계정 추가 (비밀번호관리/잠금) 기본 예 1 2 3 4 5 6 7 8 CREATE USER 'user'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'password' REQUIRE NONE PASSWORD EXPIRE INTERVAL 30 DAY ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFUALT PASSWORD REQUIRE CURRENT DEFUALT; cs 1. IDENTIFIED WITH (인증플러그인) MySQL 서버의 기본 인증 방식을 사용하고자 한다면 IDENTIFIED BY 'password' 형식으로.. 2022. 6. 27.
MySQL 인덱스 스캔(Index Scan) Index Range Scan 인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. 이 과정을 인덱스 탐색(Index Seek)이라고 한다. 탐색된 위치부터 필요한 만큼 인덱스를 차례대로 쭉 읽는다. 이 과정을 인덱스 스캔(Index Scan)이라고 한다 읽어 들인 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽어온다. Index Full Scan 인덱스의 처음부터 끝까지 모두 읽는 방식을 인덱스 풀 스캔이라고 한다. 대표적으로 쿼리의 조건절에 사용된 컬럼이 인덱스의 첫 번째 카럼이 아닌 경우 인덱스 풀 스캔 방식이 사용된다. 인덱스의 크기는 테이블의 크기보다 작으므로 직접 테이블을 처음부터 끝까지 읽는 것보다는 인덱스만 읽는 것이 효율적이다. 인덱스뿐만 아니라 .. 2022. 5. 11.
Vue 프로젝트 파일 - node_modules : npm으로 설치된 패키지 파일들이 모여 있는 디렉토리 - public : 웹팩(webpack)을 통해 관리되지 않는 정적 리소스가 모여 있는 디렉토리 - src/assets : 이미지, css, 폰트 등을 관리하는 디렉토리 - App.vue : 최상위(Root) 컴포넌트 - main.js : 가장 먼저 실행되는 자바스크립트 파일로써, Vue 인스턴스를 생성하는 역할 - .gitignore : 깃허브에 업로드 할 때 제외할 파일 설정 - babel.config.js : 바벨(Babel) 설정 파일 - package.json : 프로젝트에 필요할 package를 정의하고 관리하는 파일 - package-lock.json : 설치된 package의 dependency 정보를 관리.. 2022. 5. 7.
npm options --save 실무에서 프로젝트를 계속 개발하다 보면 설치된 패키지가 많아진다. 만약 다른 팀원들과 공동 작업을 하고 있다면 매번 패키지 파일 전체를 공유 하는 것은 말이 안되다. 그래서 패키지를 설치할 때 --save 옵션을 사용한다.  --save 옵션을 사용하면 package.json파일에 설치한 패키지 정보가 추가 된다. 그래서 package.json만 공유하여 npm install 만 하면 서로 공유 하는 것과 동일한 효과를 볼 수 있다. Git으로 소스를 관리할 때도 유용하다.  끝 2022. 5. 2.
[MS-SQL] Comment 수정 컬럼 수정 EXEC sp_updateextendedproperty @name = N'MS_Description', @value = '내용 입력', @level0type = N'Schema', @level0name = dbo, @level1type = N'Table', @level1name = '테이블명', @level2type = N'Column', @level2name = '컬럼명'; 테이블 수정 EXEC sp_updateextendedproperty @name = N'MS_Description', @value = '내용', @level0type = N'Schema', @level0name = dbo, @level1type = N'Table', @level1name = '테이블명'; 2022. 2. 25.
[자료구조]큐(Queue) - 리스트 연결 리스트로 큐를 구현하면 동적 할당의 성질에 의해 메모리의 한계까지 큐의 크기를 늘릴 수도 있고, 또 큐가 아주 작을 때에도 메모리도 조금 밖에 차지하지 않는다. 단순 연결 리스트를 이용하여 큐를 구현하는 것은 약간의 무리가 있다. 큐를 구현하려면 앞 노드의 위치와 뒷 노드의 위치를 모두 알고 있어야 하므로 할 수 없이 이중 경결 리스트를 사용하여야 한다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101.. 2016. 5. 16.
[자료구조]큐(Queue) - 배열 큐는 입구와 출구가 따로 있는 긴 통이라고 생각하면 된다. 큐는 접근이 제한된 자료구조이며 행위적 측면을 부여받은 추상적 자료형이기 때문에 큐를 조작하는 방법은 두가지로 제한되어 있다. 큐를 조작하는 방법은 put 동작과 get 동작이 있다. 큐에 자료를 집어넣을 때는 뒤(rear)에서 집어넣는다. 이 집어넣는 동작은 put 동작이라고 한다. 그리고 큐에서 자료를 얻어낼 때는 앞(front)에서 얻어낸다. 이 자료를 얻는 동작은 get 동작이라고 한다. 배열을 이용해서 큐를 구현하는 것은 문제가 없어 보이지만 문제가 많다. 배열을 이용한 큐의 구현은 자료를 저장할 배열과 앞과 뒤를 가리키는 변수만 있으면 될 것같다. 하지만 큐에 자료를 집어 넣고 빼는 동작을 계속하다보면 rear와 front는 계속 증가.. 2016. 5. 12.
[자료구조]스택(Stack) - 연결리스트 연결리스트 자체가 동적인 할당을 통해서 구현되기 때문에 연결리스트를 이용해서 구현되는 스탹은 매우 유연하다. 연결 리스트를 이용하여 스택을 구현할 때의 장점은 현재 스택에 저장되어 있는 자료 만큼만 메모리를 잡아먹기 때문에 메모리가 절약되고 스택의 크기가 메모리가 허용하는 한도에서 커질 수 있다는 것이다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include #include // 리스트 노드 typedef struct _node{ int key; .. 2016. 4. 12.
[자료구조]스택(Stack) - 배열 스택은 제한된 접근 방식의 행위적 측면을 부여받은 자료 구조이다. 이러한 자료구조를 추상적 자료 구조(Abstract Data Structure)라고 한다. 스택이 어떤 제한된 접근 방식과 행위적 부여 받았는지 지금부터 살펴보도록 하겠다. 스택의 구조는 매우 간단한다. 스택은 밑이 막힌 긴 통이라고 보면 되겠다. 밑이 막힌긴 통은 무언가를 넣는 곳과 무언가를 통에서 빼내는 곳이 같다. 입구와 출구가 같기 때문에 먼저 들어간 것은 밑에 있게 되고 나중에 들어간 것이 위에 있다.그러면 제일 나중에 들어간 것이 제일 먼저 나오게 된다. 그래서 스택을 LIFO(Last In First Out) 구조라고 한다. 스택을 프로그램에서 구현할 때에는 여러가지 방법이 있지만 가장 많이 사용되는 방법은 배열과 연결 리스트.. 2016. 3. 17.
[javascript] new 연산자 생성자란 new와 함께 호출될 뿐 별다를 것 없는 함수에 불과하다. 그렇다면 생성자를 호출할 때 new를 빼먹으면 어떻게 될까? 문법 오류나 런타임 에러가 발생하지는 않지만, 논리적인 오류가 생겨 예기치 못한 결과가 나올 수 있다. new를 빼먹으면 생성자 내부의 this가 전역 객체를 가리키게 되기 때문이다.생성자 내부에 this.member와 같은 코드가 있을 때 이 생성자를 new 없이 호출하면, 실제로는 전역 객체에 member라는 새로운 프로퍼티가 생성된다. 이 프로퍼티는 window.member 또는 그냥 member를 통해 접근할 수 있다. 알다시피 전역 네임스페이스는 항상 깨끗하게 유지해야 하기 때문에 이런 동작 방식은 대단히 바람직하지 않다. 아래의 예제를 실행해보시면 정확하게 알 수 있.. 2016. 2. 23.
[javascript] 사용자 정의 생성자 함수 객체 리터럴 패턴이나 내장 생성자 함수를 쓰지 않고, 직접 생성자 함수를 만들어 객체를 생성할 수 있다.12var adam = new Person("Adam");adam.say(); // "I am Adam"cs이런 형태는 객체지향 언어에서 클래스를 사용하여 객체를 생성하는 방식과 상당히 유사하다. 그러나 문법은 비슷해도 자바스크립트에서는 클래스라는 것이 없으며 위의 예제의 Person은 그저 보통 함수일 뿐이다. 아래 예제는 Person의 함수이다. 123456var Person = function (name){ this.name = name; this.say = function(){ return "I am " + this.name; };};csnew와 함께 생성자 함수를 호출하면 함수 안에서 다음과 .. 2016. 2. 18.
[자료구조]이중 연결 리스트(Doubly Linked List) 참고 : 이중 연결 리스트는 단순 연결 리스트와 함께 가장 많이 사용되는 연결 리스트의 형태이다. 단순 연결 리스트가 다음의 노드를 가리키는 하나의 링크를 가져서 바로 전의 노드를 알 수 없던 단점에 비해서, 이중 연결 리스트는 다음의 노드를 가리키는 링크와 전의 노드를 가리키는 링크 두 가지를 가져서 바로 전의 노드에도 접근할 수 있다는 것이 가장 큰 장점이다. 물론 하나의 링크를 더 사용하기 때문에 단순 연결 리스트보다는 메모리를 더 소모 한다. 이중 연결 리스트의 Node 구조이다. 12345typedef struct _dnode{ int key; // 정보 struct _dnode *prev; // 전 노드링크 struct _dnode *next; // 다음 노드링크} dnode;cs이중 연결 리.. 2016. 2. 17.