전체 글

신승환의 기술 블로그
RUST

[RUST] 뮤텍스(Mutex) 란

뮤텍스 (Mutex) 란 무엇인가? Mutex란 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아주는(동기화 대상이 하나)  임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이  서로 겹치지 않고 각각 단독으로 실행(Mutual Exclusion) 되도록 하는 기술이다.  뮤텍스는 세마포어의 한 종류로써, 바이너리 세마포어 (binary semaphore) 라고 불리기도 한다.    뮤텍스 (Mutex) 의 작동 방식 1) Locking 스레드가 뮤텍스를 획득하려고 할 때,  뮤텍스가 이미 다른 스레드에 의해 잠겨 있지 않다면,  해당 스레드는 뮤텍스를 잠그고 자원에 접근한다...

RUST

[RUST] Semaphore (세마포어)

Semaphore (세마포어) 란 무엇인가? 세마포어는 주로 동시에 수행될 수 있는 작업의 수를 제한하는 데 사용되는 동기화 도구다.  세마포어는 일종의 카운터로,  이 카운터는 동시에 실행될 수 있는 스레드나 프로세스의 최대 수를 나타낸다.  스레드가 세마포어를 사용하려고 시도할 때마다,  세마포어의 카운트가 감소하고, 스레드가 작업을 완료하면 카운트가 증가한다.  카운트가 0이 되면, 다른 스레드는 세마포어가 다시 사용 가능해질 때까지 대기해야 한다.   Semaphore (세마포어) 의 동작 방식 예를 들어 특정 작업을 멀티스레드를 사용해서 실행시키려고 한다고 가정해 보자. 4개의 스레드를 사용할 것이며, 세마포어 카운트는 2라고 가정해 보자. 그럼 아래와 같은 그림으로 도식화가 가능하다.   각 ..

RUST

[RUST] Rc, Arc 란

Rust에서 Arc와 Rc는 둘 다 참조 카운팅 방식의 스마트 포인터이다. 이들은 메모리 관리를 자동화하여, 동적으로 할당된 데이터의 생명주기를 관리하는 데 사용된다. 그러나 두 스마트 포인터는 사용되는 환경(멀티 스레드  대 단일 스레드)에 따라 구분된다.   Rc (Reference Counted) Rc는 Reference Counted의 약자로, 단일 스레드 환경에서만 사용되도록 설계된 참조 카운팅 스마트 포인터이다. Rc는 여러 부분에서 동일한 데이터에 대한 소유권을 공유할 수 있게 해 준다. 이는 특정 데이터에 대한 여러 소유자를 허용하고, 그 데이터가 더 이상 필요하지 않을 때 자동으로 메모리를 해제한다. Rc는 Thread-safe(스레드-안전) 하지 않으며, 따라서 멀티 스레드 환경에서는 ..

Redis

[REDIS] 좋아요 구현

소셜 커머스나 소셜 네트워크 사이트를 서핑하다 보면, 항상 특정 게시물에 대한 "좋아요" 기능이 있는 걸 볼 수 있다.  그럼 해당 "좋아요" 기능은 어떤식으로 구현할 수 있을까? 첫 번째로는 아래와 같이 RDBMS에 좋아요 정보를 저장하는 방법이 있다.    RDBMS로 좋아요를 구현할 때의 장점  1) 데이터 무결성과 일관성 RDBMS는 엄격한 데이터 무결성 규칙을 제공하며, ACID(Atomicity, Consistency, Isolation, Durability)  속성을 통해 데이터의 정확성과 일관성을 보장한다. 이는 좋아요 수와 같이 정확한 계산이 필요한 기능에 적합하다.   2) 복잡한 쿼리와 조인 지원 관계형 데이터베이스는 복잡한 쿼리와 다양한 테이블 간의 조인(JOIN)을 지원한다. 사용..

보안

[보안] CORS (Cross-Origin Resource Sharing)

CORS 란? CORS는 Cross-Origin Resource Sharing(교차 출처 리소스 공유)의 줄임말이다. CORS(Cross-Origin Resource Sharing)는 웹 페이지가 다른 도메인의 리소스를 요청할 수 있도록 브라우저에게 허용하는 보안 메커니즘이다. 원래 브라우저는 보안상의 이유로 같은 출처 정책(Same-Origin Policy)을 사용하여, 스크립트가 다른 출처(origin)로부터 가져온 리소스들과 상호작용하는 것을 제한한다. 출처 란? ‘출처’란 프로토콜(HTTP, HTTPS), 호스트(도메인), 포트를 합친 것을 의미한다. 출처를 알기 위해서는 URL 구조를 알아야 한다. 프로토콜의 80, 443 은 각각 HTTP, HTTPS와 대응되기 때문에 생략이 가능하다. 같은 ..

보안

[보안] SQL Injection 실습

SQL Injection 이란? SQL Injection은 보안 취약점을 이용한 공격 방식 중 하나로, 악의적인 사용자가 웹 애플리케이션의 입력 필드에 SQL 구문을 삽입하여 백엔드 데이터베이스에 영향을 주는 기술이다. 이를 통해 공격자는 데이터베이스에서 데이터를 조회, 수정, 삭제할 수 있으며, 경우에 따라서는 데이터베이스 서버의 제어권을 획득할 수도 있다. 작동 원리 웹 애플리케이션은 사용자로부터 입력받은 데이터를 SQL 쿼리에 활용하여 데이터베이스와 통신한다. SQL Injection은 이러한 과정에서 사용자 입력을 제대로 검증하거나 처리하지 않았을 때 발생한다. 공격자는 특별히 조작된 입력값을 통해 의도치 않은 SQL 명령을 실행하도록 만들 수 있다. 예시 SQL Injection의 예시를 위..

RUST

[RUST] 트레이트 (Traits)

트레이트 (Traits) 란? Rust에서 트레이트(trait)는 특정 타입이 구현해야 하는 동작을 정의하는 방법이다. 즉, 트레이트는 하나 이상의 메서드를 가지고 있으며, 이 메소드들을 구현하는 타입은 해당 트레이트의 기능을 제공하게 된다. 트레이트는 자바의 인터페이스나 C#의 인터페이스에 비슷하며, 다른 언어에서는 프로토콜이라고도 불린다. 트레이트의 목적 추상화 트레이트를 사용하여 다양한 타입에 공통적인 동작을 추상화할 수 있다. 이를 통해 타입에 관계없이 일관된 방식으로 메서드를 호출할 수 있다. 확장성 기존의 타입에 새로운 트레이트를 구현함으로써 해당 타입의 기능을 확장할 수 있다. 이는 기존 코드를 변경하지 않고도 타입에 새로운 기능을 추가할 수 있게 해 준다. 제네릭 프로그래밍 트레이트를 사용..

RUST

[RUST] 제네릭 (Generics)

제네릭 (Generics) 이란? Rust에서 제네릭(generics)은 다양한 데이터 타입에 대해 동작할 수 있는 함수나 구조체, 열거형(enum), 메서드를 작성할 수 있게 해주는 프로그래밍 기능이다. 제네릭을 사용하면 코드 중복을 줄이고, 타입 안전성을 유지하면서도 유연성을 높일 수 있다. 제네릭의 사용 예시 제네릭을 사용하는 가장 기본적인 예는 함수에서 여러 타입을 처리할 수 있도록 하는 것이다. 예를 들어, 특정 리스트 내의 최대값을 반환하는 함수를 작성하고 싶다고 가정 보자. 다음은 제네릭을 사용하여 어떤 타입의 리스트 값에 대해서도 동작할 수 있는 함수를 만드는 방법을 보여준다. 함수에서의 제네릭 사용 아래의 예제는 i32 배열에서 가장 큰 수를 찾는 함수 largest_i32() char ..

RUST

[RUST] Error

RUST의 Error Type Rust에서는 에러를 크게 두 가지 범주로 나누어 다룬다. 복구 가능한 에러(Recoverable Errors)와 복구 불가능한 에러(Unrecoverable Errors). 1. 복구 가능한 에러 (Recoverable Errors) 복구 가능한 에러는 일반적으로 프로그램의 실행을 중단시키지 않고 처리할 수 있는 에러를 말한다. 이러한 에러는 주로 예상 가능하며, 프로그램이 에러 상황을 감지하고 적절히 대응할 수 있다. Rust에서는 Result 타입을 사용하여 복구 가능한 에러를 처리한다. 예를들어 아래는 특정 파일을 열어보는 예제이다. 해당 파일이 없을때는 에러를 반환해준다. use std::fs::File; fn main() { let file = File::open..

RUST

[RUST] ENUM

ENUM 이란? Rust에서 enum은 열거형 타입으로, 여러 개의 다른 값들 중 하나의 값을 가질 수 있는 타입이다. Enumeration (열거) 에서 기원한 키워드이다. 이는 Rust의 강력한 타입 시스템과 패턴 매칭 기능을 활용하여 다양한 종류의 데이터를 안전하고 효율적으로 처리할 수 있게 해준다. ENUM 의 특징 1) 다양한 값 정의가 가능 enum을 사용하여 서로 다른 값들을 정의할 수 있다. 각각의 값은 enum 타입의 '변종(variant)'이라고 불린다. 예를 들어, 트래픽 신호등의 상태를 나타내는 enum을 정의할 수 있다. (Red, Yellow, Green.) #[derive(Debug, PartialEq)] enum Color { Red, Green, Blue } fn mai..

ssh9308
신승환의 기술 블로그