[go] 구조체 복사하는 라이브러리 copier

박세훈·2022년 11월 25일
0
post-thumbnail

라이브러리는 : https://github.com/jinzhu/copier

jinzhu는 gorm(30.6k)를 만든 사람의 git 계정 이름이다.

copier는 3.8k의 star수로 꽤나 인기가 있는 라이브러리다.

라이브러리 설명은 I am a copier, I copy everything from one to another

심플하다.

구조체(Struct) Field 이름이 같을 때 구조체 -> 구조체로 데이터를 옮길 때 유용하게 쓸 수 있다.

의존성 측면에서 데이터를 주고받을 때 객체를 생성하는 경우가 있다.

필자도 마찬가지로 유저로부터 데이터를 받을 때, 데이터베이스에 접근할 때, 구조체를 달리한다.

성능 측정

직접 입력할 때 vs Copier

func BenchmarkCopierMap(b *testing.B) {
	b.Run("copier", func(b *testing.B) {
		for i := 0; i < b.N; i++ {
			detail := "asd"
			req := &transport.AcademyCreateRequestBody{
				Info: transport.InfoForCreate{
					Name:           "asd",
					CallNumber:     "call",
					BusinessCode:   "code",
					AddressRoad:    "road",
					AddressDetail:  &detail,
					AddressSigungu: "sigungu",
				},
				YogaIDs: []int{1, 2},
			}
			aca := &ent.Academy{}
			copier.Copy(aca, req.Info)
			if *aca.Name != "asd" {
				b.Fail()
			}
		}
	})

	b.Run("direct", func(b *testing.B) {
		for i := 0; i < b.N; i++ {
			detail := "asd"
			req := &transport.AcademyCreateRequestBody{
				Info: transport.InfoForCreate{
					Name:           "asd",
					CallNumber:     "call",
					BusinessCode:   "code",
					AddressRoad:    "road",
					AddressDetail:  &detail,
					AddressSigungu: "sigungu",
				},
			}

			aca := &ent.Academy{
				Name:          &req.Info.Name,
				CallNumber:    &req.Info.CallNumber,
				BusinessCode:  &req.Info.CallNumber,
				AddressRoad:   &req.Info.AddressRoad,
				AddressDetail: req.Info.AddressDetail,
			}
			if *aca.Name != "asd" {
				b.Fail()
			}
		}
	})
}

같은 시간 대비 100배의 실행회수 차이가 난다.

코드를 깔끔하게 가져갈 것인가, 속도를 가져갈 것인가 그것이 문제로다...

profile
changing

0개의 댓글