일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- go recover
- 골랑 고퍼
- gopath 환경변수
- 고루틴 채널
- gin recovery
- 개발자
- 좀비고루틴
- go디자인패턴
- go 마스코트
- 신입개발자
- go middleware
- clean architecture middleware
- gin logger
- go 환경변수
- git
- air 환경변수
- go clean architecture
- go 캐릭터
- go channel
- go 맥 air
- go
- go 대기그룹
- gin middleware
- go 맥
- golang gopher
- go 패닉
- go air 환경변수
- go air
- go 맥 air 환경변수
- go panic
- Today
- Total
뽀미의 개발노트
Go 프레임워크 + 테스트코드 라이브러리 본문

프레임워크
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 |