프로그래밍(Web)/Golang

    [바미] Golang JSON 필수 값 체크하기.

    지난 번에 Golang reflect 함수 사용하여 필수 값 체크 함수 만들기. 를 통해서 JSON 필수값을 reflect함수로 찾는 방법을 포스팅 한 적이 있습니다. 저기서는 for문 2개를 돌려서 찾는 방법이였지만 이번엔 validator을 사용하여 심플하게 처리할 수 있는 방법을 소개시켜드리려 합니다. 먼저 패키지를 다운 받아야 합니다. go get github.com/go-playground/validator/v10 그 후 아래와 같이 구조체를 선언 후, 필수 값으로 지정할 값을 아래와 같이 지정해줍니다. type ExStruct struct { A string `json:"a" validate:"required"` B string `json:"b" validate:"required"` C str..

    [바미] Go 1.18 Release Notes

    언어의 변경사항 Generics Go 1.18에는 유형 매개변수 제안에 설명된 일반 기능의 구현이 포함되어 있습니다. 여기에는 언어에 대한 주요 변경 사항이 포함되지만 완전히 이전 버전과 호환됩니다. 이러한 새로운 언어 변경에는 프로덕션 설정에서 중요한 테스트를 거치지 않은 많은 양의 새 코드가 필요했습니다. 이는 더 많은 사람들이 일반 코드를 작성하고 사용함에 따라 발생할 것입니다. 우리는 이 기능이 잘 구현되고 고품질이라고 믿습니다. 그러나 Go의 대부분의 측면과 달리 실제 경험으로는 그 믿음을 뒷받침할 수 없습니다. 따라서 합리적인 경우 제네릭을 사용하는 것이 좋지만 프로덕션 환경에 제네릭 코드를 배포할 때는 적절한 주의를 기울여야 합니다. 다음은 가장 눈에 띄는 변경 사항의 목록입니다. 보다 포괄..

    [바미] Go 1.17 Release Notes

    Go 1.17 소개 최신 Go 릴리스인 버전 1.17은 Go 1.16 이후 6개월 후에 출시됩니다. 대부분의 변경 사항은 도구 체인, 런타임 및 라이브러리의 구현에 있습니다. 항상 그렇듯이 릴리스는 호환성에 대한 Go 1 약속을 유지합니다. 우리는 거의 모든 Go 프로그램이 계속해서 이전과 같이 컴파일 및 실행될 것으로 기대합니다. 언어 변경 부분 Go 1.17에는 언어에 대한 세 가지 작은 개선 사항이 포함되어 있습니다. 슬라이스에서 배열 포인터로의 변환: []T 유형의 표현식 s는 이제 배열 포인터 유형 *[N]T로 변환될 수 있습니다. a가 이러한 변환의 결과이면 범위에 있는 해당 인덱스는 동일한 기본 요소를 참조합니다. &a[i] == &s[i] for 0

    [바미] Go - os.Args를 이용하여 localhost port 번호 지정하기.

    안녕하세요. 오늘은 Golang에서 지정한 포트번호로 localhost를 접속해야 할 때 방법을 공유해보려 합니다. 커맨드라인 인자 (Command-line arguments)는 프로그램의 실행을 매개변수화하는 일반적인 방법입니다. 예를 들어, go run hello.go는 go 프로그램에 run과 hello.go를 인자로 사용합니다. os.Args는 커맨드라인 인자를 그대로 접근하는 방법을 제공합니다. 보통 "net/http"를 사용하여 간단한 핸들러 추가하여 서버를 실행시키실 때 package main import ( "fmt" "net/http" "os" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request)..

    [바미] Go - Logrus과 lumberjack을 사용하여 Log를 찍어보자!

    로그를 남길 때 일반 "log"패키지 외에도 로그를 남길 수 있는 방법이 있어 공유하고자 올립니다. Logrus라는 패키지 인데요. 사용 방법은 다음과 같습니다. 먼저 패키지를 다운받아 줍니다. github.com/sirupsen/logrus 그 후 코드를 작성해봅시다. package main import ( log "github.com/sirupsen/logrus" ) func main() { // 기본 ASCII 포맷터 대신 JSON으로 로깅합니다. log.SetFormatter(&log.JSONFormatter{}) // 기본 stderr 대신 stdout으로 출력하기 위해 사용. log.SetOutput(os.Stdout) // 지정된 모듈에 대한 로깅 수준을 설정 -> DebugLevel 이상 ..

    [바미] 디버그 모드 시 Version of Delve is too old for this version of Go 에러 뜰 때 해결 방법

    디버그 모드를 사용해야 할 일이 생겨 사용했는데 API server listening at: 127.0.0.1:42081 Version of Delve is too old for this version of Go (maximum supported version 1.15, suppress this error with --check-go-version=false) Process exiting with code: 1 아래와 같은 문구가 디버그 콘솔에서 뜨게 되었습니다. 그래서 지금 사용하고 있는 버전이 오래됐나 싶어 버전을 확인하려는데 1.16.2 버전을 사용하고 있었습니다. (업데이트를 하지 않았는데 언제 업데이트 된 건지...) 그래서 버전문제는 아닐거라 생각을 했는데 ()안에 있는 문구를 보니 지원되는 ..

    [바미] go-callvis에 대해 알아보자!

    go-callvis는 Go로 작성된 프로그램의 호출 그래프를 생성 해주는 도구입니다. 코드 리뷰에서 사람의 코드를 읽을 때나, 복잡한 코드를 파악하고 싶을 때 등 어떤 형태로던 도움을 받고 싶은 경우가 있습니다. go-callvis은 쉽게 시각화된 호출 그래프를 만들 수 있다. 이 go-callvis의 사용법에 대해 소개하려고 합니다. 사용법 go-callvis 저장소에 딱 좋은 샘플이 있기 때문에 시험 삼아 실행해봅시다. https://github.com/TrueFurby/go-callvis/tree/master/examples/main 내용은 이런 느낌입니다. main 패키지가 있는 곳에서 go-callvis 명령을 실행합니다. -group를 사용하면 패키지나 타입으로로 그룹화 해줍니다. 패키지로 그..

    [바미] Go 1.16 Release 정보!

    주요 업데이트 Go embed go:embed {embed file path} 디렉티브를 통해 컴파일 과정에서 파일 임베드를 지원하게 됨. 이것이 좋은 이유! Go언어에서는 기본적으로 conf-{stage}.yaml 등의 설정 파일을 가지고 불러오는 등의 설정을 가진 경우, 개발 과정에서는 문제가 없이 동작하지만 go build를 한 이후 설정 파일이 execute file에 포함되지 않아 설정 파일을 못찾는 현상이 발생합니다. 또한 보안 문제도 발생하게 된다. 따라서 실행 파일과 함께 설정 파일을 동봉하거나 viper 등을 통해 설정을 직접 입력하는 형식, 혹은 Consul이나 etcd와 같은 원격 키스토어에 설정을 저장하고 네트워크 트래픽을 거쳐 설정을 받아오는 방식을 사용했다. 1.16 버전 이전에..

    [바미] Go - Websocket

    WebSocket? Web에서 할 수 있는 Socket 프로그래밍이라는 뜻인데, HTML5에 들어간 표준에 하나로, 지난번에 다루었던 Event소스라는 것과 더불어서 동적인 웹을 만드는데 사용되는 도구입니다. 이것을 사용하여 채팅 서비스 앱을 구현 해봅시다! 우선 EventSource에서 불필요한 부분들을 지운 코드를 가져왔습니다. main.go package main import ( "net/http" "github.com/gorilla/pat" "github.com/urfave/negroni" ) func main() { mux := pat.New() n := negroni.Classic() n.UseHandler(mux) http.ListenAndServe(":3000", n) } 기본 mux에 기..