| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Golang
- eck
- ElasticSearch
- topic
- go test
- kafka broker
- minikube
- k8s
- gin
- create topic
- gortsplib
- Produce
- Consumer
- kafka-connect
- consumer group
- Kubernetes
- gorm
- Message
- Kafka Connect
- broker
- Kafka
- docker
- 쿠버네티스
- loadbalance
- kibana
- Helm
- tls disable
- go
- Elk
- http
- Today
- Total
목록전체 글 (41)
개발자의 개발괴발
Authorization과 Authentication에는 다양한 구현 방식이 존재한다.인증 로직을 직접 구현할 수도 있지만, 실제 서비스 환경에서는 사용자 관리, 보안 설정, 인증 플로우 등 고려해야 할 요소가 많다.Keycloak은 이러한 기능들을 폭넓게 제공하는 오픈소스 인증·인가 서버로, 비교적 적은 비용으로 표준적인 인증 시스템을 구축할 수 있다.본 글에서는 Keycloak을 기반으로 한 세션 인증 방식을 간단히 구현해보려 한다. 시스템 구조보통은 위와 같은 구조가 될 것 같다.User가 brower를 통해서 frontend에 접속하여 Backend Api를 호출하며 원하는 동작을 할 것이다.그 전에 User가 login을 하여 session id를 획득하고 획득한 session id를 이용해 B..
사진이나 동영상을 찍으면 구글 포토나 icloud에 자동으로 백업이 된다.사진만 있으면 어느정도 커버가 가능하지만 동영상까지 있다면 무료로 제공되는 용량은 금방 바닥나게 된다.나같은 구두쇠는 주기적으로 돈이 나가는 구독을 좋아하지 않는다.그래서 집에 설치해둔 truenas에 immich라는 서비스를 설치하기로 했다.immich는 설치도 쉽고 모바일 앱도 제공해줘서 자동으로 사진과 동영상 백업을 편하게 할 수 있다.TrueNAS에 immich 설치(실패)TrueNAS의 좋은점이 기본적인 Nas의 기능을 제공하는것 뿐만 아니라 원하는 앱들을 추가로 설치할 수 있다.TrueNAS에 접속하면 왼쪽 메뉴에 Apps가 있고 원하는 앱을 검색해서 설치할 수가 있다.마침 Immich가 있어서 아주 쉽게 설치를 끝낼 수..
많은 backend api를 호출하기 위해선 api key가 필요하다.swagger에서도 당연히 이 기능을 제공해준다. Base code바로 앞의 포스트의 코드를 아래와 같이 조금 수정하겠다.package mainimport ( "fmt" "github.com/gin-gonic/gin" "net/http" _ "example/swagger/docs" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger")...// @title Swagger Example API// @version 1.0// @description This is a sample server Petstore server.// @host localho..
Backend 개발자와 Frontend 개발자가 API 명세를 소통하는데 많은 방법이 있다.그 중에 Swagger가 제일 편리해보인다.설명도 추가할 수 있고 실제로 Request도 날려보면서 테스트를 해볼 수 있기 때문이다.python의 FastApi를 사용할땐 swagger를 자동으로 만들어줘서 편리했지만 Go의 경우에는 자동으로 만들어주지 않는다.그래서 go에서 swagger를 사용하기 위해선 추가적인 작업들을 해줘야 한다. Swagger 설치framework를 gin으로 사용한다고 가정하겠다.# module name을 example/swagger로 지정$ go mod init example/swagger# go gin package 설치$ go get -u github.com/gin-gonic/gi..
asdf 사용하게 된 계기golang을 사용할때 다양한 버전을 사용할 때가 있다.예전의 프로젝트는 예전의 버전으로, 최신의 프로젝트는 최신 버전으로 쓸 때가 그 예이다.이때 로컬에 설치된 golang을 새로 설치한다면 기존의 버전은 쓸 수 없다. 여러 버전의 golang을 설치하기 위해 환경변수를 바꾸거나 brew를 사용하는 등 다양한 방법이 있다.하지만 그 방법들은 번거로운 작업들이 많아 깔끔하게 asdf를 사용하기로 했다.asdf 설치(v0.18.0)brew install asdfmac에서 설치는 위와 같이 간단하다.다른 os 혹은 다른 설치 방법은 여기를 참고하시라.(windows는 제약이 좀 있는듯 해서 wsl을 사용하는것 같다.)asdf 사용하기golang 사용을 위해 설치했기에 golang을 ..
mlflow는 머신러닝 Experiment를 관리하고 재현성 있게 만들기 위한 오픈소스 플랫폼이다.머신러닝 모델을 학습하다보면 모델 저장도 하고 저장된 모델의 성능같은 부가 정보들을 같이 기록해야한다.아무 도구 없이 파일로 기록하다보면 기록하기도 힘들고 다시 찾아보기도 힘든데 mlflow를 사용하면 쉽게 기록하고 쉽게 찾아볼 수 있다.mlflow 설치하기설치하기는 매우 쉽다.pip install mlflowpip로 간단하게 설치할 수 있다. 이렇게하면 로컬PC에 바로 설치가 되지만 Docker를 이용해 로컬PC와 환경을 분리하고 싶다.(가상환경을 써도 분리할 수 있지만 dockerfile로 분리해보겠다.) Dockerfile# 베이스 이미지 (Python 포함된 경량 이미지)FROM python:3.13..
지난번 글에서 gortsplib로 cctv 영상을 다운받고 ffmpg로 mp4로 변환을 해보았다.여기서 각각 한 프레임을 추출해서 object detection model같은 것으로 추론해보려고 했다.단순히 생각해서 NALU가 한 프레임이라서 한 단위의 NALU만 이미지로 변환하면 된다라고 생각을 했었는데 NALU가 프레임의 단위는 아니었다.gortsplib로 한 프레임을 추출해보고 싶었는데 영상에 대한 지식이 모자라 성공하지 못했다.하지만 gocv라고 opencv를 wrapping해놓은 것이 있었다.opencv로는 rtsp 영상에서 이미지 추출하는걸 예전에 쉽게 했었던 기억이 있어 가능할 것이라 생각했다.gocv 사용하기아래와 같이 코드를 짰다.(gpt와 copilot에게 감사)python으로 했을때도..
각각의 함수의 unit test도 필요하지만 http handler에도 test가 필요하다.각각의 함수가 잘 동작한다는 보장이 있어도 handler에서 에러가 날 수도 있기 때문이다.Handler test하기handler를 테스트 하는것도 handler 함수를 호출해주는 것처럼 테스트를 할 수 있다.func GetAllUsers(c *gin.Context) { // something}그러나 handler는 parameter로 *gin.Context를 받아야한다.어떻게해야할지 몰라 당황스러울 수도 있지만 다행히도 test context를 만들어서 집어넣어줄 수 있다.func GetTestGinContext() (*gin.Context, *httptest.ResponseRecorder) { w := http..
앞에서 DB에 insert, delete하는 테스트코드를 작성해보았다.정상적으로 잘 작동하는걸 확인했으니 실제로 curl로 호출해서 잘 동작되는지 확인해보자. controller 설정아래와 같이 code를 수정하겠다.func main() { db.Init() // Create a new Gin router router := gin.Default() // Define a simple GET endpoint routerUser := router.Group("/users") routerUser.GET("", controller.GetUsers) routerUser.POST("", controller.CreateUser) routerUser.DELETE("/:userId", controller.DeleteUse..
backend 개발에 빼놓을 수 없는것 하나만 뽑으라면 db일 것이다.backend만으로 client의 요청에 응답을 할 수 있지만 영구적으로 데이터를 저장하는데는 한계가 있다.물론 메모리에 저장할 순 있지만 backend 서버가 재기동될 경우 데이터는 모두 날아가버린다.따라서 영구적으로 데이터를 저장할 수 있는 기능을 제공하는 것이 db이다.단순히 영구 데이터 저장만이 목적이 아니라 db를 이용하면 단순히 파일로 저장하는 것보다 많은 이점이 있다.그래서 이전 글에 이어 db를 추가해보도록 하겠다.sqlite3db 종류에는 여러가지가 있고 상황에 따라 적절한 선택을 하면 된다.여기서는 무거운 backend 서비스를 만드는 것도 아니 때문에 sqlite3를 사용하려고 한다.가볍다고해서 다른 db에 뒤쳐지는..