공부 62

Go 테스트 코드 깔끔하게 작성하기

go에서 테스트 코드를 작성하는 방법은 여러가지가 있다.개인적인 취향으로는 이런 테스트 코드가 가독성도 높고, 결과를 보기도 쉬웠다. 먼저 main 코드다// main.gopackage mainimport "fmt"func main() { fmt.Println("Hello World!")}// 테스트할 함수의 결과 값 유형을 정의type BodyType int const ( normal BodyType = 1 small BodyType = 2 tall BodyType = 3 none BodyType = 4)// 테스트할 함수의 input 구조체type Person struct { Name string Age int Body *Body}type Body struct { height int weigh..

공부/Go 2024.08.28

IDE로 코드 리뷰할때 개인적인 팁

일단 git 웹 뷰로는 솔직히 코드 리뷰 하기가 힘들다. 딱 바뀐 부분만 나오기 때문이다. 그래서 git clone 하여 개인 IDE로 열어서 해당 브랜치로 checkout 하여 보는데 막상 그렇게하면 어디가 바뀌었는지 알기가 쉽지 않다. vscode에서는 unstage 상태의 변경사항(add가 되지 않은 변경사항)은 표시해준다. 그러면 commit된 것들을 unstage로 되돌리면 된다. 먼저 git log 명령어로 어디까지 되롤릴지 확인한다 > git log commit a9d21cb2bebc66cdb811693ae61f8dd0b45703cf (HEAD -> https) Author: Seungwon Lee Date: Tue Jul 26 16:41:51 2022 +0900 Add TLS option ..

공부/Linux 2024.04.18

Go에서 배열 구조체를 포함한 구조체의 값 변경할 때 주의사항

Go에서 이미 값이 할당된 다중 구조체(nested structure)의 내부 배열 구조체에 어떤 값을 변경할 때는 for 문에서 인덱스를 사용해서 직접 접근해야한다. 가끔 습관적으로 for k, v := range S 를 하며 v를 통해 값을 할당하는 실수를 저지르게 된다. type Outer struct { name string inner []Inner } type Inner struct { A int B int } func changeInner() { outer := Outer{ name: "togomi", inner: []Inner{ { A: 5, B: 6, }, }, } for k, v := range outer.inner { // 잘못된 방법 v.A = 1 v.B = 2 // 옳은 방법 out..

공부/Go 2023.12.14

golang http connection(socket) 재사용하기

회사에서 부하테스트를 하던 도중 겪은 일이다. 부하를 주는 클라이언트가 할당된 리소스도 다 사용하지 못하고, 기대하던 RPS도 나오지 않는 현상이 있었다. netstat 명령어로 확인 결과 상당 수의 소켓의 status가 TIME_WAIT 인 것을 발견했다. TIME_WAIT은 연결은 종료된 상태지만, 바로 소켓을 반납하지 않고 혹시나 송신측에서 데이터를 보낼 수 있는 것을 기다리는 상태이다. 내가 기대했던 바는 소켓을 종료하지도, 반납하지도 않고 다음 통신에 재사용하는 것이다. 사실 해결법은 정말 간단하다. go http 패키지는 기본적으로 소켓 재사용 정책이 적용되어있기 때문에, 아래 사항만 모두 지켜주면 된다. response body를 전부 읽는다. body를 close한다. 중요해서 볼드체로 했..

공부/Go 2023.06.22

Kubernetes 사용을 편리하게 해주는 툴

k9s 원래는 일일히 kubectl 명령어 치는 것을, 한 번의 키입력으로 가능하게끔 해주는 툴 정말 편하다 설치 방법 K9S_VERSION=v0.26.7 curl -sL https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz | sudo tar xfz - -C /usr/local/bin k9s 사용법 k9s kubectx 다루는 k8s 클러스터가 많을 때 컨텍스트 변경을 쉽게 해주는 툴 ~/.kube/config에 여러 클러스터를 기술하고, kubectx로 변경한다. 설치 방법 wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubec..

공부/Kubernetes 2023.02.20

k8s client-go leader election 코드 메커니즘 분석

개념 leader election이란 말 그대로 리더를 선출하는 것으로, CS에서 자주 쓰이는 개념이다. kubernetes go client에서는 이러한 leader election 기능을 제공한다. 아래는 k8s go client가 사용하는 leader election 방식에 대한 간단한 그림이다. 특정 리소스(그림 상에서 Lock)에 대해서 소유권이 자신에게 있다고 작성하는 사람이 leader이다. 일단 leader가 되면 leader는 주기적으로(그림 상에서 leaseDuration) 자신이 아직도 리더임을 갱신한다.(그림 상에서 lastObservedTime) leader가 되지 못한 나머지는 주기적으로 그 리소스를 확인하다가, 한 주기가 지났는데도 리더가 갱신을 못했을 시 소유권이 자신에게 있..

공부/Kubernetes 2022.11.09

kubectl에서 user token 사용하기 (keycloak oidc)

kubectl에서 --token 옵션은 service account 토큰만 가능하다. 하지만 만약 k8s가 oidc 연동 중이라면 kubectl로 user token도 사용할 수 있다. 방법은 service account 토큰 사용법과는 조금 다르다. 1. kube-apiserver.yaml 확인 apiVersion: v1 kind: Pod metadata: ... spec: containers: - command: ... - --oidc-issuer-url=https://{KEYCLOAK 주소}/auth/realms/{REALM 이름} - --oidc-client-id=my-client - --oidc-username-claim=preferred_username - --oidc-username-pref..

공부/Kubernetes 2022.10.10