![Golang Convention : Error wrapping vs Opaque error](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhNbxu%2FbtsKLaEpNeO%2FOteWLQ9XG3wJZQe1aLze80%2Fimg.png)
Golang Convention에서 Error Wrapping과 Opaque Error처리가 서로 충돌이 있는것 같아어떻게 정리를 해야할지를 추가로 정리해봅니다. 1. Opaque Error (불투명한 오류)"Opaque Error"는 오류 발생 지점에 대한 구체적인 정보가 부족하고, 오직 메시지 문자열만으로 전달되는 형태의 오류를 의미합니다. 이는 오류의 원인을 파악하기 어렵게 하며, 코드 디버깅을 어렵게 만드는 주요 원인입니다. 이 관점에서 살펴보면, 원래 예시 코드에서 문제가 되는 부분은 오류의 맥락이 포함되지 않아서, 오류가 어디에서 발생했는지를 쉽게 알 수 없다는 것입니다.func AuthenticateRequest(r *Request) error { err := authenticate(r..
![Golang Convention 중 논의를 해야 할 사항 정리](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwiakk%2FbtsKD3DIujO%2FXWzM938QmV6ViSX0iNw1Qk%2Fimg.png)
1. 에러 핸들링Error는 체크하지 않고 gracefully handle한다.Golang에서는 아래와 같이 작성 하는게 자연스러워 보이지만 사실은 불필요합니다.Badfunc AuthenticateRequest(r *Request) error { err := authenticate(r.User) if err != nil { return err } return nil}Goodreturn authenticate(r.User) 오류에 주석을 달아라 (Annotating Errors)github.com/pkg/errors 패키지는 과거에 널리 사용되었지만, Go 1.13부터는 Go 표준 라이브러리에 errors 패키지에 기본적으로 오류..
![Golang 에러 처리 - (1) Google Guide/Best Practice 찾아보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIxXFM%2FbtsJvQyBYyJ%2FUghfQWo9jIoYTncCksYgD1%2Fimg.jpg)
배경현재 프로젝트에서 Error 처리를 일관적이지 못한 방법으로 하고 있다는 생각이 들어서 글을 쓰게 되었습니다.작년의 Golang 초기 사용 시점에는 모두 언어에 대한 이해도가 낮고 MVP 완성을 위해 빠르게 코드를 짰어야 해서 전체적으로 코드를 짠 사람의 코딩 Convention을 따라가게 되었습니다.그때의 Error handling 사용의 형태를 유사하게 활용해 오다 보니 현재까지 같은 문제를 가지고 있는 Error handling을 가져오게 된 것이죠. 그래서 우리의 Error handling은 같은 문제들을 가지고 있습니다. 현재 프로젝트의 에러 처리 방식의 문제점1. 에러 로그의 일관성이 부족합니다.어떤 에러 로그는 최상위 API 실행시에만 몰아서 출력되고,어떤 에러 로그는 최상위 API 실행..
![Golang zero-value 알아보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSJak5%2FbtsItRyW3zW%2FJHDz8djVp56XYE5WUOuXwK%2Fimg.png)
Golang에서 zero-value는 변수의 타입에 따라서 할당되는 기본 초기값을 의미합니다.Go에서 변수 선언시 초기값을 지정하지 않으면 해당 변수는 그 타입의 zero-value로 자동 초기화됩니다.왜냐면 go는 empty, null 혹은 undefined의 개념이 없기 때문이죠 아래와 같은 이유로 Zero-value는 중요합니다. 예상 가능한 기본값: 초깃값을 명시하지 않아도 프로그램의 동작이 예측 가능하게 합니다.명시적인 초기화 코드 감소: 명시적인 초기화를 생략할 수 있어 코드가 더 간결해집니다. The Go Programming Language Specification - The Go Programming Language Golang 타입별 Zero-value booleanfalsenume..
![[번역] Golang vs Spring boot native 성능 비교해보기 - Hello world 케이스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBOvVg%2FbtsIsw9zDYK%2Ftaak4vo92h1rlgL9B5zLr1%2Fimg.png)
Spring Boot 3.2 Native로 실행 와 Golang의 Gin, Fiber & Echo 사이의 성능을 비교해보려고 합니다.(Java Spring Boot vs Golang Gin vs Golang Fiber vs Golang Echo) 테스트 환경모든 테스트들은 Macbook Pro M2와 16GB RAM & 8+4 CPU cores를 썼습니다.load tester는 Bombardier를 사용했습니다.codesenberg/bombardier: Fast cross-platform HTTP benchmarking tool written in Go (github.com) GitHub - codesenberg/bombardier: Fast cross-platform HTTP benchmarking t..
![Golang init() 사용법 및 주의 사항](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWyPOm%2FbtsHsRzyqe3%2FX7hraT4laKi8JxLhQSmGmK%2Fimg.jpg)
Golang Init의 기본 순서Init 함수는 기본적으로 Application의 상태를 정의하기 위해서 사용합니다.어떠한 Argument를 받거나 return 값을 제공하지도 않습니다.패키지가 처음 불려지면 그때 모든 상수나 변수가 계산되고 그 이후에 Init() 함수가 실행됩니다. 간략하게는 아래 순서로 실행됩니다.import --> const --> var --> init() 조금 더 자세히 설명하자면 아래와 같습니다.만약 패키지가 다른 패키지를 import하면, import한 패키지의 init() 및 initialize 과정이 먼저 실행됩니다.현재 패키지의 constant가 initialize 됩니다.현재 패키지의 variable이 initialize 됩니다.최종적으로 현재 피키지의 init() ..
![우리 프로젝트에서 Golang DB 처리 시에 GORM을 사용 해야 하는 이유](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEHYgq%2FbtsG3rJOOAa%2FGqPvTPN2Ls1BfOzeNeKHjk%2Fimg.png)
제가 현재 회사에서 개발중인 제품에서 사용하는 Language는 Golang입니다.기존에는 제품에 DB를 도입할 필요가 없었다가 최근에 DB 도입을 하게 되었습니다.DB를 개발자들이 잘 다루기 위한 방법이 필요했는데요. 그 중 찾아낸게 바로 GORM 이었습니다. GORM을 쓰는 근거와 그것을 정리하는 Architecture Decision Record를 작성을 해보려고합니다. GORM 사용시의 장점1. 개발 효율성 관점 1) 테이블 Creation SQL관리가 필요없습니다. Go의 구조체를 테이블로 관리하면 됩니다. 우리 프로젝트에서는 각 서버에 DB를 직접 생성해서 작업을 하기때문에 아래와 같은 Table Creation SQL 코드도 관리해야하고 이를 Golang의 Type들과 datatype syn..