Beego (Go application framework) 초간단 사용 소감
최근 개발하고 있는 서비스에서는 .NET, Java, Rails 등 다양한 개발 언어와 플랫폼을 사용하고 있지만 그 중에 가장 많이 사용하고 있는 언어는 Go 입니다. Go로 주로 API 서버를 개발하고 화면은 React 를 사용하고 있는 구성입니다.
이런 구성에서 아쉬운 점은 서비스 운영을 위한 관리화면을 쉽게 만들지 못해 대부분 개발자들이 직접 DB Workbench를 이용하여 운영 데이터베이스에 접근하여 조작하고 있다는 것입니다. 지난 회사(Jobplanet)에서는 모든 개발자나 서비스 운영자는 운영 데이터베이스에는 접근을 할 수 없고 모든 관리 기능은 웹 화면을 이용하였습니다. 이런 관리 화면을 빠르게 만들기 위해 Rails에서 제공해주는 Scaffold 기능을 적극 활용하였는데 현재 서비스에서도 이런 형태의 서비스 운영이 더욱 필요할 것 같아 조금씩 적용해보기로 했습니다.
Scaffolding은 시스템의 기본 골격을 만들어 주는 기능입니다. 개발에 프레임워크가 적극적으로 도입되면서부터 프로그램의 구조가 표준화 되어 이런 골격 만드는 것 더 쉬워지고 보편화 되었습니다. Scaffold를 가장 적극적으로 지원하고 사용하기를 권장하는 프레임워크가 Rails라고 할 수 있습니다. 서비스 개발에 있어 Scaffold를 어떻게 사용하고 원칙을 정하면 좋은지에 대해서는 별도로 포스팅을 해보겠습니다.
이번글에서는 Go 언어의 프레임워크 중에 하나인 beego의 scaffold 기능을 사용해 본 간단한 소감에 대해 정리해 보았습니다.
scaffold 관련 필자의 다른 글은 여기에도 있습니다.
Beego
Beego(https://beego.me/)는 Go 언어의 Application framework 중 하나입니다. github에서 Start가 11,000 이상으로 인기 많은 프로젝트라고 할 수 있습니다.
레퍼런스 사이트는 대부분 중국 서비스인데 아마 중국 회사 또는 개발자들 중심으로 진행되고 있는 프로젝트가 아닐까 생각해봅니다. 초기 문서는 영어보다는 중국어가 더 많았다고도 합니다.
Beego는 기본적으로는 ORM, Web Framework, Caching, Logging 등 Application 개발에 필요한 많은 기능을 제공해주는 Framework 입니다. 그리고 "bee" 라는 명령행 도구를 제공해주는데 이 도구를 이용하여 beego에서 제공하는 다양한 기능을 사용할 수 있습니다. Scaffold 기능도 이 bee 명령에서 제공하고 있습니다.
Beego Scaffolding
Beego의 Scaffold 기능은 "bee" 라고 하는 beego에서 제공하는 명령행 도구를 이용하여 실행할 수 있습니다. bee 명령어는 beego 설치 후 추가로 "go get github.com/beego/bee" 명령을 이용하여 설치할 수 있습니다. 설치 후 bee 명령을 치면 다음과 같이 사용 가능한 명령 목록이 나타납니다.
이중 필자에게 가장 유용했던 도구는 generate와 migrate, run 입니다.
- generate: scaffold 코드를 만들어 주는 도구
- migrate: database table의 변경 사항을 추적 실행해 주는 도구
- run: go application을 실행해주는 도구로 이 도구를 실행하면 코드 수정이 되면 자동으로 컴파일하고 재시작 없이 반영되도록 하는 도구
테스트 한 버전(1.8.4)에서의 장단점은 다음과 같습니다.
장점
- Go 언어에 대해 잘 모르는 개발자에게 Go로 Application을 개발할 수 있는 기본 코드 제공
- Scaffold 기능을 이용하면 모르는 프로그램 언어를 이해하는데 많은 도움이 됨
- DB 스키마 변경 등을 쉽게 관리할 수 있는 기능 제공
- migration 명령을 사용하여 실행, Rollback 하게 되는데 Rails와 비슷하게 지금까지 실행된 버전 이후 부터 실행해주는 기능 등 제공
단점
- 가장 큰 문제는 Scaffold로 만들어진 소스 코드에서 View 는 파일만 생성하고 실제 화면 관련 코드는 없음
- Routes에 Controller를 자동으로 등록해주지 않음
- route.go에 다음과 같이 추가하면 되지만 CRUD 처리하는 모든 Path에 대해 추가해야 됨
- beego.Router("/", &controllers.EmpController{})
- 자동으로 생성된 Controller 코드는 메소드 상단에 주석으로된 어노테이션을 이용하여 자동으로 Path, Parameter 들에 대해 인식할 수 있도록 되어 있어 이를 이용하여 다음과 같이 Rotues에 등록 가능
- beego.Include(&controllers.EmpController{})
- 이렇게 등록해도 여전히 문제가 남는데 자동으로 생성해주는 Path가 "/" 로 생성되어 코드에서 수정을 해야 함
- route.go에 다음과 같이 추가하면 되지만 CRUD 처리하는 모든 Path에 대해 추가해야 됨
- DB 테이블명, 컬럼명의 Naming Rule과 Go 언어의 Naming Rule에 대한 매핑에 대한 불완전한 지원
- Camel, Snake 표기법 등에 대해 제대로 지원되지 않음
- DB -> Struct로 로딩하는 Mapper 기능의 함수가 Struct로 연결되지 않고 전역 함수로 존재
- models.GetAllEmp() 형태
- Struct 종류가 많아지면 models 패키지 내에 많은 메소드가 존재하게 됨
- Query parameter가 필드별로 나누어져 있지 않고 다음과 같이 정의됨
- /emps?query=name:kim,age:10
- Model의 GetAll() 함수에서 query를 파싱해서 Filter 조건을 만듬
- 이 부분은 문제라기 보다는 취향의 차이라고 할 수 있음
- 자동으로 생성된 코드의 Controller에서는 결과 반환을 View로 하지 않고 JSON 형태로만 제공
- Rails의 경우 html, json 등에 따라 view, json 등 구분하여 반환
- 문서
- beego 프레임워크의 문서는 나쁘지 않지만 대부분의 오픈소스가 그렇듯이 디테일한 내용은 문서로 나와있지 않고 소스코드를 확인해야 함. 이것은 beego만의 문제는 아니고 생각.
실제 적용 소감
아직 단점이 많지만 Beego에서 제공해주는 Scaffold 기능을 이용하고 View 코드는 Go에서 기본적으로 제공해주는 Template 기능을 이용하여 테이블이 10개 정도되는 마이크로 서비스의 관리 기능을 개발해 보았습니다.
- Go를 이용하여 서비스를 처음 개발하였지만 2 ~ 3일 만에 전체 테이블에 대해 CRUD 기능을 수행할 수 있는 API, 화면을 구성하였습니다.
- 물론 위의 단점에 있는 내용은 삽질을 좀 했습니다.
- Beego 프레임워크에서 제공해주는 기능을 Scaffold 도구에서 재대로 사용하지 못하는 느낌. Beego가 나쁘다라기 보다는 Scaffold 도구가 아직 완성도가 낮아 생성된 코드가 그대로 사용하기에는 많이 부족합니다.
- Rails와 같이 좋은 Scaffold을 사용해본 경험이 있으면 그 경험 기반으로 부족한 부분을 충분히 커버할 수 있을 것 같습니다.
- Beego를 현재 운영 중 서비스의 메인 도구로 사용할 것인가에 대한 질문에 대해서는 "No" 입니다. 이유는 다음과 같습니다.
- 어차피 Beego를 수정해서 사용할 거라면 간단하게 자체 코드 생성 도구를 만들어서 사용해도 나쁘지 않을 것 같다.
- 일반 사용자 화면은 주로 React로 만들고 있는데 관리용 화면만 Server Side Rendering을 이용하는 것에 대한 고민 -> React 화면을 자동으로 생성해주는 도구를 만들 예정
- ORM은 Beego에 있는 ORM 보다는 가장 많이 사용하는 Go용 ORM을 사용할 예정
Rails 수준까지는 원하지는 않았지만 어느 정도 수준으로는 코드를 만들어 줄 것으로 기대 했었는데 제가 기대했던 수준으로는 만들어 주지 못했습니다. 다만 관리 화면을 만들 목적이 아니라 API 서버 기능을 위한 자동 생성 도구로 활용할 경우에는 나쁘지 않은 선택이라고 생각합니다.
그리고 이 글에서의 모든 내용은 beego 프레임워크 자체에 대한 내용이 아닌 beego의 도구 중 하나인 scaffold 기능에 대한 내용입니다. beego 자체에 대해서는 자세히 보지는 못했지만 나쁘지 않은 구성이라고 생각합니다.