파이썬 내장함수 bit_length, 이진수 길이, bit_count, 이진수 1의 개수
·
Python
bit_length 이진수로 정수를 나타내는 데 필요한 비트 수 반환 (버전 3.1에 추가) n = -37 bin(n) # -0b100101 n.bit_length() # 6 x 가 0이 아니면, x.bit_length() 는 2**(k-1)
[gRPC] gRPC 개요, MSA 서비스간 통신, gRPC vs REST
·
MSA
마이크로 서비스간 통신 이슈 MSA에서는 여러 모듈로 분리되어있고 동일 머신에 존재하지 않을 수 있습니다. 따라서 일반적으로는 보편화된 방식인 REST 통신을 통해 메시지를 주고 받습니다. TTP 1.0은 요청/응답을 하기에 앞서 매번 Connection을 맺고 끊어야했기 때문에 연결 요청/해제 비용이 상당히 높았습니다. RPC Remote Procedure Calls 다른 컴퓨터의 프로그램의 프로시저를 실행하는 프로그램을 허용하는 프로토콜 개발자가 원격 상호 작용에 대한 세부 정보를 명시적으로 코딩하지 않아도 됨 프레임워크가 자동 핸들링 클라이언트 코드에서는 직접 서버 코드의 함수를 호출하는 것처럼 보임 gRPC google Remote Procedure Call 구글에서 만든 원격 프로시저 호출 프레..
Spring Batch, 배치와 스케줄러의 차이, Job, Tasklet, Chunk
·
Spring
배치 배치는 실시간으로 처리하는것이 아닌 처리할 작업물들을 모아 한번에 처리하는 것 예를들어 1년간 접속하지않은 모든 회원들을 휴먼계정으로 처리하는 등 일반적인 비즈니스로직이 아닌 상황에 대해서 처리해주는 프로세스 배치와 스케줄러의 차이 배치 스캐쥴러 일괄 처리 정해진 시간에 자동으로 실행 사용자의 명령이 있을 때 실행 주기적으로 실행 Batch Job을 관리(Job을 구동하거나 실행시키는 기능 X ) Job, Tasklet, Chunk Job 배치 처리 과정을 하나의 단위로 만든 객체 배치 처리 과정에 있어 전체 계층의 최상단에 위치 1개 이상의 Step을 가짐 Job 안에는 여러 개의 Step이 존재하고, Step 안에는 Tasklet 또는 {Reader, Processor, Writer} 묶음이 존..
[JPA] @Lock 비관적 락, PESSIMISTIC_WRITE, 타임아웃, 트랜잭션
·
JPA
낙관적 락 @Version을 사용 트랜잭션을 커밋하는 시점에 충돌을 알 수 있음 비관적 락 선점 잠금 데이터베이스 트랜잭션 락 메커니즘에 의존하는 방식 SQL 쿼리에 select for update 구문을 사용하면서 시작 버전 정보는 사용하지 않음 JPA 락 옵션 낙관적 락 OPTIMISTIC 낙관적 락을 사용한다. 낙관적 락 OPTIMISTIC_FORCE_INCREMENT 낙관적 락 + 버전정보를 강제로 증가한다. 비관적 락 PESSIMISTIC_READ 비관적 락, 읽기 락을 사용한다. (공유 잠금) 비관적 락 PESSIMISTIC_WRITE 비관적 락, 쓰기 락을 사용한다.(배타적 잠금) 비관적 락 PESSIMISTIC_FORCE_INCREMENT 비관적 락 + 버전 정보를 강제로 증가한다. 기타 ..
Kubernetes 인그레스(Ingress), 로드밸런서 LoadBalancer, metallb
·
Kubernetes
Ingress, Ingress Controller 인그레스를 사용하면 L7의 웹 요청을 해석해서 단일 IP, 단일 포트로 다수의 도메인과 서비스로 연결할 수 있음 쿠버네티스에서 기본적으로 지원하는 인그레스 오브젝트는 클라우드 환경이 아니면 사용할 수 없음 클라우드에서 인그레스를 생성하면 외부에 게이트웨이를 생성하고 각 기능에 맞게 서비스에 연결 쿠버네티스에서 Ingress를 사용하기 위해서는 두 가지가 필요 첫 번째는 YAML 파일에서 kind: Ingress 로 정의되는 Ingress 오브젝트 두 번째는 Ingress 규칙이 적용될 Ingress Controller YAML 파일로부터 Ingress를 생성해도 아무 일도 일어나지 않음 Ingress는 단지 Ingress 규칙을 정의하는 선언적인 오브젝트..
[JPA] fetch join, EntityGraph, N+1, Pagination, firstResult/maxResults specified with collection fetch; applying in memory
·
JPA
1. 즉시로딩jpql을 우선적으로 select하기 때문에 즉시로딩을 이후에 보고 또다른 쿼리가 날아가 N+12. 지연로딩지연로딩된 값을 select할 때 따로 쿼리가 날아가 N+13. Fetch Join지연로딩의 해결책사용될 때 확정된 값을 한번에 join에서 select해서 가져옴Pagination이나 2개 이상의 collection join에서 문제가 발생4. EntityGraphHibernate의 Jpql 구문에서의 fetch는 존재하지는 않지만 기존과 마찬가지로 fetch join을 통해 바로 조회할 수 있음@Repositorypublic interface PersonRepository extends JpaRepository, JpaSpecificationExecutor { @NotN..
마이크로서비스 분산 트랜잭션 관리, 보상 트랜잭션, MSA Transaction | Two Phase Commit, Saga Pattern
·
MSA
2PC (Two Phase Commit) 분산 시스템에서 트랜잭션을 변경할 수 있는 기능을 제공하는 방식 Transaction Coordinator가 각 서비스의 Commit. Rollback 을 제어하는 형태로 트랜잭션을 관리함 2PC는 서비스가 증가할수록 시스템의 대기 시간이 길어지며, 이는 응답시간의 증가를 초래함 Lock을 잡아야 하는 Row의 범위가 크거나 트랜잭션 기간이 긴 경우 시스템에 엄청난 대기시간을 발생하므로 수명이 매우 짧은 작업에만 사용하는 것을 권장 마이크로서비스 전체에서 상태 변경을 조정하기 위해 2PC와 같은 분산 트랜잭션을 사용하지 않는 것이 좋음 2PC는 결국 Coordinator를 기반으로 강력한 결합을 유도하고, 데이터에 직접적인 Lock을 잡고 처리하기 때문에 서비스간..
[1068] 트리 (리프 노드의 개수 구하기, DFS)
·
Tree
1068번: 트리 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다 www.acmicpc.net import sys sys.setrecursionlimit(10**6) input=sys.stdin.readline n=int(input()) parent=list(map(int, input().split())) deleteNode=int(input()) tree = [[] for _ in range(n)] root=0 for i in range(n): if parent[i]!=-1: tree[parent[i]].append(i) tree[i].append..
[1722번] 순열의 순서 구하기(수학, 구현)
·
Combination
1722번: 순열의 순서 첫째 줄에 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1 ≤ k ≤ N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N개의 수에는 1부터 N www.acmicpc.net 분석 4! = 24 3! = 6 2! =2 1! =1 제일 앞 자리에 사용할 수 있는 숫자 경우의 수 4가지, 다음 3가지, 다음 2가지, 다음 1가지 ➔ N자리의 수로 만들 수 있는 순열의 모든 경우의 수 N! 1. K번째 순열 출력 1) 로직 1. 주어진 값(K)과 현재자리(N) -1에서 만들 수 있는 경우의 수를 비교 2. 1에서 K가 더 작아질 때까지 경우의 수를 배수(cnt)로 증가시킴(순열의 순서를 1씩 늘림) 3. K가..
[RabbitMQ] rabbitMQ Spring Boot Producer, Consumer 생성, MultipleConsumer, prefetch
·
RabbitMQ
0. RabbitMq 설치 및 설정 [RabbitMQ] rabbitmq 설치 및 설정, rabbitmq spring 3.0이상 연동 1. docker로 Rabbit MQ 설치 컨테이너 이름 : rabbitmq 백그라운드로 실행 docker run -d --name rabbitmq -p 5672:5672 -p 8080:15672 --restart=unless-stopped rabbitmq:management 2. management url 접속 # default username, password는 둘다 gue karla.tistory.com 1. RabbitMqProducer 파일 생성 yml 값 변수 매핑 RabbitTemplate 선언 @Service @Log4j2 public class RabbitM..
git submodule / subtree
·
Git
1. submodule Git 저장소안에 다른 저장소가 들어가 있는 개념 상위 저장소에서 서브모듈을 SHA값, 하나의 바이너리처럼 취급하기 때문에 병합 복잡 병합 되는 것이 아닌 최신 커밋의 내용으로 교체됨 (직접 서브모듈을 업데이트한 뒤 병합후 푸쉬해야 함) git submodule add https://github.com/Guts-Gun/KITe_sendManager.git # git submodule add 2. subtree 여러 저장소를 통합하는 개념 서브모듈과는 달리 상위 저장소에 파일을 직접 추가하고 트래킹 (서브트리의 파일 및 변경사항도 상위 저장소에 기록) 서브트의 원격에 있는 소스와 서브트리를 추가한 저장소가 달라도 subtree merge를 활용 양쪽의 변경사항 모두 반영 가능 #gi..
[CICD] Jenkins + ArgoCD + k8s | CI, 젠킨스 파이프라인, Jenkinsfile, MSA
·
Devops
GitHub - Guts-Gun/KITe_backendContribute to Guts-Gun/KITe_backend development by creating an account on GitHub.github.com 구축 순서1. Jenkins Pipeline & Github webhook 설정2. Jenkinsfile 작성3. ArgoCD 구축 Jenkins PipelineJob들을 순차적 혹은 병렬적으로 실행시키거나 작성한 스크립트로 이벤트들을 연속적으로 실행시키는 등의 일을 지원하는 기능Job 하나 작성할 때 대부분 GUI로 제공받아 마우스로 체크해서 설정했다면 Pipeline은 이러한 내용들을 스크립트를 통해 더 딥하고 유연하게 작성할 수 있음작성하려는 배포 플로우가 복잡하다면 pipeline ..
GCP GKE Kubernetes 인그레스(Ingress), 노드포트(Nodeport) 접속
·
Kubernetes
MSA (Micro Service Architecture) 로 개발되어 서비스간의 라우팅이 필요한 구조에서는 Ingress 를 사용 Service의 NodePort : 온프레미스 환경에서 사용 Service의 LoadBalancer: 퍼블릭 클라우드 환경에서 사용 Servic는 클러스터 외부로 PORT를 노출하는 기능과 부하분산기능을 수행합니다. 그리고 이점은 Ingress 도 동일합니다. 차이점은 Ingress는 L7이고 Service는 L4라는 점입니다. 1. 노드 포트 2. 파드 생성 (디플로이먼트) vi web-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web namespace: default spec: selecto..
Spring 제어의 역전(Ioc) ,의존성 주입 (DI), ApplicationContext
·
Spring
IOC (Inversion of Control)제어의 역전이라는 의미애플리케이션 흐름의 주도권을 Spring이 갖는다라는 것객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 함가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 함 IOC 컨테이너는 객체의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 객체의 생명주기를 관리 DI(Dependency Injection)의존성하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것A 객체가 B 객체 없이 동작 불가능한 상황을 'A가 B에 의존적이다'라고 표현 public class Store { private Pencil pencil; public Store() { this.pen..
가장 긴 팰린드롬 (2중 for문 인덱스, 투포인터, 문자열 길이)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/12904 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 1. 2중 for문 완전 탐색 Time: 3926.56 ms def solution(s): answer = 0 for i in range(len(s)): for j in range(i+1,len(s)+1): if s[i:j]==s[i:j][::-1]: answer=max(answer, len(s[i:j])) return answer "abacde" a ab aba abac abacd abac..
확장 유클리드 알고리즘
·
Math
확장 유클리드 호제법 유클리드 호제법 : 두 수의 최대 공약수 구하기 확장 유클리드 호제법 : 방정식의 해 구하기 베주 항등식 (Bezout's Identity) 의 명제를 기반으로 해를 구하는 알고리즘 베주 항등식 (Bezout's Identity) ax + by = d 를 만족하는 (x, y) 정수해는 d 의 값이 gcd(a, b) 의 배수일 때 존재하며, 이 존재하는 경우 나오는 값들만 (x, y) 의 정수해가 될 수 있다. 즉, d % gcd(a, b) == 0 인 경우이다. 만약 4x + 3y = 2 이라는 방적식이 있다고 하자. 이 때 (x, y)의 정수해는 ... ,(-1, 2), (2, -2), (5, -6), ... 등이 된다. 4, 3 의 최대공약수는 1이며 우변의 2는 1의 배수이기 ..
[1948] 임계경로(위상정렬, 에지 뒤집기)
·
Graph
1948번: 임계경로 첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의 www.acmicpc.net 분석 임계경로 : 그래프에서 임계경로란 어떤 시작지점으로부터 끝지점까지의 최장경로를 의미 풀이 """ 임계경로 구하기 1분도 쉬지않고 달려야 하는 사람들이 지나는 도로의 수 : 가장 오랜 시간이 걸리는 사람 → 임계경로, 그에 속한 정점구하기 에지 뒤집기 """ import sys from collections import deque input=sys.stdin.readline n=int(input()) # 도시 수 m=int(inpu..
[11049번] 행렬 곱셈 순서 (행렬 곱 연산 횟수의 최솟값 구하기, DP)
·
DP
11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같 www.acmicpc.net 분석 풀이 import sys imput=sys.stdin.readline # 행렬의 갯수 n=int(input()) # 행렬 m=[] # 최소 연산 횟수 저장 리스트 d=[[-1 for j in range(n+1)] for i in range(n+1)] m.append((0,0)) for _ in range(n): x,y=map(int, input().split()) m.append((x,y)) def execute(s,e): result=sys.m..
[Redis] Spring Boot 연동, 객체 캐싱, MSA에서 사용 시 주의점 Serialize
·
Spring
개발환경 macOS Ventura 13.2 Spring Boot 3.0.1 RELEASE JAVA 17 1. Build.gradle Dependency 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. application.yml 파일 수정 로컬 레디스 spring: redis: # Local Redis lettuce: pool: max-active: 10 max-idle: 10 min-idle: 2 port: 6379 host: 127.0.0.1 password: 쿠버네티스 레디스 spring: data: # K8s Redis Custer redis: cluster: nodes: - redis-cluster.re..
[CDC] kafka Connect, Debezium, JDBC Sink Connector
·
Kafka
Confluent 사의 JDBC Sink Connector 통해 구축 Source DB : MySQL Source Connector: kafka Connect (Source Connector, Debezium) Target DB : Mysql, Oracle Sink Connector : kafka Connect (JDBC Sink Connector) 1. Docker Container 주키퍼, 카프카 docker-compose.yml version: "3" services: zookeeper: container_name: zookeeper image: wurstmeister/zookeeper ports: - "2181:2181" kafka: container_name: kafka image: wurstm..
[Keycloak] MSA에서 키클록 Spring Security 연동 (2) 토큰 발급, 토큰값 확인
·
Spring
[Keycloak] MSA에서 키클록 Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정 개발환경 macOS Spring Boot 2.7.5 RELEASE JAVA 11 1. MSA 서비스 구조 서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를 통해 각 서비스의 api를 호출하는 형태입니다. auth 서비스를 통해 회원가입/로그 karla.tistory.com 1. auth 서비스 - 회원가입 AuthController authService를 통해 keycloack DB에 사용자 생성 후, userService를 통해 부가적인 사용자 데이터를 user DB에 저장 // 회원가입 @PostMapping("/signup") publi..
[Keycloak] OAuth2 MSA에서 키클록 SSO Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정
·
Spring
개발환경macOSSpring Boot 2.7.5 RELEASEJAVA 11 1. MSA 서비스 구조서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를 통해 각 서비스의 api를 호출하는 형태입니다.auth 서비스를 통해 회원가입/로그인 등 계정 및 권한을 관리합니다. (키클록 토큰 발급)  2. gateway 서비스 설정0) 프로젝트 구조📦gatewayserver ┣ 📂src ┃┣ 📂main ┃ ┃ ┣ 📂java ┃ ┃ ┃ ┗ 📂com ┃ ┃ ┃ ┃ ┗ 📂cloud ┃ ┃ ┃ ┃ ┃ ┗ 📂gatewayserver ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GatewayserverApplication.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SecurityConfig.java ┃ ┃ ┗ ?..
JVM (Java Virtual Machine) 개념, JDK, JRE
·
Java
1. 정의 및 특징자바코드로 작성된 프로그램이 CPU나 운영체제 등의 환경에 상관없이 독립적으로 동일하게 동작될 수 있게 만들어진 프로그램자바코드로 작성된 프로그램은 컴파일될 때, 컴파일러(javac)에 의해 바이너리 코드로 변환된 .class 파일로 변환되는 것을 볼 수 있는데 이 파일을 JVM으로 실행시키기 때문에 동일하게 동작될 수 있음때문에 JVM이 구동될 수 있는 환경이라면 모두 실행이 가능하기 때문에 높은 이식성을 보인다. 2. JVM의 실행과정JVM은 Class Loader, Execution Engine, Runtime Data Area, Garbage Collector 4가지의 구성으로 나눌 수 있다.정리부터 하자면 컴파일된 소스코드(.class)를 Class Loader를 통해 Runt..
[Spring Webflux] WebClient (HTTP 클라이언트)
·
Spring
WebClientRestTemplate를 대체하는 HTTP 클라이언트기존의 동기 API를 제공할 뿐만 아니라, 논블로킹 및 비동기 접근 방식을 지원해서 효율적인 통신이 가능요청을 나타내고 전송하게 해주는 빌더 방식의 인터페이스를 사용외부 API로 요청을 할 때 리액티브 타입의 전송과 수신(Mono, Flux)싱글 스레드 방식을 사용 Non-Blocking & Synchronouse2024.06.13 - [Spring] - [Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe [Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe2024.06.10 - [CS/OS] - 동기 VS 비동기, 블로킹 V..
[Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe
·
Spring
2024.06.10 - [CS/OS] - 동기 VS 비동기, 블로킹 VS 논블로킹 동기 VS 비동기, 블로킹 VS 논블로킹동기(Synchronous) vs 비동기(Asynchronous)Synchronous작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함Thread1이 작업을 시작시키고, Task1이 끝날때까지 기다렸다 Task2를 시작작업 요청을karla.tistory.com  본사에서 클라이언트로부터 도서 정보 조회 요청을 받으면 지점으로 도서 정보 조회 API 요청 보내는 예시코드(클라이언트 ↔️ 본사 ↔️ 지점) Spring MVCBlocking 방식: 스레드가 차단됨다섯개의 책을 조회하는 API호출 지연시간 : 약 25초 정도(호출당 5초 지연)// 본사 API Server: R..
[Spring WebFlux] 2. 리액티브 스트림즈(Reactive Streams)
·
Spring
리액티브 스트림즈 (Reactive Streams)리액티브 라이브로리를 어떻게 구현할지 정의해 놓은 별도의 표준 사양데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하깊 위한 리액티브 라이브러리의 표준 사양RxJava, Reactor(Spring Framework와 가장 궁합이 잘맞음), Akka Streams, Java 9 Flow API 등 리액티브 스트림즈 구성요소컴포넌트설명Publisher 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할Subscriber구독한 Publisher로부터 통지(발행, 게시, 방출)된 데이터를 전달받아서 처리하는 역할SubscriptionPublisher에 요청할 데이터의 개수를 지정하고, 데이터의 구독을 취소하는 역할ProcessorPublis..
[Spring WebFlux] 1. 리액티브 프로그래밍
·
Spring
리액티브 프로그래밍(Reactive Programming)리액티브 시스템을 구축하는데 필요한 프로그래밍 모델리액티브 시스템은 비동기 메시지 통신을 기반으로 한다리액티브 시스템에서의 비동기 메시지 통신은 Blocking I/O 방식이 아닌, Non-Blocking I/O  방식의 통신선언적 프로그래밍, 실행할 동작을 구체적으로 명시하지 않고 목표만 선언데이터 소스의 변경이 있을 때마다 데이터 전파리액티브 프로그래밍 코드는 코드의 간결함과 가독성에 유리한 메서드 체인의 형태로 표현리액티브 프로그래밍 코드에서 파라미터를 가지는 메서드는 함수형 프로그래밍 방식의 코드 형태의 파라미터를 가짐 명령형 프로그래밍 VS 선언형프로그래밍명령형 프로그래밍// 6보다 더 크고 홀수인 숫자들의 합계를 구하는 것public c..
동기 VS 비동기, 블로킹 VS 논블로킹
·
OS
동기(Synchronous) vs 비동기(Asynchronous)Synchronous작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함Thread1이 작업을 시작시키고, Task1이 끝날때까지 기다렸다 Task2를 시작작업 요청을 했을 때 요청의 결과값(return)을 직접 받음요청의 결과값이 return값과 동일호출한 함수가 작업 완료를 신경 씀Asynchronous시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음Thread1이 작업을 시작 시키고, 완료를 기다리지 않고, Thread1은 다른 일을 처리할 수 있음작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받음요청의 결과값이 return값과 다를 수 있음해당 요청 작업은 별도의 스레드에서 실행하게 됨콜백을 ..