[Go] Context에 관한 고찰 - 3 : Graceful Shutdown의 미학
·
Language/Go
~Go Context 시리즈~[1] Context에 관한 고찰 - 1 : Context 란[2] Context에 관한 고찰 - 2 : Context의 중요성과 고루틴 누수[3] Context에 관한 고찰 - 3 : Graceful Shutdown의 미학이전 시리즈에서 우리는 Context가 무엇이고 Context를 이용해 개별 작업의 생명 주기를 어떻게 제어해야 좀비 고루틴을 방지할 수 있는지 살펴보았다. 이제 마지막으로, Context가 애플리케이션 전체의 생명주기를 어떻게 관장하며 ~우아한 종료~ 라는 현대 서버 애플리케이션의 필수 덕목을 구현하는지 살펴보려고 한다. 우아한 종료는 단순히 서버를 끄는 행위를 넘어, 시스템의 안정성과 데이터의 정합성을 보장하는 섬세한 오케스트라 지휘와 같다. 그리고 그..
[Go] Context에 관한 고찰 - 2 : Context의 중요성과 메모리 누수
·
Language/Go
~Go Context 시리즈~[1] Context에 관한 고찰 - 1 : Context 란[2] Context에 관한 고찰 - 2 : Context의 중요성과 고루틴 누수[3] Context에 관한 고찰 - 3 : Graceful Shutdown의 미학Context가 중요한 이유Context의 중요성을 간과하고 context.Background()를 남발하는 코드는 당장에는 문제없이 동작하는 것처럼 보일 수 있다. 이는 마치 브레이크 없는 자동차로 텅 빈 직선 도로를 달리는 것과 같은데, 장애물이 나타나거나(에러 발생), 교차로에서 멈춰야 하거나(요청 취소), 주차해야 할 때(서버 종료) 비로소 재앙이 시작된다...후후... (그나저나 AI 비유법 기깔난다..ㅋㅋㅋㅋ 다시 돌리려다가 웃겨서 그냥 가져옴)..
[Go] WaitGroup vs ErrGroup 비교
·
Language/Go
우선 간단하게 내용만 정리하고 나중에 뼈와 살을 보충 예정입니다. 요약특징sync.WaitGrouperrgroup.Group목적여러 고루틴이 완료될때까지 기다리기여러 고루틴이 완료될때까지 기다리되, 오류 처리와 작업 취소를 통합 관리오류 처리내장 기능 없음.오류를 전달하려면 별도의 채널(channel) 등을 직접 구현 필요내장 기능 있음.Wait() 메서드가 가장 먼저 발생한 error를 반환작업 취소내장 기능 없음.context.Context를 직접 전달하고 관리해야함.errgroup.WithContext를 통해 자동 취소 기능 제공코드 복잡성단순하지만, 오류/취소 처리를 추가하면 코드가 복잡해짐기능이 많지만, 오히려 코드는 더 간결하고 명확해짐패키지 위치syncgolang.org/x/sync/errg..
[Go] Context에 관한 고찰 - 1
·
Language/Go
~Go Context 시리즈~[1] Context에 관한 고찰 - 1 : Context 란[2] Context에 관한 고찰 - 2 : Context의 중요성과 고루틴 누수[3] Context에 관한 고찰 - 3 : Graceful Shutdown의 미학Go 언어로 서버를 만들다보면 우리는 필연적으로 context라는 단어와 마주하게 된다.나도 그랬듯이, 아마 많은 주니어 개발자들이 context를 단순히 타임 아웃이나 취소 신호를 전달하는 도구 정도로 이해하고 넘어가는 경우가 많다. 하지만 context의 본질은 그보다 훨씬 깊은 곳에 있으며, Go가 지향하는 동시성 철학의 핵심을 담고 있다.이 시리즈에서는 context가 왜 그토록 중요한지, 그리고 실제 대규모 프로젝트에서 context 생명주기를 어..
[Go] field 이름을 기준으로 field 초기화하기 with reflect
·
Language/Go
상황 설명회사에서 MySQL로 DB를 바꾸면서 코드를 전반적으로 수정할 수 있는 기회가 있었다. 평소에 사소하지만 눈여겨 보고 있었던 리팩토링 희망사항(?)이 있었는데,바로 config에 입력된 수많은 db 테이블들을 go 코드에서 각각 객체로 만들기 위해 또 변수명으로 해당 이름을 재사용(!)한다는 점이다. 말보다는 코드로 보는게 설명이 편할 것 같아 냅다 예시 코드를 가져왔다. (그렇다 원래는 MongoDB를 사용했다.)// config.toml[SomeDB]collectionName1 = "collectionName1"collectionName2 = "collectionName2"collectionName3 = "collectionName3"// config.gotype SomeDB struct {..
[Go] Decimal decoder : Decimal을 MongoDB에 바로 String으로 저장
·
Language/Go
Go 서버에서 mongoDB에 데이터를 넣을 때 추가할 수 있는 신기한 기능(?)을 리팩토링 코드 리뷰를 받으면서 알게되어 그 내용을 정리하여 글을 쓰고자 한다.리뷰받은 코드는 다음과 같다.types.DataToUpdateInMongo{ ... TotalTradingVolume: totalTradingVolume.String() ...} 여기서 TotalTradingVolume 엄청나게 큰 숫자 값(블록체인 서비스다보니 기본 단위가 10^18 이기 때문)이다. 이래저래 사칙연산도 필요하다 보니 decimal.Deciaml 타입인 totalTradingVolume을 변수로 계산을 마친 후, 이제 mongo db 저장을 위해 최종 구조체에 값을 저장하려고 하는 코드이다. mongo에 이..