개요 Go에서 XORM을 사용하며 soft delete 기능을 구현하는 것에 대해 이모저모를 알아본다. ChatGPT를 적극 활용하였음을 밝혀두며, 코드 동작은 확인하였다. Soft delete Soft delete란 데이터베이스 관리에서 데이터를 실제로 삭제하지 않고, 데이터가 삭제된 것처럼 처리하는 방식을 말한다. Soft delete를 구현하는 일반적인 방법은 데이터베이스 테이블에 '삭제됨' 상태를 나타내는 별도의 필드(예: is_deleted, deleted_at 등)를 추가하고 사용자가 데이터를 삭제하려고 할 때, 실제로 데이터 행을 제거하는 대신 '삭제됨' 상태를 나타내는 필드를 업데이트하여 삭제 표시를 한다. 예를 들어, deleted_at 필드에 삭제 요청 시간을 기록하여 언제 데이터가 삭..
개요 알라딘 링크: http://aladin.kr/p/LQhvg 길벗 출판사의 페이스북 책 나눔 이벤트에 당첨되어 읽게 되었지만, 그렇지 않아도 읽어보려 했던 책이었다. 이 책은 Go를 사용하고, 실무에서 사용해 보았지만 한 단계 레벨업이 필요한 이들이라면 필독해야할 책이며 현업의 어느 순간, 어떤 구현이 더 좋을지 애매했던 주제들에 대해 명쾌한 답을 준다. 꼭 읽어보시길 권한다. 시중에 좋은 고 언어 책이 점점 더 늘어나고 있다. 그러나, 이 100가지 패턴과 솔루션을 하나하나 외우는 것은 불가능하다. 그럴 때에는 두 가지 전략이 필요하다. 하나는 일이관지(一以貫之)이다. 하나로 꿰뚫어내는 능력이다. 책 속의 수 많은 패턴과 그 솔루션은 거슬러 올라가면 몇몇 개발의 핵심 이치와 닿아있다. 단순한 외우기..
개요 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 개발시에만 로그가 출력되었으면 하는 경우가 있다. 이럴때는 환경변수와 로그 설정을 활용할 수 있다. 단순한 내용이지만 기록해둔다. 코드 예시 환경변수 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...
개요 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 설치하기 다양..
개요 별 생각없이 go get -u 옵션을 사용해왔었는데 회사에서 사용하는 패키지를 이용한 개발을 하다 그 의미를 이해하게 되었다. 어떤 상황이었나? go work를 이용해서 workspace 디렉토리 아래에 개발하는 애플리케이션과 패키지 디렉토리를 두고 개발한다. 이 경우 애플리케이션은 같은 workspace 아래의 패키지를 이용하기 때문에 패키지를 수정해가며 개발을 할 수 있다. 하지만, 이 경우 애플리케이션의 go.mod 에 명시한 패키지의 버전 정보가 맞지 않게 된다. 해법은 go get -u 옵션 이를 업데이트 시켜주려면 1. 패키지를 GitHub으로 git push 해 준 다음에 2. go get -u 옵션으로 다시 패키지를 가져오면 된다. 좀 더 정확히는 시멘틱 버저닝으로 보면 메이저 버전은..
Golang에서의 경량 ORM으로서의 bun package를 다루며 경험한 내용을 정리해둔다. Automatic timestamp 링크: https://bun.uptrace.dev/guide/models.html#automatic-timestamps INSERT 시에 생성한 시간을 자동으로 추가하도록 하는 기능이다. Example code with comment 아래 코드와 코멘트로 설명을 마무리 한다. 전체 GitHub Repo: https://github.com/nicewook/bun-orm-study Query Building Example: https://github.com/nicewook/bun-orm-study/blob/main/default-timestamp/main.go bun 태그의 의미..
- Total
- Today
- Yesterday
- 영화
- 독서후기
- golang
- 오블완
- 제이펍
- 티스토리챌린지
- 2023
- 인텔리제이
- API
- bun
- go
- Gin
- clean agile
- OpenAI
- notion
- intellij
- 클린 애자일
- agile
- 노션
- github
- strange
- 잡학툰
- websocket
- ChatGPT
- 엉클 밥
- Bug
- solid
- folklore
- 체호프
- 독서
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |