더북(TheBook)

기존 app/controllers/init.go 파일에는 Revel의 기본 데이터베이스 라이브러리를 사용하기 위한 초기화 코드가 작성돼 있었다. 이번에는 데이터베이스 처리에 grom 패키지를 사용하므로 기존 코드를 모두 지우고 gorm 사용을 위한 초기화 로직만 다시 작성한다.

▼ app/controllers/init.go

package controllers
 
import "github.com/revel/revel"
 
// ➏ 웹 애플리케이션 초기화 로직 등록
func init() {
    revel.OnAppStart(InitDB)
    revel.InterceptMethod((*GormController).Begin, revel.BEFORE)
    revel.InterceptMethod((*GormController).Commit, revel.AFTER)
    revel.InterceptMethod((*GormController).Rollback, revel.FINALLY)
}

이 코드를 한번 분석해 보자.

1. gorm 패키지 임포트

gorm 패키지를 사용하기 위해 gorm 패키지를 임포트했다. gorm 패키지를 사용하려면 먼저 명령 프롬프트에서 go get github.com/jinzhu/gorm으로 gorm 패키지를 설치해야 한다.

2. GormController 정의

컨트롤러 타입으로 사용할 GormController를 정의했다. GormController는 revel의 기본 컨트롤러인 *revel.Controller를 임베디드 필드로 지정하여 *revel.Controller의 모든 기능을 그대로 사용할 수 있게 했고, 추가로 gorm을 사용하여 데이터를 처리하기 위해 Txn *gorm.DB를 내부 필드로 정의했다.

3. 데이터베이스 초기화

Revel 프로젝트의 설정 파일인 app.conf 파일에서 revel.Config.String() 메서드로 데이터베이스 설정 정보를 가져와 데이터베이스 커넥션을 생성했다. app.conf 파일에 정의된 설정 정보를 사용하는 방법은 Revel 공식 매뉴얼을 참고하기 바란다.

4. 테이블 생성

웹 애플리케이션을 구동할 때 테이블이 생성되게 했다. gorm.DBAutoMigrate 메서드는 모델 구조체의 변경 사항을 인지해서 데이터베이스 테이블에 반영한다. 테이블이 없으면 새로 생성하고, 이미 있으면 테이블 칼럼과 모델 구조체의 필드를 비교해 추가된 필드를 새 칼럼으로 생성한다.

5. 트랜잭션 설정

데이터를 처리할 때 트랜잭션 관리를 위한 코드를 작성했다.

6. 웹 애플리케이션 초기화 로직 등록

init() 함수에서 처리할 초기화 로직을 등록했다. 먼저 웹 애플리케이션을 구동할 때 InitDB() 함수를 수행하게 했고, GormController의 모든 액션마다 Begin, Commet, Rollback을 처리하도록 인터셉터(Interceptor)로 등록했다. 인터셉터에 대해서는 Revel 공식 매뉴얼을 참고하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.