본문 바로가기

전체 글43

flatMap과 map 구분해서 사용하기 flatMap과 map은 둘 다 함수형 프로그래밍에서 사용되는 메소드로 컬렉션 내부의 요소들에 대해 변환 작업을 하는 데 사용한다. map map은 'A를 B로 바꾼다' 한마디로 정리할 수 있다. 컬렉션의 각 요소를 주어진 조건에 따라 변화시키고 새로운 컬렉션을 반환한다. 원래의 컬렉션과 동일한 크기를 가진다는 것이 특징이다. flatMap과 비교해보면 크기의 의미가 무엇인지를 알 수 있다. val numbers = listOf(1, 2, 3, 4, 5) val squares = numbers.map { x -> x * x } // [1, 4, 9, 16, 25] 정수 1, 2, 3, 4, 5가 들어있는 컬렉션의 요소들을 제곱하고 싶다면 map을 이용하면 된다. A -> B로 바꾸는 것이 map이기 때문.. 2023. 3. 23.
Error: READONLY You can't write against a read only replica 현재 그림과 같은 형태로 Redis를 Master-Replica 패턴으로 Deploy해서 사용하고 있다. 사용하고 있는 전력이 약해서인지 문제가 있는 건지 아직 명확한 요인은 파악하지 못했지만, 컴퓨터가 셧다운 되는 현상이 발생했다. 그 때문인지 Redis와 Sentinel이 계속해서 연결 요청을 보내다가 엉켜 Master를 잘못 가리키고 있는 문제가 발생했다. 누가 Master인지 확인 하는 cli command는 나중에 글을 쓰도록 하겠다. 데이터센터의 장애의 원인중 하나로 전력 공급 불가로 일어나는 일이며 기업에서도 종종 겪는 문제이다. 다시 전원을 공급하고 Redis를 사용하려고 하면 READONLY You can't write against a read only replica와 같은 에러 메세지.. 2023. 3. 9.
Redis Sentinel 이해하기 단기간 동안 살아있는 인증번호라던가 특정 시간 동안 유효해야 하는 토큰 같은 경우 일반적으로 Redis를 이용하여 보관한다. 만약 Redis에 장애가 생기기라도 한다면 운영되고 있는 서비스에 큰 영향을 주게 된다. 특히 인증, 인허와 같은 개념이 필요한 서비스는 더욱 그렇다. Redis는 Disk 기반이 아닌 인메모리 데이터 베이스이기 때문에 영속성이 보장되지 않는다. 즉, 장애가 발생하면 데이터가 모두 유실될 수도 있다는 말이다. 이를 해결하기 위해서 복제본을 만들어두고 원본이 되는 Redis에 장애가 생겼을 때 복제본의 데이터를 가져다 쓸 수 있다. Redis에서 제공하는 High Availibility 기술로는 Master-Slave 형태의 Replication을 제공한다. 소프트웨어 아키텍쳐 패턴.. 2023. 3. 2.
포인터와 구조체 포인터 (Pointer) 메모리의 주소값을 저장하는 변수이다. 이 변수에 어떤 값의 주소를 제공해주면 해당 주소를 가리키고, 이를 따라 접근도 가능하다. char형 변수는 문자를 저장하고, int형 변수는 정수를 저장하는 것처럼 포인터는 주소값을 저장한다. 포인터의 연산자는 주소 연산자(&), 참조 연산자(*)로 나뉜다. 주소 연산자 : 변수의 이름 앞에 사용하여 해당 변수의 주소값을 반환 참조 연산자 : 포인터의 이름이나 주소 앞에 사용하여 포인터에 가리키는 주소에 저장된 값을 반환 #include int main(){ int a = 1; printf("%x", &a); return 0; } 결과 : 6fdff118 주소 연산자를 알아내기 위해서 변수 이름 앞에 '&'를 붙여 출력했다. 변수 a는 메모.. 2023. 1. 31.
디자인패턴 시리즈 14. 인터프리터 패턴 (Interpreter Pattern) 인터프리터 패턴 (Interpreter Pattern) 자주 등장하는 문제를 간단한 언어로 정의하고 재사용한다. 코드에 적용해보기 언어로 정의한다는 말은 약속을 한다는 뜻이다. 예를 들어 1 add 1은 피연산자: 1, 연산자: +, 피연산자: 1로 해석된다. add라는 명령을 사용했을 때 약속된대로 이를 해석하는 패턴이 바로 인터프리터 패턴이다. 대표적인 예시로 정규표현식이 있다. 일종의 패턴을 만들어 \d는 숫자를 의미하고, ^A는 A로 시작한다는 의미이다. 매번 문자열에서 어떤 패턴을 찾는 로직을 만드는 것보단 규칙을 정의하고 이를 해석하는 것이 더 낫다고 판단했기 때문이다. 다만 이를 남발하는 것은 좋지 않다. 인터프리터 패턴은 언어의 문법이 복잡해질수록 관리할 클래스가 많아져 오히려 복잡해진다... 2023. 1. 30.
대용량 데이터 처리를 위한 Message Broker 메세지 브로커 (Message Broker) 대용량 데이터 처리를 위한 미들웨어(서로 다른 어플리케이션이 서로 통신하는데 사용되는 소프트웨어)이다. 일반적으로 데이터를 3개의 어플리케이션들이 데이터를 주고 받으려면 3개의 커넥션이 필요하다. 어플리케이션이 2개만 더 늘어나도 커넥션은 10개로 늘어난다. 어플리케이션의 개수가 늘어날수록 커넥션의 개수도 기하급수적으로 늘어나게 된다. 이들의 연결 관계는 점점 복잡해지고 프로그램의 확장도 어려워진다. 어플리케이션들의 연결을 한 곳으로 모아 관리하는 소프트웨어가 있다면 구조는 더욱 간단해진다. 이것이 바로 미들웨어의 힘이다. 어플리케이션들의 사이에서 서로 통신할 수 있게 하고, 데이터를 주고 받을 수 있게 하는 분산 소프트웨어이다. 메세지 브로커도 미들웨어의 종.. 2023. 1. 30.