이 블로그 검색

2021년 4월 27일 화요일

Go 1.16 에서 $GOPATH/src 에서 코드 작성하고 사용하기

Go 1.16 버전 부터는 기본적으로 module 을 사용하게 변경 되었다. 덕분에 GOPATH  와 상관없이 아무 위치에서든 자신의 소스파일을 작성하면 된다.  그리고 모듈을 사용하기 위한 go.mod 파일이 반드시 필요하게 되었다.  하지만 1.16 버전에서도 선택적으로 module 사용을 할지 말지 여부를 결정 할 수 있다. 예를 들어 기존 프로젝트 구조가 GOPATH 내 src 를 사용하는 경우등이 해당될수 있다.

2021년 4월 25일 일요일

go module과 package 관계, 그리고 module path 개념 정리

go 의 기본적인 개념 중에서 모듈, package 그리고 모듈 경로에 대해 알아본다. 처음에 개인적으로 많이 헷갈렸던 부분이라서 정리해 본다. 지금 우리가 go 로 어떤 프로젝트를 수행한다고 가정해 보면, 다음처럼 정리 할 수 있겠다. 

  • 이 프로젝트는 여러개의 모듈을 가질수 있다.
  • 각 모듈에는 여러개의 package들이 존재할수 있다.
  • 각 package 들은 1개 이상의 go 소스파일로 구성된다.
  • 모듈내의 각 package 들은 자신의 package 폴더를 go mod init 으로 지정한 모듈 경로 + 폴더로 만들면 된다. 
  • 패키지명은 (반드시) 경로의 마지막 문자열로 해준다.
  • 개발 중인 모듈 사용을 위해서 반드시 원격 저장소에 배포될 필요는 없다.
  • 로컬 개발환경에서 모듈이 타 모듈을 사용해야 한다면, 타 모듈의 경로를 로컬 경로로 변경하는 작업이 필요하다.

위 내용들을 하나씩 살펴보자. 

2021년 4월 24일 토요일

go 에서 gRPC-Gateway 사용하기

이번에는 go 에서 gRPC-Gateway 를 사용하는 방법에 대해 알아보려 한다. 

최종 코드는 다음에서 확인 가능 : https://github.com/jeremyko/grpc-gateway-sample

앞서 살펴본 go 에서 proto buffer 사용하기 와 거의 비슷한 절차이나 gRPC-Gateway 사용을 위해 추가되는 절차가 있다. 다음 내용을 기초로 작성되었다 (그대로 따라 했더니 에러가 발생되어, 최신 go 버전에 맞게 내용이 추가된 부분이 있다. go 1.16 버전 기준).

https://grpc-ecosystem.github.io/grpc-gateway/docs/tutorials/introduction/

필요한 패키지 다운로드

go get google.golang.org/grpc
go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

2021년 4월 22일 목요일

go 에서 proto buffer 사용하기

1. proto buffer 를 정의
2. go 로 변환하여 모듈을 만들고
3. 이 모듈을 로컬에서 호출해서 사용 하는 간단한 예제를 정리해 본다 (go 1.16 버전을 기준)

최종 코드는 다음을 참고 : https://github.com/jeremyko/go-proto-buffer-sample

prerequisite

    protoc, go protocol buffers plugin 설치  

apt install -y protobuf-compiler

go install google.golang.org/protobuf/cmd/protoc-gen-go


주의점 : protoc-gen-go 는 go version 1.16 이상에서 설치 가능함.

이 조건이 안된다면 go get 으로 바이너리를 직접 받는다.

go get google.golang.org/protobuf/cmd/protoc-gen-go


먼저 모듈(github.com/jeremyko/my_proto 라고 정한다)을 만들기 위한 디렉토리를 만든다.

mkdir my_proto

cd my_proto

my_proto.proto 파일을 생성한다.

syntax = "proto3";

//package 명은 go_package 에 지정한 경로의 제일 마지막 것으로 해야 한다.
package my_proto ;
option go_package = "github.com/jeremyko/my_proto";
//위 경로는 실제 배포시 적용될 것으로 해준다.

message MyProto {
string msg = 1;
int32 number = 2;
}

 

proto 파일이 있는 그 위치에 protoc 컴파일한다.

~/mydev/my_proto#  protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative  my_proto.proto

~/my_dev/my_proto# ll
total 12
-rw-r--r-- 1 root root 4568 Apr 22 14:03 my_proto.pb.go
-rw-r--r-- 1 root root  249 Apr 22 13:37 my_proto.proto

go mod init , go mod tidy 실행 한다.

jeremyko: ~/mydev/my_proto# go mod init github.com/jeremyko/my_proto
go: creating new go.mod: module github.com/jeremyko/my_proto
go: to add module requirements and sums:
go mod tidy
jeremyko: ~/mydev/my_proto# go mod tidy
go: finding module for package google.golang.org/protobuf/runtime/protoimpl
go: finding module for package google.golang.org/protobuf/reflect/protoreflect
... 생략
jeremyko: ~/mydev/my_proto# ll
total 20
-rw-r--r-- 1 jeremyko jeremyko 89 Apr 24 12:41 go.mod
-rw-r--r-- 1 jeremyko jeremyko 739 Apr 24 12:41 go.sum
-rw-r--r-- 1 jeremyko jeremyko 4534 Apr 24 12:40 my_proto.pb.go
-rw-r--r-- 1 jeremyko jeremyko 310 Apr 24 12:39 my_proto.proto
jeremyko: ~/mydev/my_proto# cat go.mod
module github.com/jeremyko/my_proto

go 1.16

require google.golang.org/protobuf v1.26.0

 

이제 이 my_proto 모듈을 사용하기 위한 모듈(github.com/jeremyko/proto_test_main)을 별도로 만든다. 새로 만드는 모듈은 main package 를 가지고 단지 my_proto 모듈 호출 테스트 용도 이다. (물론 my_proto 모듈 안에서 main package 를 만들어도 상관없다)

임의의 위치 (여기서는 ~/proto_test_main 폴더를 새로 만들었다) 에서 mod init 을 수행한다.


jeremyko: ~/mydev/proto_test_main# go mod init github.com/jeremyko/proto_test_main
go: creating new go.mod: module github.com/jeremyko/proto_test_main
jeremyko: ~/mydev/proto_test_main# cat go.mod
module github.com/jeremyko/proto_test_main

go 1.16


~/my_dev/proto_test_main 에 main.go 를 만든다.

package main

import (
    "log" 
    pb "github.com/jeremyko/my_proto"
)

func main() { 
    myProto := &pb.MyProto{msg:"some text", number:999
    log.Printf("msg: %s", myProto.Getmsg())
log.Printf("number: %d", myProto.Getnumber()) 
}



로컬에 작성된 my_proto 모듈을 사용하기 위해 일단 mod edit  -replace 를 해준다.
이 내용은 다음링크를 참조

http://jeremyko.blogspot.com/2021/03/golang-module.html 

go mod edit -replace github.com/jeremyko/my_proto=../my_proto


jeremyko: ~/mydev/proto_test_main# go mod edit -replace \
> github.com/jeremyko/my_proto=../my_proto
jeremyko: ~/mydev/proto_test_main# cat go.mod
module github.com/jeremyko/proto_test_main

go 1.16

replace github.com/jeremyko/my_proto => ../my_proto


mod tidy 를 수행한다

jeremyko: ~/mydev/proto_test_main# go mod tidy
go: finding module for package github.com/golang/protobuf/proto
go: found github.com/golang/protobuf/proto in github.com/golang/protobuf v1.5.2
... 생략
jeremyko: ~/mydev/proto_test_main# cat go.mod
module github.com/jeremyko/proto_test_main

go 1.16

replace github.com/jeremyko/my_proto => ../my_proto

require (
github.com/golang/protobuf v1.5.2
github.com/jeremyko/my_proto v0.0.0-00010101000000-000000000000
)



main.go 를 실행하여 정상여부 확인

go run main.go

 2021/04/22 14:25:11 msg: some text
 2021/04/22 14:25:11 number: 999

 

참고

https://developers.google.com/protocol-buffers/docs/gotutorial


2021년 4월 15일 목요일

flutter : push-up mania

flutter 를 사용한 모바일 크로스 플랫폼 앱 개발 예제. 

https://play.google.com/store/apps/details?id=com.jeremyko.pui

뭘 일단 만들어볼까 하다가, 한 10년 전에 ios 앱으로 만들었던 푸쉬업 카운터를 또 만들어 봤음.

 


 

2021년 4월 3일 토요일

flutter : using mixed null safety for legacy packages

null safety 가 없는 기존 package 들을 최신 flutter, dart 개발 환경에서 사용하기.

flutter 프로젝트 내에서 dart 버전을 소스파일 단위로 다르게 지정하여 오래된 package 들도 null safety 에러가 안나게 개발할수 있다.  

2021년 3월 19일 금요일

golang module 작성, 타 모듈에서 로컬 테스트 및 배포 개념 정리

golang 모듈을 만들고 타 모듈에서 사용하는 것을 한번 정리해보았다.
내가 만들려고 하는 모듈이
github.com/jeremyko/my_mod 이며, 모듈 폴더는 ~/mydev/my_mod 라고 가정한다.

2020년 4월 30일 목요일

redis-benchmark 에서의 RPS(requests per second) 의미

redis-benchmark 를 수행했을때 출력되는 requests per second(RPS) 의미를 client 개수와 연관해보면 다음과 같다.

2019년 12월 27일 금요일

ASockLib windows 를 지원

ASock이라는 이름으로 socket 관련 라이브러리를 만들어서 프로젝트에서 사용하고 있었는데, linux, os x 만 지원하던것을 이번에 며칠 손봐서 windows 에서도 돌아가게 구현해봤다. 만들고 보니, proactive 방식과 reactive 방식이 뒤섞인 결과물. portable 한 networking library가 일단 완성된것에만 일단 만족...

https://github.com/jeremyko/ASockLib

2019년 10월 6일 일요일

template method pattern 에 CRTP 사용하기 (c++)

그동안 개발하면서 template method pattern을 즐겨 사용하고 있는데, virtual 함수를 이용하여 구현했었다. 그런데 CRTP 를 이용해도 비슷한(동일한건 아님) 처리가 가능하다.

예를 들어 다음처럼 template method pattern 구현을 한경우,

2018년 1월 27일 토요일

vim + 정규식을 이용한 smi 파일 일괄 수정

주말이라서 영화를 받았는데,smi 파일은 있는데 자막이 안나온다. 좋아하는 영환데...
smi 파일을 열어보니, 뭔가 알수 없는 규칙으로 작성되있다.