본문 바로가기

개발일지

(7)
GORM (3) - Associations Belongs To Belongs To belongs to 관계는 다른 모델과의 1대1 연결을 설정해줍니다. type User struct { gorm.Model Name string } // `Profile` belongs to `User`, `UserID` is the foreign key type Profile struct { gorm.Model UserID int User User Name string } Foreign Key belongs to 관계를 정의하기 위해서는 foreign key가 무조건 존재해야 합니다. 기본 값으로는 owner의 type 명과 pk의 결합이 사용된다. GORM은 foreign key를 커스터마이즈할 수 있도록 합니다. type User struct { gorm.Mo..
GORM (2) - CRUD CREATE user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} db.NewRecord(user) // => returns `true` as primary key is blank db.Create(&user) db.NewRecord(user) // => return `false` after `user` created Create할 때, default value tag를 줄 수 있습니다. type Animal struct { ID int64 Name string `gorm:"default:'galeone'"` Age int64 } insert SQL은 값이 없거나 zero value인거는 제외합니다. insert후에, gorm이 데이터 베이스로 부터 ..
GORM (1) - Getting Started 이번 포스팅에서는 go를 이용하여 프로그램을 작성할 때, ORM을 이용한 개발을 하기 위해서 GORM에 대해서 정리하도록 하겠습니다. GORM은 go를 위한 object relation mapping(ORM)으로 Go를 위한 ORM 프로젝트 중에서는 document도 매우 준수하고 star도 가장 많이 보유하였기에 정리해보도록 하겠습니다. GORM Docs를 보고 기능들을 정리하였습니다. GORM에서 Entity를 정의하는 방법은 Go에서 일반전인 구조체를 정의하는 것과 같습니다. 다만, tag기능을 이용하여 옵션을 줄 수 있습니다. type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time Deleted..
gRPC - Multiplexing, Metadata, Load Balancing and Compression Multiplexing gRPC 서비스에서 우리는 하나의 client에 대해서 여러개의 gRPC 서비스로 지원을 해야 하는 경우가 있습니다. 이럴 경우, 서비스들을 하나의 서버에서 각각 띄우지 않아도, gRPC에서는 리퀘스트에 대해서 multiplex를 통해 하나의 gRPC 서버에서 여러개의 서비스를 지원할 수 있습니다. 아래 예제는 이미지를 받는 서비스와 글을 받는 서비스를 따로 구성한 뒤에 multiplex 기능을 통해 하나로 합친 코드의 구현 부분입니다. func main() { lis, err := net.Listen("tcp", ":4317") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.Re..
gRPC - Context and Error Handling Context context의 주요 기능중 하나는 deadline을 통한 timeout 설정이 가능하다는 것입니다. MSA 환경에서는 client의 요청이 다수의 gRPC 요청이 필요한 상황이 많기 때문에 gRPC에서는 context 기능을 지원하고 있습니다. deadline은 요청이 생성할 때, 설정되고 서비스들 전반적으로 사용될 수 있습니다. 다음은 gRPC에서 deadline을 설정하고 사용하는 예제입니다. func (cl *Client) login() { ctx, cancel := context.WithTimeout(context.Background(), time.Second) // 1 second deadline defer cancel() // (1) r, err := cl.ChatTaskCli..
gRPC - Interceptor Interceptor gRPC 어플리케이션을 구성할 때, 서버에서나 클라이언트에서나 remote 함수들을 실행하기에 앞서 실행해야하는 여러가지 로직들이 존재할 것이다. gRPC에서는 interceptor라 불리는 로깅이나 인증, 측정등을 위해 RPC 실행전에 선점할 수 있는 기능이 있다. 모든 언어에서 지원하지는 않으니 주의할 것. 예시로는 Go, Java가 있으니 둘은 당연히 지원된다. gRPC는 2가지 타입의 interceptor로 분화된다. 이는 RPC 타입과 같다. unary interceptor와 stream interceptor. server-side와 client-side로 나뉘어서 알아보자 Server-side interceptor interceptor는 하나 혹은 2개 이상으로 구성될 수..
GRPC로 이미지 파일 보내기 개발을 하던 와중에 grpc를 통해서 클라이언트에서 이미지를 업로드하면 HTTP API를 요청을 처리하는 서버에서 이미지 파일을 받고 또 다시 이미지 파일을 다른 service에 보내야 하는 경우가 생겼다. 사실 프론트에서 바로 해당 서비스로 바로 업로드를 하거나 최종에는 스토리지에 저장을 하는 것이므로 바로 스토리지에 올려도 되지만 실시간으로 작성하는 게시판의 기능을 위한 서비스고 다른 아키텍처와의 트레이드 오프가 체감이 안되서 그냥 경험삼아 위의 루트로 업로드하는 방식을 택했다. 그럼 본론으로 syntax = "proto3"; package pb; import "article.proto"; service image_task { rpc UploadImage (ImageUploadRequest) retu..