Go
Go - Response body 를 Close 해야하는 이유
Go - Response body 를 Close 해야하는 이유
2022.04.26Go HTTP 클라이언트는 응답 상태와 헤더를 Network socket 으로 부터 읽고, 읽은 데이터는 응답 객체에서 바로 사용할 수 있습니다. 하지만 클라이언트가 자동으로 Response body를 읽지는 않습니다. Response body는 명시적으로 코드상에서 읽기 전까지는 소비되지 않은 상태로 남아 있으며, Response body를 닫게되면 읽지 않은 바이트를 그대로 소비합니다. Go HTTP 클라이언트가 socket을 닫을 때 암묵적으로 Response Body를 소비하는 것이 잠재적으로 문제가 될 수 있습니다. 예를 들어, GET method 로 파일을 요청하고 서버로부터 응답을 받았습니다. 응답의 Content-Length 헤더를 읽었는데, 파일이 기대한 것보다 훨씬 크다는 것을 알았습니..
Linux Set up GO PATH
Linux Set up GO PATH
2021.11.07Linux 에서 Go PATH 설정하기 https://stackoverflow.com/questions/21001387/how-do-i-set-the-gopath-environment-variable-on-ubuntu-what-file-must-i-edit How do I SET the GOPATH environment variable on Ubuntu? What file must I edit? I am trying to do a go get: go get github.com/go-sql-driver/mysql and it fails with the following error: package github.com/go-sql-driver/mysql: cannot download, $GOPATH not s..
Goroutine 정말 수백만개를 만들어도 문제 없을까?
Goroutine 정말 수백만개를 만들어도 문제 없을까?
2021.10.29Go 의 문서를 읽어보면 Goroutine 의 개수에 대해서 걱정하는 것은 섣부른 최적화 라고 나와 있을정도로 Goroutine은 가볍다고 나와 있다. 하지만 정말 수백 수천 만개의 고루틴 을 돌려도 메모리가 버틸수 있을 지 궁금했다. 이 예제는 Goroutine 이 가비지 컬렌셕되지 않는다는 사실과 런타임이 스스로 검사할수 있는 기능을 조합하여 고루틴 생성 전후에 할당된 메모리 양을 측정한다. package main import ( "fmt" "runtime" "sync" ) func main() { memConsumed := func() uint64 { runtime.GC() var s runtime.MemStats runtime.ReadMemStats(&s) return s.Sys } var c
Fibonacci 로 알아보는 동시성 과 클로저
Fibonacci 로 알아보는 동시성 과 클로저
2021.10.26프로그래밍의 입문 딱지를 떼고나서 마주쳤던 몇가지 문제들중 멀티쓰레드와 클로저에 대해서 피보나치로 파헤쳐 보려고합니다. 동시성을 이용한 구현 func fibonacci(max int)
Publisher Subscriber pattern (발행 구독 패턴)
Publisher Subscriber pattern (발행 구독 패턴)
2021.10.25TR;DL Multi thread 점점 멀티쓰레드의 중요성이 강조되면서 여러개의 쓰레드에서 하나의 데이터에 접근할때 Safe Thread 적인 방식으로 접근하기 위해서 publiser - subscriber 패턴으로 접근하겠습니다. Publisher pubisher.go package main import "context" type Publisher struct { ctx context.Context // subscribeCh Channels that only receive string subscribeCh chan chan
Handling databases using gorm
Handling databases using gorm
2021.10.20python에 이어서 orm의 맛을 본 저는 go에서도 sqlx을 걷어내고 orm 을 도입하기로 했습니다. github 에서 압도적인 스타수를 자랑하고 엄청난 기능을 지원해줘서 도입하게 되었습니다. go 에서 구조체와 마샬링 언마샬링과의 궁합도 찰떡이고 에러 핸들링 및 트랜잭션 또한 매우 쉽게 할수 있습니다. Connection .env 파일 정의하기 SERVER_ADDRESS=0.0.0.0 SERVER_PORT=3070 DB_USER_NAME= DB_USER_PASSWORD= DB_NAME=postgres DB_PORT=5432 DB_HOST= 본인의 정보에 맞게 입력해주시면 됩니다 db/init.go package db import ( "device-scheduler/logger" "fmt" "os"..
Go interface: 대소문자 의 의미
Go interface: 대소문자 의 의미
2021.10.20Go 에서는 대소문자로 해당 패키지 내부에서만 호출할지 외부에서도 호출할지 를 결정 짓는다. 오늘 파이썬에 익숙한 나머지.. 이에러로 30분을 잡아먹었다. 참고할만한 관련 글들 https://blog.billo.io/devposts/golang_naming_convention/ Golang 에서의 명명 규칙 Go언어에서 사용되는 명명 규칙을 알아본다 blog.billo.io https://stackoverflow.com/questions/60109478/go-interface-cannot-assign-value-to-unexported-field Go interface: Cannot assign value to unexported field I try to mock some struct for unit ..
Go - 입금 및 출금 API 구현 하기 (transaction && rollback)
Go - 입금 및 출금 API 구현 하기 (transaction && rollback)
2021.10.11banking app 에서 customer id 와 account id 를 받아서 돈을 입금 또는 출금 하는 API 를 만들어 보겠습니다. Router Handler 만들기 router.HandleFunc("/customers/{customer_id:[0-9]+}/account/{account_id:[0-9]+}", ah.MakeTransaction). Methods(http.MethodPost) customer id 와 acccount id 를 정규표현식으로 숫자만 받도록 정의하고 AccountHandler 객체를 만들고 MakeTransaction 을 HandleFunc 로 등록 했습니다. Db 객체와 Handler 객체를 각각 파라미터로 의존성 주입하는 형태로 코딩을 하여 테스트 또는 변경되는 사항..
Go - Restful 하게 micro web service 만들기
Go - Restful 하게 micro web service 만들기
2021.10.10도메인에서 DB Table 1:1 구조체 만들기 저장소 Interface 만들기 해당 RepositoryDB 에 receive 함수 구현하기 DTO 정의하기 POST method 가 왔을 때 Request 로 받는 값 정의, Response 로 Client 에게 응답 값 정의 Service 구현 Service 는 Handler 를 통해 DTO(Request dto) 를 받아서 domain tpye 으로 repository 에 값을 처리하고 Response dto 로 Handler 에게 처리된 값을 넘긴다. Account Service Interface 구현 AccountService 는 Handler 에서 직접 구현 NewAccountService는 app.go 에서 Handler func로 사용 han..
Docker 로 Go 프로젝트 빌드 & 실행하기
Docker 로 Go 프로젝트 빌드 & 실행하기
2021.10.05각종 VM에 go 가 설치가 안되어있다고 가정하고 도커를 사용하요 프로젝트를 실행하는 가볍게 실행하는 법입니다. Dockerfile # syntax=docker/dockerfile:1 FROM golang:1.16-alpine WORKDIR /app COPY go.mod ./ COPY go.sum ./ RUN go mod download EXPOSE 3070 COPY ./ ./ RUN go build CMD [ "./`go mod 의 모듈이름`" ] go build 를 하게되면 go mod 파일의 module 이름으로 바이너리 파일이 생성됩니다. 그래서 CMD 에 저렇게 적은 것 입니다. 포트와 ip에서 주의하실점 package app import ( "log" "net/http" "sms-api/log..
Go - 삽입정렬 구현하기
Go - 삽입정렬 구현하기
2021.10.03시간 복잡도 최악의 경우(역으로 정렬 된 경우) 비교 횟수 : 외부 루프 안의 각 반복마다 i번의 비교 수행 (n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2 = O(n^2) 최선의 경우 비교 횟수 : 이동 없이 1번의 비교만 이루어진다. (n-1)번 = O(n) 공간 복잡도 기존에 주어진 배열에서 원소 Swap만 이루어지므로 공간 복잡도는 O(n)이다. 특징 장점 알고리즘 구현이 비교적 단순하다. 대부분의 원소가 이미 정렬되어 있는 경우에 효율적이다. 주어진 배열에서만 교환하므로 다른 메모리 공간이 필요하지 않다. => 제자리 정렬(in-place sorting) 안정 정렬이다. 다른 O(n^2) 알고리즘에 비해 상대적으로 빠르다. 단점 시간 복잡도가 평균, 최악에서는 O(n^2)로..
Go - 구조화된 로그 남기기
Go - 구조화된 로그 남기기
2021.09.24로그를 남겨야 하는이유 개발자는 디버깅 하는데에 있어서 가끔 로그가 정말 큰도움을 줄때가 많습니다. 꼭 디버깅의 이유가 아니더라도 로그를 남겨야 하는 이유는 많을 텐데요 오늘은 지금까지 백엔드 개발을 하면서 이렇게 로그를 남기면 좋을거 같다 싶은것과 새롭게 배우는 Go 언어에서는 어떻게 log를 남기는지 적어보겠습니다. 로그 라이브러리 선택 uber 에서 만든 uber-go 의 로그 라이브러리를 사용하겠습니다. https://github.com/uber-go/zap GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go. Blazing fast, structured, leveled logging in Go. Contribute to u..