728x90

Base 58

Gradle 에서 SNAPSHOT 버전 의존성 관리

조직 내부에서 사용되는 라이브러리는 SNAPSHOT 버전으로 만들어서 내부 Nexus 에 저장해서 사용하곤 한다. 빌드툴에서는 기본적으로 버전이 변경될 경우에만 원격저장소와 로컬저장소의 의존성을 비교해서 더 최근버전일 경우 로컬저장소로 다운로드해서 빌드에 활용한다. 하지만 내부에서 사용해서 수정이 잦은 라이브러리의 경우 매번 버저닝을 하기도 번거롭고 이를 사용하는 곳도 버저닝을 적용해야 하는 번거로움 때문에 버저닝 없이도 원격저장소와 로컬저장소를 비교하게 하고 싶을 수 있다. 이를 위한 pom.xml 설정이 아래와 같다. ... ... ... true always true always updatePolicy 가 언제 원격저장소와 로컬저장소를 비교할지에 대한 설정인데 SNAPSHOT 버전은 이렇게 지정하지..

Base/CI, CD 2023.02.02

jenkins kubernetes 연동

Jenkins 에서는 Kubernetes 환경을 위한 플러그인을 제공한다. Jenkins 에서는 마스터노드에서 전체 잡을 관리하지만 실제 잡 수행은 슬레이브 노드에서 하도록 하는 것이 일반적인데 이 경우 슬레이브 노드가 실제로 아무일도 하지 않는 유휴시간 동안에도 자원을 차지한다는 단점이 있다. 이에 Kubernetes 일 경우 슬레이브 노드 대신 컨테이너에서 잡을 수행하도록 하고 작업이 끝나면 해당 컨테이너도 종료하는 방식이다. 그림으로 표현하자만 대략 아래와 같다. 이를 위해서는 일단 마스터노드에서 Kubernetes 클러스터를 연동해야 하는데 자꾸 헷갈려서 그 방식을 기록해둔다. 사용한 Jenkins 버전은 Jenkins 2.361.4 이다. 아래 메뉴에서 연동할 클러스터 정보를 입력할 수 있다. ..

Base/CI, CD 2022.12.01

Gradle Core Plugins (plugin is not in 'org.gradle' namespace)

gradle 에서 특정 플러그인의 버전을 올리면 아래와 같은 에러가 뜨면서 의존성 갱신이 안되는 경우가 있다. Plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.7.20'] was not found in any of the following sources: * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Exception is: org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.7.20'] w..

Base/CI, CD 2022.10.28

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

maven default properties

pom/project 빌드 : ${project.build.directory} = ${pom.build.directory} = ‘target’; 빌드 : ${project.build.outputDirectory} = ‘target/classes’; 프로젝트 이름 : ${project.name} = ${pom.name} = / 엘리먼트 설정 값; 프로젝트 버전 : ${project.version} = ${pom.version} = ${version} = / 엘리먼트 설정 값; 최종 파일 이름 : ${project.build.finalName}= // 엘리먼트 설정 값 settings 로컬 저장소 경로 : ${settings.localRepository} environment variable 시스템 PATH..

Base/CI, CD 2022.04.27

서로 다른 사설 네트워크 서버끼리 통신하기

기본적으로 동일 네트워크 내에 구성된 서버는 아무것도 하지 않더라도 서로 통신이 가능하다. 선으로 직접 연결되어 있기 때문이다. 동일 네트워크란 한 회사의 건물이라고 생각하면 된다. 그런데 네트워크 보안에서 우리가 사용하는 인터넷은 어떠한 자료가 오고갈지 모르는 위험한 공간으로 인식되기 때문에 동일 네트워크 내에 있는 서버라고 할지라도 일부 서버만 인터넷에 연결을 해 놓는다. 예를들어 건물에서 서버가 있는 층이 1~3층 이라고 한다면 3층에 있는 서버들만 인터넷에 연결을 해놓는 것을 말하며 이 경우 1, 2층은 내부망 3층은 외부망이라고 부르며 이러한 환경을 망분리 환경이라고 한다. 외부망에는 공인IP가 할당된 OpenApi 서버 혹은 프록시 서버들이 위치하게 될 것이고 내부망에는 사설IP가 할당된 비즈..

Base/개념정리 2022.04.27

ResponseTimeout, ReadTimeout, WriteTimeout

네트워크 통신을 담당할 클라이언트를 구성하다보면 위와 같은 타임아웃 설정을 필수로 하게 된다. 대충 알겠으나 항상 헷갈려서그 의미를 명확하게 정리해 놓는다. 일반적으로 통신은 그 요청이 Read 인지 Write 인지에 따라 아래와 같이 수행된다. ReadRequest 1. 클리이언트에서 서버로 읽기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 응답값 전송의 시작을 알림 3. 서버에서 응답 데이터 전송 시작 4. 서버에서 응답 데이터 전송 종료 WriteReeust 1. 클리이언트에서 서버로 쓰기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 데이터를 보내라고 알림 3. 클라이언트에서 쓰기 데이터 전송 시작 4. 클라이언트에서 쓰기 데이터 전송 종료 ResponseTimeout은 위에서 공통으..

Base/개념정리 2022.04.19
728x90