라이브러리는 : 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 이름이 같을 때 구조체 -> 구조체로 데이터를 옮길 때 유용하게 쓸 수 있다.
의존성 측면에서 데이터를 주고받을 때 객체를 생성하는 경우가 있다.
필자도 마찬가지로 유저로부터 데이터를 받을 때, 데이터베이스에 접근할 때, 구조체를 달리한다.
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배의 실행회수 차이가 난다.
코드를 깔끔하게 가져갈 것인가, 속도를 가져갈 것인가 그것이 문제로다...