GOLANG

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로 다룬다. 아쉽게도...
2021-08-13
요즘은 프론트엔드, 백엔드 등으로 개발이 분업화 되었고 또한 최근 많은 곳에서 마이크로서비스 아키텍처 Microservice Architecture 를 도입하면서 하나의 언어가 아닌 여러 언어로 개발하는 것이 추세인 듯하다. 여러 언어로 개발하다 보면 테스트 커버리지와 코드 코드 정적 분석 Static program analysis 결과를 각각 보면 매우 불편한데 통합하여 한곳에서 볼 수 있으면 편할 것 이다. SonarSouce 에서 만든 SonarQube 는 코드를 분석하여 중복, 테스트 커버리지, 코드 복잡도, 버그, 보안 취약성 등을 보여주는 도구이다. 특히...
2021-07-29
테스트 자동화 Test automation 의 일환으로 필자는 Golang으로 테스트 코드를 작성할 때 먼저 통합 테스트 Integration Test [1] 를 작성한다. 통합 테스트 코드를 작성하다 보면 주요 테스트 시나리오 외의 케이스를 촘촘하게 테스트 하기 어려운데 그 이유는 테스트 실행 비용(예. 웹 서버, 데이터베이스 등등)이 비싸고 비슷한 케이스를 작성하다 보면 코드 중복이 많이 발생하여 유지 보수가 어렵기 때문이다. 통합 테스트를 보완해 주는 것은 단위 테스트 Unit Test...
2021-07-19
소프트웨어에서 말하는 불변성 Immutability 이라는 것이 있다. 즉 변하지 않는다는 것 이다. 다른 말로는 읽기 전용이라고도 해석할 수 있다. 무엇이 변하지 않는다는 것일까? 객체 지향 프로그래밍으로 좁혀서 생각해 보면 한번 만들어진 객체가 변하지 않다는 것을 의미 한다. 불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스다.(중략)불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. - 이펙티브 자바 3판, 105 쪽...
2020-12-24
xORM 은 필자가 선호하는 ORM Object–relational mapping 프레임워크이다. 주요 특징 Features 은 아래와 같다. [caption id="attachment_28157" align="alignnone" width="600"] https://gobook.io/read/gitea.com/xorm/manual-en-US/[/caption] [caption id="attachment_28158" align="alignnone" width="600"] https://gobook.io/read/gitea.com/xorm/manual-en-US/[/caption] xORM은 대부분의 ORM에서 지원하는 테이블 간의 연관 관계 처리를 지원하지 않는다. 필요하면 직접 구현해야 한다. 언뜻 생각하면 불편할 것 같은데 연관 관계를 포기함으로써 기능들이 단순화되어 익히는데 시간이 짧게 걸리고 쓰기 쉽다는 장점이 있다. 이 글은 필자가 xORM을 사용하며 편리하다고 느낀 기능을 소개한다....
2020-08-11
최근 중국 전자 상거래 동향 중 하나는 모바일 거래 와 해외 직구 가 크게 성장하고 있다는 것이다. [1] 이런 상황에서 필자는 중국인들이 모바일을 통해 한국 상품을 구매할 수 있는 역직구몰을 만들고 있다. 모바일이라고 하면 안드로이드나 아이폰 앱을 떠올릴 수 있겠지만 앱 스토어 같은 곳에서 다운로드해 설치해야 하는 불편함과 서비스를 이용을 위한 회원 가입을 시키는 것은 쉬운 일이 아니다. 또한 앱을 개발하는 입장에서 안드로이드와 아이폰 코드를 함께 만들고 유지하는 것 역시 쉽지 않다. 위와 같은 문제를 해결하기 위해 선택한 것이...
2020-07-31
필자는 마이크로서비스 아키텍처 Microservice Architecture (이하 MSA) 기반으로 커머스 시스템을 만들고 있다. MSA에서 어려운 점 중 하나는 데이터 일관성을 유지하는 일 이다. 예를 들어 주문 프로세스(결제, 주문 원장 기록, 재고 차감 등등)는 모두 성공하거나 하나라도 실패한다면 이전 상태로 되돌아가야 한다. 모놀리틱 아키텍처 Monolithic Architecture 와 관계형 데이터베이스를 사용하는 전통적인 시스템은 데이터베이스 트랜잭션을 사용하여 데이터 일관성을 보장한다. 반면 마이크로서비스마다 데이터베이스를 따로 사용하는 MSA는 데이터베이스 트랜잭션만으로 보장이 안된다. 왜냐하면 통합된 하나의 데이터베이스를 사용하지 않기 때문이다. 물론...
2020-06-08
들어가기 앞서 이 글을 쓰는데 도움을 주신 cp949 님, 김형준 님 그리고 장재휴 님에게 감사드립니다. 필자는 커머스 코드 자산화 개발일지 를 연재하고 있다. 구현 과정에서 Golang을 기반으로 마이크로서비스 아키텍처를 차용하였고 대부분의 마이크로서비스(회원, 장바구니, 결제, 주문)의 데이터 저장소로 MongoDB 를 사용했다. MongoDB를 사용한 이유는 크게 두 가지였다. 집합적 데이터 모델 객체/관계형 패러다임 불일치 예를 들면 주문 도메인에서 주문을 아래와 같이 객체 모델링 할 수 있다. 그리고 여러 가지 이유로...
더보기