GO

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] 이 글은 엄밀히 말하면...
2019-05-28
필자는 주로 자바로 개발해 왔는데 최근 Golang으로 개발하면서 데이터베이스를 다룰 일이 생겼다. Golang에서는 자바의 JDBC 와 같은 database/sql 패키지 를 제공한다. 이 글은 Golang 초심자로서 필자가 database/sql 패키지를 사용하면서 겪었던 삽질기 중 1편으로 매개변수 표시자 Parameter Placeholder 에 대한 글이다. 매개변수 표시자 SQLite 메모리 데이터베이스 커넥션 풀 Unknown column? 아래는 database/sql 패키지를 사용하여 데이터베이스 parent 테이블에서 id가 '1'인 열의 name 컬럼을 조회하는 코드이다. 데이터베이스로는...
2018-05-23
이번 글은 Popit 서비스 개편을 어떻게 했는지에 대한 시리즈 글 로 두번째 글입니다. 1편: 시스템 구성 및 WordPress 테이블 구성 소개 2편: Go로 만든WordPress 읽기 전용 API 서버 구축 소개 3편: React 서버 사이드 렌더링 Popit 서비스 개편 작업을 하면서 개발한 내용 중 WordPress 데이터를 제공해주는 API 서버 개발 관련 글입니다. Popit API 서버는 Go 언어로 개발되어 있습니다. 이번 글에서는 Go와 Go의 웹 프레임워크 중의 하나인 echo , 그리고 ORM 라이브러리 xorm 을 어떻게 사용했는지에 대해 살펴보겠습니다. 이글에서 설명하는 모든 코드는 다음 gitlab 레포지토리에 있으며 실제 Popit 서비스에 운영되고 있는 코드입니다....
더보기