개요 Go에서 XORM을 사용하며 soft delete 기능을 구현하는 것에 대해 이모저모를 알아본다. ChatGPT를 적극 활용하였음을 밝혀두며, 코드 동작은 확인하였다. Soft delete Soft delete란 데이터베이스 관리에서 데이터를 실제로 삭제하지 않고, 데이터가 삭제된 것처럼 처리하는 방식을 말한다. Soft delete를 구현하는 일반적인 방법은 데이터베이스 테이블에 '삭제됨' 상태를 나타내는 별도의 필드(예: is_deleted, deleted_at 등)를 추가하고 사용자가 데이터를 삭제하려고 할 때, 실제로 데이터 행을 제거하는 대신 '삭제됨' 상태를 나타내는 필드를 업데이트하여 삭제 표시를 한다. 예를 들어, deleted_at 필드에 삭제 요청 시간을 기록하여 언제 데이터가 삭..
개요 2021년에도 관련글을 작성 하였었는데 최근에 이 부분을 한 번 더 읽게되어 정리해둔다. Timeout은 강건한(robust) 애플리케이션을 만드는데 핵심적인 역할을 한다. 우리가 제어할 수 없는 외부의 시스템, 서버와 소통을 하는데 무한정 기다릴 수가 없으니 일정 시간내에 원하는 응답을 받지 못하면 더 이상 기다리지 않는것이다. http.Client 에서는 다양한 Timeout을 설정할 수 있는데 http.Client의 Timeout 필드만 보자. http.Client의 Timeout 필드 type Client struct { Transport RoundTripper CheckRedirect func(req *Request, via []*Request) error Jar CookieJar Time..
개요 Go를 사랑한다고 말하고 다녀놓고서는 이걸 확실히 해두지 못했었다. 결론부터 말하면 main 함수(역시 고루틴이다)이 종료하면 모든 고루틴은 종료한다. 하지만, 그 외의 함수는 리턴을 하더라도 함수 내에서 실행한 고루틴은 종료하지 않는다. main 함수가 종료하면 고루틴도 종료된다 예제 1. 고루틴 중간 종료 코드 링크: https://goplay.tools/snippet/78mv5TTsJMd 고루틴은 1초를 기다렸다 출력을 하는 코드인데, 그 전에 main 함수가 종료해버리기에 고루틴도 종료가 되어버려 출력을 하지 못한다. package main import ( "fmt" "time" ) func main() { fmt.Println("main start") go func() { time.Slee..
개요 Golang Docker container 내에서 timezone을 한국으로 하고 싶다. 이를 위해서는 원하는 timezone을 로드한 다음, 설정을 하면 되는데 경량 이미지라면 timezone data를 이미지에 추가해줘야 한다. 구현 Local time 설정하기 실행 코드: https://goplay.tools/snippet/jsxRaDEqQeY time.LoadLocation 으로 timezone을 로드해서 time.Local 에 설정하면 KST 로 나오는 것을 알 수 있다. package main import ( "fmt" "time" ) func main() { // Load the Seoul timezone currentTime := time.Now() fmt.Println("Curren..
개요 Golang 개발시에만 로그가 출력되었으면 하는 경우가 있다. 이럴때는 환경변수와 로그 설정을 활용할 수 있다. 단순한 내용이지만 기록해둔다. 코드 예시 환경변수 RUN_MODE를 읽어들여서 그 값이 dev 가 아니라면 log의 출력을 io.Discard로 내보낸다(== 버려버린다) dev 라면 discard 되지 않고 출력이 된다. 💡 Discard is an io.Writer on which all Write calls succeed without doing anything. // Go 1.20 package main import ( "io" "log" "os" ) func main() { runMode := os.Getenv("RUN_MODE") if runMode != "dev" { log...
개요 요청이 빈번하게 발생한다면 연결을 끊지않고 유지해두는 것이 낫다. 하지만 요청이 없는데도 연결을 유지하는 것은 또 다른 비용이다. 이번에는 연결을 언제까지 유지하여야 하는지에 대한 설정을 알아보자. IdleConnTimeout 이다. MaxIdleConns: 유지 가능한 최대 유휴 커넥션 수, default: 100 MaxIdleConnsPerHost: 호스트마다 유지 가능한 최대 유휴 커넥션 수, default: 2 IdleConnTimeout: 유휴 커넥션 타임아웃, default: 90초 MaxConnsPerHost: 호스트마다 사용 가능한 최대 활성/유휴 커넥션 수, default: 0 (무제한) 커넥션 풀에 무한정 연결을 유지할 수 없다. 클라이언트 코드 서버는 이전 포스팅에서와 같이 바로..
개요 지난 포스팅에서는 MaxConnsPerHost의 기본 설정이 무제한이라 에러가 발생한 경우를 보았다. 기본 설정을 보완하여 문제를 해결해보자. 기본 설정을 참고로 다시 보아두자. MaxConnsPerHost는 하나의 호스트(서버)에 연결할 수 있는 개수의 설정이다. MaxIdleConns: 유지 가능한 최대 유휴 커넥션 수, default: 100 MaxIdleConnsPerHost: 호스트마다 유지 가능한 최대 유휴 커넥션 수, default: 2 IdleConnTimeout: 유휴 커넥션 타임아웃, default: 90초 MaxConnsPerHost: 호스트마다 사용 가능한 최대 활성/유휴 커넥션 수, default: 0 (무제한) 호스트(서버)당 최대 연결개수의 제한 서버코드 서버는 요청을 받..
개요 Golang HTTP 클라이언트의 커넥션 풀(connection pool)에 대해서 명확히 정리하고 싶다는 욕심이 있었는데 좋은 블로그 포스팅을 찾아서 이참에 정리를 해본다. 내용의 대부분과 코드는 다음 링크에서 가져온 것이다. 링크: https://www.sobyte.net/post/2022-03/go-http-client-connection-control/ 버즈빌 기술 블로그의 글도 정성이 가득하여 큰 도움이 되었다. 링크: https://tech.buzzvil.com/blog/http-connection-pool-in-go-explained/ 개념 정리 서버와 클라이언트는 서로간의 원하는 작업을 위해 연결하고 일을 한다. 이를 다음과 같이 비유해본다. 전송 계층(Transport layer) ..
개요 1. 특정 파일 하나를 embed 하여 고객이 template으로 요구할 경우 다운로드 할 수 있도록 하고 싶다. 2. Golang echo framework 를 사용중이다. 내용 GitHub: https://github.com/nicewook/echo-serve-embedfile embed로 가져온 다음 ReadFile() 메서드로 파일을 읽어 바이트 슬라이스로 만든 다음 Content Disposition 헤더로 파일이름을 지정하고 ContentType을 명시한 다음 바이트 슬라이스를 회신한다. //go:embed static var static embed.FS func main() { e := echo.New() e.GET("/csv", func(c echo.Context) error { p,..
이 글은 Golang이라기 보다는 Postgres 이야기이다. 개요 Postgres는 timestamp, timestamptz 라는 데이터베이스 타입을 제공한다. 두 타입의 차이를 Golang과 bun 패키지를 이용해 확인해본다. TL;DR 두 타입은 저장시의 표현방법의 차이이지 담고있는 절대시간의 값은 같다. timestamptz 타입은 Postgres 서버 내부에 설정되어 있는 timezone 설정에 따라 저장이 된다. 나의 선택은 timestamp를 사용하여 항상 UTC 타임으로 저장하며, 사용자에게 이를 보여주는 애플리케이션에서 사용자의 컴퓨터 timezone에 맞게 변환하여 보여주도록 하는 것이다.(다른 분들의 선택, 모범 답안이 궁금하다.) 준비작업: macOS에 Postgres 설치하기 다양..
- Total
- Today
- Yesterday
- 독서
- solid
- Gin
- 제이펍
- 잡학툰
- clean agile
- go
- folklore
- 노션
- bun
- 티스토리챌린지
- OpenAI
- golang
- ChatGPT
- 엉클 밥
- 인텔리제이
- 독서후기
- Bug
- agile
- websocket
- API
- 오블완
- github
- 클린 애자일
- 영화
- intellij
- 2023
- strange
- 체호프
- notion
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |