[Go] entgo: 시작해보기
entgo는 go의 대표적인 orm 라이브러리 중 하나다.
generate 기반으로 구조가 잡혀있는게 특징이고, gorm보다는 이게 좀더 제대로 만들어진 것 같다.
gorm은 Update나 Patch에 대한 기능 정의가 끔찍하고, 기본적인 드라이버 구현도 제대로 안해놔서 테이블에 필드 추가만 해도 캐시로 쿼리가 터지는 문제가 있다.
entgo는 이런 부분들에 대해서는 조금 더 낫다.
여기서는 entgo의 기본적인 사용 형태만 대략 정리해본다.
엔티티 정의하기
entgo는 엔티티나 그에 따른 구성 파일이 하나도 없으면 뭘 시작하기가 난감한 구조를 갖고 있다.
DB 커넥션부터 띄우고 시작하지는 못하는 것이다.
일단 다음과 같이 해서 ent 디렉터리를 초기화함과 동시에 User라는 엔티티를 하나 추가해보자.
go run -mod=mod entgo.io/ent/cmd/ent new User
그러면 뭐 잔뜩 다운받는데
기본적으로 ent라는 디렉터리를 만들고, 거기다가 이것저것 짱박아둔다.
저기서 당장 볼건 schema 안에 자동 생성된 User 엔티티 파일이다.
이런 식으로 개별 엔티티에 대한 껍데기가 놓이는데

여기다가 원하는 필드를 적당히 추가한 뒤에
generate를 때린다.
go generate ./ent


그러면 뭐가 잔뜩 더 추가된다.
커넥션 열기 (PostgreSQL)
그럼 이제 ent 디렉터리 안에 구성된 이런저런 것들 기반으로 해서 커넥션을 열어볼 수 있다.
Open 함수를 써서 DB 커넥션 정보 밀어넣고 실행하면 된다.

테이블 생성하기
client의 Schema.Create 함수를 사용하면 정의된 엔티티대로 테이블을 생성할 수 있다.

실행해보면


실제로 추가가 된다.

데이터 CRUD
Create 함수를 사용하면 Insert용 쿼리 빌더가 생성되고, Set 함수들을 통해서 개별 필드들에 대해 값을 할당할 수 있다.
그리고 Save를 호출하면 생성이 되는 것이다.
Query가 Select용이다.
Update를 사용하면 UpdateQuery 객체를 받아서 조건을 걸고, 원하는 필드에 대해서만 수정을 가할 수 있다.
generate 기반으로 entity를 생성해서 가능한 구조다.


잘 바뀐다.
삭제는 비슷하게 Delete 함수를 통해서 수행할 수 있다.

그러면 실제로 데이터를 날려버린다.
entgo는 다른 ORM들과 다르게 Soft Delete에 대한 동작을 정의해주지 않는다. 구현 패턴을 문서에서 소개해주긴 하는데, 그게 기본 동작으로 포함되진 않는다.
이건 단점이라고 할 수도 있는 부분이다.