일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MSA
- logging
- database/sql
- AI
- 구조체
- GoF
- GIT
- 티스토리챌린지
- elasticsearch
- blank import
- sqs fifo queue
- context7
- go-sql-driver
- replication lag
- 오블완
- go
- 캡슐화
- golang
- Kubernetes
- goland
- AWS
- javascript
- Intellij
- typescript
- Infra
- 디자인패턴
- esbuild
- 관측 가능성
- RDS
- 통합 로깅 시스템
- Today
- Total
목록2025/09 (6)
Fall in IT.
전통적인 모놀리식(Monolithic) 아키텍처에서 마이크로소프트 아키텍처(MSA)로의 전환은 이제 거스를 수 없는 흐름이 되었다. MSA는 서비스의 독립적인 개발과 배포를 가능하게 하여 조직의 생산성을 극대화하는 강력한 장점을 가지고 있다. 하지만 서비스가 잘게 쪼개지고, 하나의 요청이 여러 서비스 간의 복잡한 네트워크 호출로 이어지면서 새로운 문제가 발생했다. 바로 시스템의 동작을 이해하고 추적하기가 극도로 어려워졌다는 점이다.과거 모놀리식 환경에서는 CPU, Memory 사용률과 같은 시스템 매트릭과 로그 파일만 잘 확인해도 장애의 원인을 비교적 쉽게 파악할 수 있었다. 그러나 MSA 환경에서는 문제가 발생했을 때, 수많은 서비스 중 어느 곳에서 문제가 시작되었고, 그 여파가 어디까지 미쳤는지 파악..
오늘은 많은 개발자들이 매일 사용하지만, 그 내부 동작까지는 깊이 생각해보지 않았을 '비밀번호 암호화'에 대해 이야기해보려고 합니다. bcrypt, rainbow table, salt 같은 키워드들, 어렴풋이 알고만 계셨나요? 이 글을 통해 개념을 확실히 정리하고 가시죠!지금 우리 서비스는 안전할까? - BCrypt와 Argon22025년 현재, 우리가 만드는 대부분의 서비스는 BCrypt 알고리즘으로 사용자의 비밀번호를 해시(hash)하고 있을 겁니다. 1999년에 개발되어 오랜 기간 안정성을 검증받은, 아주 훌륭한 '국민 알고리즘'이죠.하지만 기술은 계속 발전합니다. 2015년 열린 암호 해싱 대회에서 우승을 차지한 Argon2라는 새로운 강자가 등장했습니다. Argon2의 가장 큰 장점은 무엇일까요..
개발을 하다 보면 시간이 지날수록 연차는 쌓이는데, 스스로 실력이 크게 성장하지 못했다고 느낄 때가 있다.왜 이런 일이 생기는지 곰곰이 생각해봤다. 연차는 늘지만 실력이 정체되는 이유빠르게 아웃풋을 내야 하는 환경단기적인 결과물만 요구받다 보니 깊이 있는 고민이나 설계를 적게 한다.당장의 문제 해결에만 몰두문제를 근본적으로 해결하기보다, 눈앞의 버그나 이슈만 처리하는 데 급급하다.“이 정도면 됐다”는 안일함지금 당장은 돌아가니까, 더 나은 설계나 확장성은 미뤄둔다.코드가 성숙할 기회가 없는 환경프로젝트가 단기간에 끝나고 사라지거나, 장기적인 유지보수가 이루어지지 않는 경우 코드가 성숙될 수 없다.학습과 피드백이 없는 조직 문화보고 배우고 성장할 수 있는 동료가 없다면, 개인의 성장은 더딜 수밖에 없다. ..
Go에서 context.WithValue()를 사용해 값을 전달할 때, 습관적으로 string 타입을 key로 사용하곤 했습니다. 하지만 이 방식은 key 충돌과 같은 문제가 발생할 수 있습니다.이 글에서는 안전한 context key 사용법과 주의사항에 대해서 알아보겠습니다.string key 사용시 발생할 수 있는 문제const UserIdKey string = "user_id"func withUserId(ctx context.Context, user *User) context.Context { return context.WithValue(ctx, UserIdKey, user)}위의 코드는 go-staticcheck에서 경고를 발생시킨다.should not use built-in type string..
DDD(Domain Driven Design)를 적용하여 Go 프로젝트를 개발할 때, 데이터베이스에서 조회한 데이터를 도메인 엔티티로 복원하는 과정은 항상 수반되는 아주 귀찮은 작업이다.이 글에서는 엔티티의 캡슐화를 유지하면서 효율적으로 복원하는 방법에 대해 정리해보았다.Go에서 DB → DTO → Domain Entity로 복원하는 세 가지 방법과 각각의 장단점 그리고 마지막으로 Java(Spring boot + JPA)에서의 처리 방법을 비교해보겠다.먼저, 일반적인 Account Entity 구조를 살펴보자.// 계좌 엔티티type Account struct { id ID name string balance money.Money version int createdAt time.Time updatedA..
Go 언어로 Database에 접근하려고 할때, 보통 이런 코드가 들어간다.import ( "database/sql" _ "github.com/go-sql-driver/mysql")여기서 github.com/go-sql-driver/mysql은 MySQL 드라이버인데, 흥미로운 점은 _로 import 한다는 점이다.“어? 명시적으로 사용하지 않는걸 반드시 임포트해야 동작하게 만들어놨다고..?” 란 의문이 생긴다.이 부분에 대해서 그 이유와 동작 방식을 쉽게 풀어보겠다.1. Blank Import (_)의 의미Go에서 import _ “패키지”는 해당 패키지를 코드에서 직접 사용하지는 않지만, 패키지의 init() 함수는 실행되게 만든다.즉, _를 붙이면 명시적으로 패키지를 호출하여 사용하진 않지만, si..