GO

2023-02-08
ETag는 Entity Tag의 줄임말이다. Entity라는 말이 생소할 수도 있는데 Entity는 HTTP 메시지(Messages)와 연관이 있다. HTTP 메시지와 Entity HTTP 메시지는 HTTP 통신상에서 웹 서버와 클라이언트가 서로 주고받는 것을 의미한다. 클라이언트가 웹 서버로 보내는 메시지를 요청 메시지(Request Messages)라고 부르며, 웹 서버가 요청에 의해 클라언트에게 보내는 메시지를 응답 메시지(Response Messages)라고 부른다. [caption id="attachment_29284" align="aligncenter" width="600"] 출처: HTTP The Definitive Guide - 10 page[/caption] Entity는 HTTP 메시지의 일부를 말하는데 메시지는 Entity를 감싸 만든다. 즉 메시지는 컨테이너로 Entity는 화물로 비유할 수 있다. 아래 그림은 HTTP 메시지에서 Entity 영역을 보여준다. [caption id="attachment_29285" align="aligncenter" width="600"]...
2022-11-02
나는 Go에서 Error가 발생할 때 Stack Trace를 함께 출력하는 ‘ Golang Error Stack Trace와 로깅 ’ 라는 글을 쓴 적이 있다. 하지만 시스템을 운영하면서 Panic을 Recover한 경우 Error Stack Trace가 출력되지 않는다는 것을 발견했다. 이 글은 ‘ Golang Error Stack Trace와 로깅 ’ 에 이어지는 글로 Panic을 Recover한 경우에도 Stack Trace를 출력하는 방법을 소개한다. Panic 우선 Go에서는 Java와 같은 Exception이 없다. 명시적으로 Error를 전달하여 처리하며 관용적으로 마지막 반환 값을 사용한다. 아래 코드를 보면 f1 함수를 호출할 때 반환 값의 error가 nil 이 아니면 error가 발생한 것이다....
2022-03-27
나는 최근 몇 년 간 Golang(이하 Go)을 사용하고 있지만 이전에는 주로 Java로 개발했었다. Java는 오류를 Exception으로 다루며 오류가 발생하면 개발자가 별도 처리하지 않아도 Strack Trace를 출력한다. 아래 그림을 보자. C의 23줄에서 오류가 발생한 상황이다. Stack Trace로 표현하면 아래와 같다. 오류와 어떤 경로로 발생했는지 보여주는 것이다. C의 C-1 함수 23 줄에서 오류 발생 B의 B-1 함수가 C의 C-1 함수 호출 A가 B의 B-1 함수 호출 Go에서는 오류를 Error로 다룬다. 아쉽게도...
2020-08-11
최근 중국 전자 상거래 동향 중 하나는 모바일 거래 와 해외 직구 가 크게 성장하고 있다는 것이다. [1] 이런 상황에서 필자는 중국인들이 모바일을 통해 한국 상품을 구매할 수 있는 역직구몰을 만들고 있다. 모바일이라고 하면 안드로이드나 아이폰 앱을 떠올릴 수 있겠지만 앱 스토어 같은 곳에서 다운로드해 설치해야 하는 불편함과 서비스를 이용을 위한 회원 가입을 시키는 것은 쉬운 일이 아니다. 또한 앱을 개발하는 입장에서 안드로이드와 아이폰 코드를 함께 만들고 유지하는 것 역시 쉽지 않다. 위와 같은 문제를 해결하기 위해 선택한 것이...
2020-07-31
필자는 마이크로서비스 아키텍처 Microservice Architecture (이하 MSA) 기반으로 커머스 시스템을 만들고 있다. MSA에서 어려운 점 중 하나는 데이터 일관성을 유지하는 일 이다. 예를 들어 주문 프로세스(결제, 주문 원장 기록, 재고 차감 등등)는 모두 성공하거나 하나라도 실패한다면 이전 상태로 되돌아가야 한다. 모놀리틱 아키텍처 Monolithic Architecture 와 관계형 데이터베이스를 사용하는 전통적인 시스템은 데이터베이스 트랜잭션을 사용하여 데이터 일관성을 보장한다. 반면 마이크로서비스마다 데이터베이스를 따로 사용하는 MSA는 데이터베이스 트랜잭션만으로 보장이 안된다. 왜냐하면 통합된 하나의 데이터베이스를 사용하지 않기 때문이다. 물론...
2020-03-17
※ 고 언어 1.13 버전을 기준으로 설명합니다. 고 모듈을 사용하여 패키지 구성 방법 개선하기 에서 로컬 모듈 [1] 을 사용하는 방법도 소개했습니다. 로컬 파일 시스템에 있는 모듈을 바로 사용하는 방법으로 조직 내에서만 사용되는 비공개 모듈에 적용할 수 있습니다. 그런데 이전 글에서 로컬 모듈에 대해 버전을 명시할 수 있는 것처럼 소개했는데 알고보니 그렇지 않았습니다. 위 예제처럼 v1.2.2로 버전을 명시했더라도 실제 파일 시스템에 있는 모듈의 상황에 따라서 다른 버전이 사용될 수 있습니다....
2020-03-05
지난 이야기 지난 글 에서는 상품을 유연하게 다루기 위한 시도로 오퍼 Offering 개념을 구현하였다. 개발 주기 목표 오퍼는 존재만으로는 가치가 없다. 고객이 보고 구매함으로써 비로소 가치가 생긴다. 그래서 이번 개발 주기의 목표는 고객이 방문할 수 있는 쇼핑몰(이하 Mall)을 만들고 오퍼를 노출하는 것으로 정했다. Mall은 별도로 존재하는 웹 애플리케이션으로 고객이 상품을 보고 장바구니에 담고 구매할 수 있는 온라인 쇼핑몰이다. Mall 웹 애플리케이션...
2020-02-05
회사에서 API 서버를 주로 고 언어로 개발하고 있습니다. 사용해본지 2년 정도 지났는데 간단한 API 서버를 만드는 데에 큰 불편함은 없습니다. 한가지 아쉬운 점이라면 외부 패키지를 사용할 때 발생할 수 있는 몇 가지 문제들이 있다는 점입니다. 외부 패키지 버전 일관성 문제 빌드 서버에서 매 빌드마다 외부 패키지들을 새로 다운로드 받을 경우 로컬에서 개발을 할 때 사용하던 외부 패키지들과 빌드 서버에서 빌드를 할 때 사용하는 외부 패키지들의 버전이 불일치 할 수 있습니다. 결국 빌드가 실패하거나 배포가 되더라도 API 기능에 예상치 못한 문제가 발생할 수 있습니다....
2019-06-10
* 시작하기 앞서 이 글은 김형준 님의 경험을 필자가 전해 듣고 상대적으로 시간이 있는 필자가 단순 정리한 것임을 밝힙니다. 글감뿐만 아니라 글을 쓰는 마지막까지 검토해 주신 김형준 님에게 감사드립니다. 애플리케이션에서 데이터베이스를 다룰 때 시스템 자원이 많이 소비되는 부분 중 하나는 데이터베이스 커넥션을 생성하는 것이다. 한 번 생성한 데이터베이스 커넥션을 버리지 않고 재사용 하여 성능을 향상시킬 수 있는데 이때 사용하는 것이 데이터베이스 커넥션 풀(이하 커넥션 풀)이다. sql/database 패키지는 기본적으로 커넥션 풀을 지원한다. 이 글은 sql/database 패키지 커넥션 풀 사용법과 한 걸음 더 나아가 커넥션 풀 내의 커넥션이 끊어지는 경우 어떻게 처리할 수 있는지 소개한다....
2019-05-31
SQLite 데이터베이스는 파일뿐만 아니라 메모리 모드도 지원한다. 그래서 필자는 데이터베이스 테스트 픽스처 로서 주로 SQLite 메모리 데이터베이스를 사용한다. 데이터베이스 드라이버는 프로그래밍 언어에서 데이터베이스를 다룰 때 필요하다. 필자의 경우 go-sqlite3 드라이버 사용했다. 문제는 데이터베이스 접속 URL에 따라 상이하게 동작한다는 것 이다. [caption id="attachment_22202" align="alignnone" width="600"] https://github.com/mattn/go-sqlite3[/caption] 이 글은 엄밀히 말하면...
더보기