IT 55

[CS] CRDT

CRDT(Conflict-free Replicated Data Type) 는 분산 시스템에서 데이터 복제를 처리하기 위한 구조다. 1. 주요 특징- 충돌 없는 병합 > 각 노드에서 독립적으로 데이터를 수정한 후, 병합 시 충돌 없이 자동으로 일관된 상태 보장- 최종 일관성 > 네트워크 분리 또는 지연 상황에서도, 모든 노드는 결국 동일한 상태로 수렴- 병합 및 독립 수정 허용 > 여러 노드에서 병렬로 데이터를 수정할 수 있으며, 수정된 데이터는 병합 시 자동으로 조화 2. 종류 (데이터 병합 방식에 따라 나뉨)- 2.1. State-Based CRDT > 각 노드는 데이터의 전체 상태를 주기적으로 다른 노드와 동기화 > 병합 연산자는 결합 연산자를 사용하며, 연산의 순서와 상관없이 동일한 결과 ..

IT/CS 2024.12.11

[CS] .so 파일과 .a 파일 비교

.so 파일과 .a 파일에 대한 비교 글을 작성하고자 한다.결론적으로 .so 파일과 .a 파일은 모두 컴파일된 코드를 담고 있는 라이브러리 파일이지만, 사용하는 방식과 목적이 다르다. 1. .so 파일- 1.1. 정의  - 동적(공유) 라이브러리 파일- 1.2. 특징  - 실행 시간에 프로그램이 라이브러리 로딩  - 동일한 라이브러리를 여러 프로그램이 동시에 사용할 수 있어 메모리 사용량 줄임  - 변경된 라이브러리를 다시 컴파일하지 않고도 프로그램이 업데이트된 내용 사용 가능  - 배포 시 실행 환경에서 반드시 .so 파일 필요 2. .a 파일- 2.1. 정의  - 정적 라이브러리 파일- 2.2. 특징  - 프로그램이 빌드될 때 라이브러리의 모든 필요한 코드가 실행 파일에 포함되어 파일 크기 커짐  ..

IT/CS 2024.12.11

[CS] 사용자 패스워드 전송/보관 방법

사용자 패스워드를 전송 및 보관하는 방법에 대해 정리하고자 한다. 1. 패스워드 전송- 사용자 패스워드를 전송할 때는 네트워크에서의 도청과 변조를 방지해야 한다.- 대표적인 방법으로는 TLS(Transport Layer Security), CSRF(Cross-Site Request Forgery) 토큰 사용 등이 있다. 2. 패스워드 저장- 서버에서 사용자 패스워드를 해싱하여 저장한다.- 이때 사용되는 해싱 알고리즘으로는 bcrypt, 솔트(salt) 추가 등이 있다.(여기서 솔트(salt)란, 암호학 및 보안에서 사용되는 무작위로 생성된 고유한 데이터로 패스워드를 해싱하기 전에 추가하는 값을 의미한다. 즉, 패스워드에 솔트를 추가한 후 해싱한다.) 3. 패스워드 검증- 사용자가 로그인할 때 입력한 패..

IT/CS 2024.12.11

[CS] Base64 인코딩

이번엔 Base64 인코딩에 대해 정리하려고 한다. 1. 정의- 64개의 ASCII 문자를 사용하여 바이너리 데이터를 텍스트 형식으로 변환하는 인코딩 방식(이 때, 64개는 A-Z(26자), a-z(26자), 0-9(10자), +,/(2자) 로 구성되어 있다.) 2. 작동 방식- 1) 데이터를 3바이트(24비트)씩 나눈다.- 2) 각 24비트를 6비트씩 분할하여 4개의 블록으로 나눈다.- 3) 각 6비트 블록을 64개의 ASCII 문자로 변환한다.여기서 원본 데이터의 길이가 3의 배수가 아니라면 남은 바이트의 수에 따라 '=' 패딩 문자를 추가한다. 3. 주요 특징- 데이터 크기 증가 (원본 데이터의 크기보다 33% 증가, 3바이트 입력이 4바이트 출력으로 변환되므로)- 가독성 (인코딩된 데이터는 읽기..

IT/CS 2024.12.11

[DesignPattern] SAGA 패턴

이번엔 SAGA 패턴에 대해 정리하고자 한다. 1. 개념- 분산 시스템에서 장기 실행 트랜잭션을 처리하며 데이터의 (최종) 일관성을 보장하기 위한 설계 패턴- 하나의 비즈니스 프로세스를 여러 단계의 트랜잭션으로 분할하고, 각 단계를 독립적으로 실행하도록 설계 2. 구현 방식- 조정 기반  > 중앙에서 조정자가 각 단계의 트랜잭션 실행 제어  > 중앙 컨트롤러가 명시적으로 다음 작업을 호출하거나 롤백  > 구현이 비교적 간단하지만, 조정자의 단일 장애점(SPOF)의 발생 가능- 중재 기반  > 각 서비스가 이벤트 기반으로 서로 통신하며 SAGA의 단계를 독립적으로 진행  > 한 단계가 완료되면 이벤트를 발행하여 다음 단계 트리거  > 분산 시스템 특성에 더 적합하지만, 설계 복잡 및 디버깅 어려움 3. 장..

IT/DesignPattern 2024.12.10

[DesignPattern] CQRS 패턴

흔히 이야기 되는 디자인 패턴, 그 중에서도 CQRS 패턴에 대해 정리하고자 한다.그전에 디자인 패턴이 무엇인지에 대해 먼저 정리가 필요하다. 0. 디자인 패턴- 소프트웨어 개발 과정에서 반복적으로 나타나는 문제를 해결하기 위한 모범 사례를 체계화 한 것- 코드의 재사용성과 유지보수성을 높이고, 개발자 간의 의사소통을 원활하게 하기 위한 공통 언어를 제공한다.- 예시 > 생성 패턴: 객체 생성과 관련된 문제를 해결 (ex. singleton, factory method) > 구조 패턴: 객체 간의 관계를 정의하고 구조를 설계 (ex. adapter, decorator) > 행위 패턴: 객체 간의 책임 분담과 협력 방식을 정의 (ex. observer, strategy) 1. CQRS(Command ..

IT/DesignPattern 2024.12.10

[CS] System Call

System Call 에 대해 정리하고자 한다. 1. 정의- 사용자 모드에서 실행되는 프로그램이 커널 모드에서 실행되는 운영 체제 기능을 호출하기 위한 인터페이스(여기서 사용자 모드는 애플리케이션 실행 모드를 의미하고 제한된 권한을 가진다. 한편 커널 모드는 운영 체제 실행 모드를 의미하고 시스템 자원에 대한 모든 권한을 가진다.) 2. 역할- 하드웨어 보호  > 애플리케이션이 직접 하드웨어에 접근하지 못하도록 하여 시스템 안정성을 보장한다.- 추상화 제공  > 운영 체제가 다양한 하드웨어를 추상화하여 애플리케이션이 동일한 자원으로 자원을 사용할 수 있도록 한다.- 자원 관리   > CPU, 메모리, 디스크, 네트워크 등 시스템 자원을 효율적으로 관리한다.- 보안  > 사용자 애플리케이션이 운영 체제의 ..

IT/CS 2024.12.09

[Java] volatile 키워드

Java 에서 사용하는 volatile 키워드에 대해 정리하고자 한다. 1. volatile 이란?- 코어가 변수의 값을 읽어올 때 캐시가 아닌 메모리에서 읽어오도록 변수 앞에 붙이는 키워드 2. 사용 목적- 가시성을 보장한다.(여기서 가시성이란, 공유 데이터를 사용한 다음 동기화 블록을 빠져나가고 나면 다른 스레드가 변경된 최신 값을 즉시 사용할 수 있게 해야 함을 의미한다.)- 변수 접근에 대한 동기화가 큰 오버헤드를 발생시키는 상황에서 대안이 될 수 있다. 3. 한계- 원자적 연산(읽기와 쓰기 작업이 단일 연산)에서만 사용 가능하다.- 스레드를 차단하지 않기 때문에 복잡한 상태 관리에는 적합하지 않다. 4. synchronized 키워드와의 비교- synchronized 키워드는 더 강력한 동기화 ..

IT/Java 2024.12.09

[AWS] EC2 Nginx 무중단 배포

회사에서 운영하는 서비스에서 수정사항 반영 시 매번 EC2 인스턴스를 중단이 필요했고, 이때 서비스를 제공할 수 없기에 이를 해결하기 위하여 Nginx 를 활용한 무중단 배포 도입을 결정했다. 1. 아키텍처 2. 방법- Spring Boot 애플리케이션을 기존 1개에서 2개로 추가 변경- Nginx 관련 설정 파일(ex. nginx.conf 등) 수정하여 리버스 프록시 역할을 하도록 셋팅- 배포 시 사용할 폴더 및 파일(ex. deploy.sh 등) 추가하여 해당 쉘 스크립트를 실행하면 배포가 진행되도록 셋팅 3. 상세- 3.1. Nginx 관련 설정 파일 수정  - /etc/nginx 폴더에 nginx.conf 파일  - include /etc/nginx/sites-enabled/*; 로 작성된 부분이..

IT/AWS 2024.12.05

[AWS] DynamoDB 연동기

회사에서 NoSQL 도입을 고려하다가 AWS 를 사용하고 있기에 DynamoDB 연동을 검토해봤다.그 과정에서 알게 된 설정 관련 내용을 정리하고자 한다. 1. 환경 설정- build.gradle 에 의존성(dependency) 추가implementation platform('software.amazon.awssdk:bom:2.20.85')implementation 'software.amazon.awssdk:dynamodb-enhanced' 참고) Spring Boot 버전에 따라 라이브러리 버전도 변경 필요할 수 있다. - application.properties 파일에 설정 추가amazon.dynamodb.accessKey=XXXamazon.dynamodb.secretKey=XXX2. Configur..

IT/AWS 2024.11.29