IT/Go 19

[Go/Golang] 구조체 JSON 변환 시, omitempty가 적용되지 않는 경우

Prologue Go에서 오브젝트를 JSON으로 변환하려면, 해당 오브젝트를 기술하는 구조체가 선언되어 있어야 합니다. 예를 들자면 다음과 같습니다. type Score struct { Korean uint `json:"korean,omitempty"` Math uint `json:"math,omitempty"` English uint `json:"english,omitempty"` } type UserV1 struct { UserName string `json:"username"` Name string `json:"name"` Email string `json:"email"` Age uint64 `json:"age"` Score Score `json:"score,omitempty"` } 위 구조체의 필..

IT/Go 2021.05.27

[Go/Golang] bufio.Scanner를 이용할 때 주의 사항

bufio.Scanner bufio.Scanner는 bufio.Reader를 대신하여 줄 바꿈 등으로 구분되는 텍스트 파일 등의 데이터를 읽는 편리한 인터페이스를 제공합니다. bufio.Reader와 눈에 띄는 가장 큰 차이점이라면, 입력을 받았을 때, 읽어 들인 값이 \n 을 포함하지 않는다는 점입니다. 이 덕분에 strings.TrimSuffix(_, "\n") 등의 작업을 추가로 해줄 필요가 없습니다. bufio.Scanner와 bufio.Reader의 더 많은 비교는 다음 포스트를 참조해주세요. https://wookiist.dev/102 문제 발견 어제 PS를 하다 정상적으로 푼 문제가 Runtime Error (Index out of range)가 발생하였습니다. 같은 코드를 Python으로 ..

IT/Go 2021.05.22

[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기

[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기 일반적으로 PS할 때, 저는 bufio 패키지를 사용합니다. 보통 사용하는 fmt.Scanf() 또는 fmt.Printf()는 버퍼링을 수행하지 않아 많은 양의 입력을 받는 경우 매우 느려집니다. 실행 시간이 매우 중요한 PS에 있어선 더더욱 피하게 되는 내장 함수입니다. 한 줄에 여러 개의 입력을 받는 경우, (*bufio.Reader).ReadString('\n)을 이용해 받고, 끝에 들어오는 \n을 Trim하고 Fields()를 이용해 배열로 쪼갭니다. 그리고 나서 strconv.Atoi()로 숫자 변환을 해줍니다. 만약 한 줄에 셀 수 있을 정도의 입력을 받는다면, fmt.Fscanf((*bufio.Reader), ..

IT/Go 2021.05.13

[Go/Golang] Zap과 시간 기반 파일 로테이션 로깅 수행하기

본 포스트는 'dhwaneetbhatt'의 Time based log file rotation with zap 글을 번역한 것임을 밝힙니다. Zap과 시간 기반의 파일 로테이션 로깅 zap은 현재까지도 잘 개발되어오고 있고, 성능 측면에서도 훌륭한 Go의 오픈소스 로깅 라이브러리입니다. 유감스럽게도, 원 글쓴이(이하, 필자)의 조직에서 제공하는 모든 앱들이 12-factor 애플리케이션으로 구성되지 않았으며, 이로인해 물리적으로 파일에 로그를 남기는 작업이 여전히 필요했습니다. 이와 같은 이유로 zap을 사용함과 동시에 파일을 로테이션 할 수 있도록 하는 방법이 필요했습니다. 필자는 Java 진영에서 넘어왔기 때문에 log4j의 매우 다양한 파일 로테이션 옵션을 제공하고 있는 것을 알고 있..

IT/Go 2021.03.29

[Go/Golang] Go Application에 Prometheus Exporter 연동하기

Prometheus Prometheus는 CNCF의 오픈 소스 프로젝트로 System과 Service 모니터링 시스템입니다. 특정 주기를 기준으로 사용자가 구성한 target으로부터 metric을 수집합니다. 또한 사용자가 정의한 rule expression을 계산하여 해당 결과를 보여주고 특정 조건을 만족하는 상황에 도달하면 알람을 울리는 등의 기능을 수행합니다. Prometheus는 시계열(time-series) 데이터를 처리하는 데에 특화되어 있습니다. Prometheus Exporter Prometheus는 여러 방법으로 metric을 수집합니다. 특히 Exporter라는 구성 요소를 통해 target 시스템 및 서비스의 Expose된 metric을 수집해올 수 있습니다. Prometheus Ex..

IT/Go 2021.03.16

[Go/Golang] Map 자료형을 Struct로 변환하기(mapstructure)

Map Python에는 Dictionary라는 강력한 자료형이 있습니다. 굉장히 유연하고, 편리한 자료형입니다. 기본적으로 Python의 Dictionary는 다른 언어의 Map 자료형과 동일합니다. Python Dictionary의 특별한 점이라면, 하나의 Dictionary 변수 안에 각기 다른 자료형의 데이터가 보관될 수 있다는 점입니다. 따라서 Python에서 어떤 데이터를 Dictionary로 보관하는 일은 그리 어려운 일이 아닙니다. 특히, JSON 데이터를 별다른 추가 작업 없이 Dictionary에 대응할 수 있다는 점은 정말 엄청난 기능이라고 생각합니다. 그러나 Go 진영에선 상황이 다릅니다. Go에서 특정 데이터를 Dictionary로 보관하기 위해선, Key-Value가 어떤 자료형인..

IT/Go 2021.03.15

[Go/Golang] Go의 HTTP & REST Client 라이브러리 - Resty

Go의 HTTP & REST Client 라이브러리 - Resty API Client 이전 포스팅에서 다뤘던 Echo는 Go의 Web Framework입니다. Echo로 구현한 프로그램은 API Server 등으로 동작할 수 있고, 큰 어려움 없이 Web Server로 사용할 수도 있습니다. 하지만 프로그램이 API Server가 아닌 API Client로 동작해야 한다면 어떨까요? API Client는 API Server에 Request를 보내는 주체로 Echo와는 정반대의 기능을 수행해야 합니다. 이런 기능을 Go에서 사용할 수 있도록 구현해놓은 패키지가 있습니다. 바로 Resty 입니다. Resty Resty는 Ruby의 rest-client에서 영감을 받아 시작된 Go의 HTTP & REST Cl..

IT/Go 2021.03.10

[Go/Golang] Echo 프레임워크에서 Swagger 사용하기

Echo 프레임워크에서 Swagger 사용하기 Echo Echo 프레임워크는 Golang 웹 프레임워크 프로젝트 중 하나입니다. Gin이라는 유명한 프레임워크도 있지만, 저는 Echo를 처음으로 접해서 지금까지 Echo로 사용해오고 있습니다. 아직 Gin을 이용해보진 못해서 둘을 자세히 비교할 수는 없겠지만, 표면적으로는 최근 들어, Echo가 Gin에 비해 더 많이 검색되고 있고, Gin 보다 짧은 Release Cycle을 가져가고 있다는 점이 눈에 띕니다. 참고 Swaggo 한편, Swagger는 API의 문서화를 자동으로 처리해주는 프로젝트입니다. 기존의 docs 등을 이용한 API 문서 관리 기술은 API가 변하게 되면 변한 API에 맞춰 문서화를 다시 진행해야 하는 번거로움이 있었다면, 이런 ..

IT/Go 2021.03.09

[Go/Golang] Golang의 문자열 읽기에 관한 고찰(Reader, Scanner, Scanln)

Golang의 문자열 읽기에 관한 고찰 bufio 패키지의 bufio.NewReader(os.Stdin) ReadLine() 메서드 ReadLine() 메서드는 os.Stdin으로부터 읽어 들인 데이터를 []Byte 형으로 리턴합니다. ReadLine 메서드를 사용할 땐 buffer의 크기 등 다양하게 고려해야 하는 케이스들이 많습니다. 이러한 이유에서 bufio.go 파일을 확인해보면 다음과 같은 내용이 있습니다. ReadLine is a low-level line-reading primitive. Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner. ReadLine 메서드는..

IT/Go 2021.03.08

[Go/Golang] Echo 프레임워크에서 CORS 관련 설정하기

Go Echo 프레임워크에서 CORS 관련 설정하기 웹 개발을 하다보면 종종 CORS (Cross-Origin Resource Sharing) 을 마주치곤 합니다. CORS 정책을 위반하였다는 에러를 마주치면 당혹스럽긴 합니다. 단순한 작업일 뿐인데도 정상적으로 수행되지 않는 코드를 보면 야속하기까지도 합니다. 다만 오늘은 CORS에 관한 내용을 다루려는 것은 아닙니다. 오늘은 Echo 프레임워크를 이용할 때, CORS 관련 설정은 어떻게 수행하면 되는지 정리해보도록 하겠습니다. 모든 원격지, 모든 메서드 허용 Echo 프레임워크는 기본적으로 모든 원격지로부터 오는 모든 메서드를 허용합니다. 이 때는 다음과 같이 명시적으로 써줘도 괜찮습니다. 소스 코드 1 func main() { e := echo.Ne..

IT/Go 2021.03.04