뽀미의 개발노트

Go 프레임워크 + 테스트코드 라이브러리 본문

Go lang

Go 프레임워크 + 테스트코드 라이브러리

산타는 뽀미 2024. 12. 20. 23:24

 


 

프레임워크

Gin-gonic/gin

go와 웹 프레임워크 중 가장 오랫동안 개발되어 왔음. 다른 프레임워크보다는 조금 무겁다고 함. Web Application과 Microservices를 만드는데 사용되는 고성능 Framework임. 내장 웹서버, 자동 라우팅, 요청 및 응답을 처리하기 위한 도구, 기능 추가를 위한 미들웨어, 내장 Logger, Template 지원 등 개발을 좀더 빠르고 쉽게 할 수 있도록 많은 기능을 제공함. 
Go는 쉽게 HTTP 서버를 만들 수 있는 net/http 라이브러리가 내장되어 있지만, 좀 별로임. 그리고 정규표현식이나 패턴을 기준으로 요청 처리하는 라이브러리는 내장되어 있지 않음. 그래서 Gin이 Boilerplate Code를 줄일 수 있게 다양한 함수들을 포함하고 있음.

라우팅(Routing)

원래 프레임워크가 제공하는 기능 중 가장 핵심이 라우팅임. 웹페이지나 API endpoint는 URL을 통해 접근할 수 있는데, 프레임워크는 이러한 URL을 통해 요청한 경로를 처리함. 만약 URL이 http://www.example.com/some/random/route이면 경로는 /some/random/route임. Gin은 그룹화된 URL과 패턴을 처리할 수 있음. /u/login에서 로그인 처리, /u/register에서 회원가입 처리, /article/view/:article_id에서 게시글 처리. :article_id 는 동적 경로. 이곳에는 아무 값이나 포함될 수 있고 Gin은 이 값을 Route Handler에서 사용할 수 있게 처리할 것임.

GORM

Golang ORM(Object Relation Mapping). SQL이 아닌 Go언어로 DB에 접근할 수 있다. 지정한 struct와 field의 이름으로 테이블을 자동 생성할 수 있다. 즉 Go struct만 관리하면 DB 스키마 관리를 할 수 있고 칼럼의 특성 및 조건까지 한번에 확인할 수 있는 것! gorm을 활용하면 에러 관리를 통합적으로 할 수 있음. struct의 메소드를 통해 데이터 접근 코드를 재사용하고, 비즈니스 로직과 db 로직을 명확히 분리할 수 있음. 또한 MySQL, PostgreSQL, SQLITE, SQL Server 등 다양한 dbms를 지원하여, DB driver만 변경하면 코드의 큰 변경 없이 쉽게 옮길 수 있음. SQL문을 쓸때 users의 id, name, age를 불러오도록 순서를 맞춰 SELECT문을 서야하는데, gorm을 사용하면 .Find(&user) 하나로 쓸 수 있음. gorm이 지원하는 logger를 활용하면 DB transaction마다 로그를 사용하여 디버깅 가능







테스트 코드

Go에는 기본 패키지 testing 을 이용하여 테스트 코드 작성 가능. 좀 더 다양한 기능을 원한다면 testify 라이브러리 이용 가능. 라이브러리 이용시 assertions나 mocking을 이용하여 생산성 높일 수 있음.
 

testing (기본 패키지)

import "testing"

func Add(a, b int) int {
    return a + b
}

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("Add(2, 3) = %d; want 5", result)
    }
}

위와 같이 기본 패키지 이용해도 unit테스트 또는 벤치마크 테스트(컴퓨터, 시스템, 소프트웨어, 알고리즘 또는 프로세스의 성능을 측정하기 위한 일련의 테스트) 작성 가능함. go test 명령어를 입력하여 테스트 돌릴 수 있음.
작거나 단순한 프로젝트일때는 기본 테스트 기능만으로 충분함. Go는 “less is more” 철학을 지양하므로 외부 의존성을 최소화하려는 경우 기본 패키지만 사용하여 경량화된 코드를 유지한다고 함.

testify (외부 라이브러리)

import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestSumWithTestify(t *testing.T) {
    result := 1 + 2
    assert.Equal(t, 3, result, "they should be equal")
}

위와 같이 testify 라이브러리를 이용할 수도 있음. assert나 require를 사용해 직관적으로 조건을 검증할 수 있고, mock 패키지를 사용해 종속성을 대체할 수 있음. 기본 testing 패키지보다 에러 메시지가 직관적임. 대규모 프로젝트 개발시 이 라이브러리를 사용하면 더 나은 가독성과 생산성을 기대할 수 있음.

'Go lang' 카테고리의 다른 글

API 설계방식 (restful API / gRPC / graphQL) 비교  (1) 2024.12.20
클라우드와 VM 이해하기  (0) 2024.12.20
Go 고루틴과 채널  (1) 2024.12.20
Go는 exception이 없다  (0) 2024.12.20
Go 컴파일 언어  (0) 2024.12.20