728x90

분류 전체보기 287

[Kotlin] 생성자 매개변수 선언시 val, var

Kotlin에서 var, val 키워드는 각각 변수, 상수를 의미한다는 것은 매우 기본적인 사실이다. 그런데 이러한 키워드를 함수나 메소드의 매개변수에 사용하진 않는다. Java 에서도 private, public 같이 변수 앞에 선언할 수 있는 키워드가 있지만 매개변수 선언시에는 이를 사용하지 않고 오히려 컴파일 오류를 일으킨다. Kotlin 에서도 마찬가지이고 var, val 도 마찬가지다. 그런데 Kotlin 에서는 var, val 는 물론이고 private, public 같은 키워드도 포함할 수 있는 매개변수가 존재한다. 바로 생성자의 매개변수인데 private, public 은 우리가 익히 알고 있듯이 해당 변수를 외부에 해당 변수를 공개하느냐 마느냐 하는 것이라는 것을 쉽게 알 수 있지만 va..

Backend/Kotlin 2022.09.02

Kubernetes 클러스터에 MongoDB 구성하기

kubernetes 에 MongoDB 를 replica set 으로 구성해서 사용해본다. MongoExpress 도 함께 설치할 예정인데 MongoExpress는 MongoDB 관리를 위한 GUI 웹어드민 툴이다. 우선 replica set 구성을 위해서는 각 노드가 통신할 수 있는 인증 key 가 필요하고 kubernetes 환경에서는 특정 key 파일을 secret 로 만들어서 각 노드에서 활용한다. 즉, 아래와 같다. openssl rand -base64 741 > ./replica-sets-key.txt kubectl create secret generic shared-bootstrap-data --from-file=internal-auth-mongodb-keyfile=./replica-sets-..

Backend/Database 2022.08.31

StatefulSet

상태를 유지하는 데이타베이스와 같은 애플리케이션을 관리하기 위한 컨트롤러가 StatefulSet 컨트롤러이다. (StatefulSet은 쿠버네티스 1.9 버전 부터 정식 적용 되었다. ) Pod 이름에 대한 규칙성 부여 StatefulSet에 의해서 생성되는 Pod들의 이름은 규칙성을 띈다. 생성된 Pod들은 {Pod 이름}-{순번} 식으로 이름이 정해진다. 예를 들어 Pod 이름을 mysql 이라고 정의했으면, 이 StatefulSet에 의해 생성되는 Pod 명들은 mysql-0, mysql-1,mysql-2 … 가 된다. ​ 배포시 순차적인 기동과 업데이트 또한 StatefulSet에 의해서 Pod가 생성될때, 동시에 모든 Pod를 생성하지 않고, 0,1,2,.. 순서대로 하나씩 Pod를 생성한다. ..

Charles Proxy

모바일 디바이스에서의 통신내역을 프록싱 할 수 있다. 무료버전도 있고 유료버전도 있다. 무료버전은 일정시간이 지나면 자동으로 종료되어 다시 실행해줘야 했던 것으로 기억한다. 회사에 소속되어 있고 모바일 관련된 개발을 한다면 거의 필수품이니 사달라고 하자. 맥북기준 설정방법은 아래와 같다. 1. https://www.charlesproxy.com/ 애서 다운받아 맥북에 설치하고 실행 2. 맥북에 설치된 Charles 인증서 신뢰설정 3. Proxy > macOS Proxy 체크 해제 4. Help > Local IP Adress 에서 로컬 아이피 확인 4. Proxy > Proxy Settings... 에서 Port 확인(입력 안되어 있으면 8888으로 셋팅) 5. 연결하려는 스마트폰에 Pulse Secu..

ETC 2022.08.09

[SpringBoot] SpringMVC 에서 WebClient 사용시 주의사항

WebClient 는 Spring 에서 제공하는 RestClient 의 한 종류이다. 과거에 사용되던 RestTemplate 과 비슷한 역할이라고 생각하면 되는데 RestTemplate 는 장기적으로 Deprecated 예정이기 때문에 이제는 WebClient 를 사용해야 한다. WebClient 의 가장 큰 특징은 RestTemplate 과 다르게 논블로킹을 지원한다는 것이다. 말만 들으면 성능에 굉장한 이득이 있을 것 같지만 논블로킹 방식으로 사용하지 않으면 RestTemplate 을 사용하는 것과 차이가 없다. WebClient 의 응답값은 Mono 또는 Flux 타입이다. Mono, Flux 는 리액티브 스트림을 구성하는 파이프라인의 일부로 웹플럭스에서는 기본적으로 논블로킹 처리되지만 Spring..

Backend/Spring+Boot 2022.07.28

WebClient max connection 그리고 mutate()

max connection 의 default는 원래 기본적으로 제한이 없었으나 최근 버전에서는 호스트당 500개로 제한되어 있는 상태이다. 물론 이 값은 커스텀 할 수 있다. 그런데 이 사실을 알고나니 mutate() 대해 궁금해졌다. 난 WebClient를 호스트별로 mutate() 해서 사용했는데 만약 이때마다 새로운 인스턴스가 생성되는거라면 불필요하게 많은 WebClient 를 생성하게 되는거다. 그런데 서칭해보니 WebClient 는 한번 빌드한 뒤에는 이뮤터블하고 mutate() 하더라도 동일한 인스턴스가 사용되고 다른 설정값을 가지는 요청을 처리할 수 있게 해줄 뿐이라고 한다.

Backend/Spring+Boot 2022.07.22

Netty

웹플럭스는 프로젝트 리액터와 네티로 구성된다. 이중 네티로 논블로킹-비동기 처리를 지원하고 덕분에 적은 스레드로 많은 트래픽을 처리할 수 있다. 이에 네티에 대해 간단하게 정리해본다. 네티는 각각의 요청을 채널로 받고 채널에서 발생하는 이벤트들을 이벤트 큐에 쌓아놓는다. 그리고 이벤트 루프가 이를 가져와서 처리하는 구조이다. 여기에서 이벤트 루프란 이벤트를 실행하기 위한 무한루프 스레드를 말한다. 이벤트 루프는 지원하는 스레드 종류에 따라 단일 스레드 이벤트 루프와 다중 스레드 이벤트 루프로 나뉘고 이벤트 루프가 처리한 결과를 돌려주는 방식에 따라 콜백 패턴과 퓨처 패턴으로 나뉜다. 여기에서는 단일 스레드 이벤트 루프와 콜백 패턴은 생략하고 웹플럭스에서 사용되는 다중 스레드 이벤트 루프와 퓨처패턴 위주로..

Base/개념정리 2022.07.21

리액티브 프로그래밍

일단 블로킹에 대해 정확히 집고 넘어가자. 블로킹 상태는 스레드가 CPU 자원은 점유하고 있지만 무언가 일을 하는게 아니고 다른 무언가의 응답을 기다리는 대기상태를 의미한다. 예를 들어 수백번의 for문을 돌리는 로직을 수행하는 동안은 스레드가 열심히 일을 하고 있는 상태이기 때문에 블로킹 상태가 아니다. 일하는 만큼 CPU 자원을 사용하는 것이기 때문에 비효율도 없다. 반면, DB/API 통신과 같은 I/O 작업의 경우 스레드는 응답결과를 기다리는 동안 대기상태가 되고 일은 하지 않으면서 CPU 자원을 점유하고 있는 비효율이 발생한다. 또한 톰캣에서는 스레드풀 지정된 스레드를 만들어 놓고 재사용하는데 이러한 블로킹 상태가 오래 지속되는 스레드가 많아진다면 가용한 스레드 부족으로 요청을 제대로 처리하지 ..

Base/개념정리 2022.07.19

C10K

C10K는 Current 10 thousand clients 의 약자로 1만개의 클라이언트를 동시에 처리할 수 있는 네트워크 I/O 모델을 설계 방법을 묻는 말이다. 여기서 동시 처리의 기준이 되는 시간은 정확히 명시하지 않았지만, 보통은 1초를 뜻한다. 과거에는 하드웨어가 비싸고 스펙도 낮아서 수 많은 동시접속을 처리해야 하는 웹사이트를 구축함에 앞서 C10K 는 꼭 집고 넘어가야 하는 문제였다. 과거에 비해 하드웨어가 싸고 스펙도 좋아졌지만 과거에 비해 인터넷이 더 활성화된 지금 10만개 또는 100만개의 클라이언트를 처리해야 할 수 있기 때문에 이 문제는 여전히 유효하다. 그렇다면 네트워크 I/O 모델에는 어떤 것들이 있을까? 블로킹과 논블로킹, 동기와 비동기, 싱글스레드와 멀티스레드 방식이 존재한..

Base/개념정리 2022.06.14
728x90