Framework
-
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (2) 튜토리얼 개요2021.08.20
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (2) 튜토리얼 개요
해당 튜토리얼은 'Building Go Web Applications and Microservices Using Gin'의 내용을 번역하며 개인적으로 정리한 것입니다.
이번 시간부터 우리는 Go Lang의 Gin Web Framework를 사용해서 기사(Article) 목록과 기사의 세부 정보를 표시하는 간단한 웹 어플리케이션을 구축해볼 것입니다. 이번 튜토리얼을 통해 우리는 Gin Web Framework를 사용해서 웹 어플리케이션을 구축하는 전반적인 방법을 공부해볼 수 있을 것입니다.
0. 시작 전에
튜토리얼 진행을 위해서 우선 Go, curl, git 이 설치되어 있어야 합니다.
1. 왜 Gin으로 제작하나요?
Gin은 웹 어플리케이션, 마이크로 서비스를 구축하는데 사용할 수 있는 고성능 마이크로 프레임워크입니다. Go Lang의 내장 라이브러리인 net/http는 HTTP 서버를 쉽고 간편하게 만들 수 있는 훌륭한 기능이지만, 유연성이 떨어지고 구현을 위해 일부 상용 코드를 필요로 합니다. 또한 Go Lang에는 '패턴'을 기반으로 하는 경로를 처리하는 내장 지원 기능이 없습니다. 추가 코드 작성을 통해 기능을 구현할 수 있으나 코드를 모든 곳에서 반복사용하거나, 재사용을 위한 라이브러리를 제작해야할 가능성이 높습니다.
Gin에서는 이러한 상용 코드를 줄이고 웹 어플리케이션 작성을 간단하게 만들어 줄 수 있는 라우팅, 미들웨어 지원, 렌더링과 같은 기능들이 포함되어 있습니다.
2. 어플리케이션 설계
Gin에서 Request가 어떻게 처리되는지 간단히 살펴보고 가도록 합시다. 일반적인 웹 어플리케이션, API 서버, 마이크로서비스에 대한 제어 흐름은 다음과 같습니다.
요청(Request) ➡ 라우터 분석(Route Parser) ➡ ([선택사항] 미들웨어) ➡ 라우터 핸들러(Route handler) ➡ ([선택사항] 미들웨어) ➡ 응답(Response)
3. 어플리케이션 기능
튜토리얼을 통해 우리가 직접 만들어볼 어플리케이션은 간단한 기사(Article) 관리 웹 페이지입니다. 이 어플리케이션은 다음과 같은 기능을 수행하도록 작성할 것입니다.
- (로그인하지 않은) 사용자가 사용자 이름과 패스워드를 등록할 수 있도록 합니다
- (로그인하지 않은) 사용자가 사용자 이름과 패스워드로 로그인하도록 합니다
- (로그인한) 사용자가 로그아웃할 수 있도록 합니다
- (로그인한) 사용자가 새 기사(Article)를 작성할 수 있도록 합니다
- (모든 유저가) 메인 페이지의 모든 기사 목록을 표시합니다
- (모든 유저가) 자체 페이지에 단일 기사를 표시합니다
해당 기능들 외에도 기사 목록과 하나의 기사는 HTML, JSON, XML 형식으로 접근할 수 있어야합니다.
이 과정들을 통해 우리는 Gin을 사용하여 기존 웹 어플리케이션, API 서버, 마이크로서비스를 설계하는 방법을 그려낼 수 있습니다. 우리는 Gin이 제공하는 다음의 기능들을 사용할 것입니다.
- 라우팅(Routing) : 다양한 URL의 처리
- 사용자정의 렌더링(Custom rendering) : 응답(Response) 형식을 처리
- 미들웨어(Middleware) : 인증(authentication)을 구현
또한 모든 기능이 의도한대로 작동하는지 테스트를 통한 검증도 작성할 것입니다.
4. 라우팅(Routing)
라우팅(Routing)은 모든 최신 프레임워크들이 제공하는 핵심 기능 중 하나입니다. 모든 웹 페이지, API 엔드포인트는 URL로 액세스됩니다. 프레임워크는 라우트를 사용하여 이러한 URL에 대한 요청을 처리합니다.
예를 들어, URL이 http://www.example.com/some/random/route 이면 경로는 /some/random/route 가 되는 것입니다.
Gin은 구성과 활용이 용이하고 빠른 간편 라우터를 제공합니다. 지정된 URL을 처리하는 것 외에도 Gin 라우터는 패턴, 그룹화된 URL도 처리할 수 있습니다.
이번 튜토리얼에서 우리는,
- / (HTTP GET 요청) 경로에 인덱스 페이지를 제공합니다 .
- /u 라우터 하위 페이지에 사용자 관련 경로를 그룹화하고,
- /u/login(HTTP GET 요청) 에서 로그인 페이지를 제공합니다
- /u/login(HTTP POST 요청) 에서 로그인 자격 증명을 처리합니다
- /u/logout(HTTP GET 요청) 에서 로그아웃합니다
- /u/register(HTTP GET 요청) 에서 등록 페이지를 제공합니다
- /u/register(HTTP POST 요청) 에서 등록 정보를 처리합니다
- /article 루트 하위 페이지에 기사글을 그룹화하고,
- /article/create(HTTP GET 요청) 에서 기사 생성 페이지를 제공합니다
- /article/create(HTTP POST 요청) 에서 제출된 기사를 처리하고,
- /article/view/:article_id(HTTP GET 요청) 에서 기사 페이지를 제공합니다 특히, :article_id 이 부분은 주의해주세요. : 으로 시작하는 부분이 동적 라우터(Dynamic Route)임을 나타냅니다. 이는 :article_id의 모든 값을 포함할 수 있으며 Gin은 이 값을 라우트 핸들러(Route handler - 경로처리) 에서 사용할 수 있도록 합니다.
5. 렌더링(Rendering)
웹 어플리케이션은 HTML, TEXT, JSON, XML, 기타 형식과 같이 다양한 형식으로 응답을 렌더링할 수 있습니다. API 엔드포인트와 마이크로서비스는 일반적으로 JSON 형식뿐만 아니라 원하는 다른 형식의 데이터로도 응답이 가능합니다.
다음 섹션을 통해서 우리는 기능을 복제하지 않고도 다양한 유형의 응답을 렌더링하는 방법을 살펴볼 것입니다. 우리는 주로 HTML 템플릿으로 요청에 응답합니다. 그러나 JSON, XML 데이터로 응답할 수 있는 두 엔드포인트도 정의할 것입니다.
6. 미들웨어(Middleware)
Go Lang 웹 어플리케이션의 관점에서 보자면 미들웨어는 HTTP 요청을 처리하는 동안 모든 단계에서 실행할 수 있는 코드의 조각입니다. 일반적으로 여러 경로에 적용하려는 공통 기능을 캡슐화(encapsulate)하는 데 사용됩니다. HTTP 요청이 처리되기 전, 후에 미들웨어를 사용할 수 있습니다. 미들웨어의 일반적인 용도에는 권한 부여, 유효성 검사 등이 있습니다.
요청이 처리되기 전에 미들웨어가 사용되는 경우, 요청에 대한 변경 사항은 메인 라우터 핸들러에서 사용할 수 있습니다. 이는 특정 요청에 대해 일부 유효성 검사를 구현하려는 경우에 편리합니다. 반면에 라우트 핸들러 이후에 미들웨어를 사용하면 라우트 핸들러로부터 응답을 받게 됩니다. 이 경우 라우터 핸들러의 응답을 수정하는 데 사용할 수 있습니다.
Gin을 사용하면 여러 경로를 처리하는 동안, 공유해야 하는 몇 가지 공통 기능을 구현하는 미들웨어를 작성할 수 있습니다. 이것은 코드베이스를 작게 유지하고 관심사를 분리하며 코드 유지 관리성을 향상시킵니다.
코드베이스(Code base) : 특정 시스템, 애플리케이션, 컴포넌트 등을 빌드할 때 사용되는 소스코드의 전체집합, 그것을 담은 저장소
우리는 일부 페이지와 작업이 다음과 같은지 명확히 해야합니다. 예를 들어, 기사 작성, 로그아웃은 로그인한 사용자만 가능하도록 하고, 일부 페이지 및 작업(회원가입, 로그인)은 로그인하지 않은 사용자만 가능하도록 하는 것 등을 말합니다.
이 논리를 모든 경로에 적용하면 상당히 지루하고 반복적이며 오류가 발생하기 쉽습니다. 운 좋게도 이러한 각 작업에 대한 미들웨어를 만들고 특정 경로에서 재사용할 수 있습니다.
우리는 튜토리얼에서 모든 경로에 적용시킬 미들웨어를 만들 것입니다. 이 미들웨어(setUserStatus)는 인증된 사용자의 요청인지 여부를 검사합니다. 그런 다음 템플릿에서 이 플래그를 기반으로 하는 일부 메뉴 링크의 가시성을 수정하는 데 사용할 수 있는 플래그를 설정합니다.
다음 시간부터는 본격적으로 Gin Web Framework를 설치하고 웹 페이지를 구성할 HTML 파일들과 main.go 에 들어갈 소스코드를 직접 작성해보도록 하겠습니다. 위의 내용은 전반적인 기본 지식으로, 이해하신 내용들을 기반으로 다음 단계의 작업을 진행하시면 더욱 튜토리얼을 효율적으로 공부하실 수 있을 것입니다.
'IT > Develop' 카테고리의 다른 글
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (4) 템플릿 연결하기 (0) | 2021.08.20 |
---|---|
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (3) 기본 템플릿 작성 (0) | 2021.08.20 |
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (1) Web Framework 기초 (0) | 2021.08.16 |
Go Lang 기초 14 - 고 루틴(Go Routine) (0) | 2021.08.02 |
Go Lang 기초 13 - 인터페이스(interface) (0) | 2021.07.30 |
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (1) Web Framework 기초
많은 프로그래밍 언어들은 저마다의 멋진 프레임워크와 라이브러리를 가지고 있습니다.
일반적으로 프로그래밍 언어를 사용할 때 말하는 라이브러리(Library)란 쉽게 가져와서 사용할 수 있는 도구들을 모아놓은 공구함같은 것이라고 생각하시면 됩니다. 프로그래밍을 할 때 필요할만한 도구들을 가져와서 개발환경에 맞게 사용할 수 있도록 제공하는 도구죠.
이에 반해 프레임워크(Framework)는 흔히 말하는 뼈대, 기본골격을 의미합니다. 이 안에는 여러 인터페이스와 컴포넌트들이 포함이 되어있습니다. 일정한 뼈대가 잡혀있고 그 안에서 개발자가 자신의 목표에 맞는 도구들을 사용해서 결과물을 만들어낼 수 있도록 돕는 역할을 하는 것이죠.
국내에서 정말 많이 사용되는 유명 프레임워크로는 JAVA의 Spring이 있습니다. 채용 홈페이지에서도 대부분의 JAVA 개발자 채용의 경우 Spring Framework에 대한 경험을 필수 혹은 우대한다는 내용의 Job description을 심심치 않게 확인할 수 있습니다.
비단 JAVA만 그런 것이 아닙니다. Ruby on Rails, Python의 django 또한 해당 언어를 사용하는 개발자라면 누구나 사용해봤거나 공부해보고자할 정도로 널리 알려진 프레임워크입니다. 해당 언어를 사용하지 않는 개발자들도 딱 들으면 알 정도로 유명합니다.
Go Lang에서는 이런 JAVA의 spring, Python의 django 같은, 언어를 대표할만한 프레임워크가 어떤 것이 있을까요?
GitHub에 한 repo는 GitHub의 STAR를 받은 수를 기준으로 Go Lang의 Web Framework 순위를 집계하고 있습니다.
https://github.com/mingrammer/go-web-framework-stars
작년까지는 가장 많은 star를 받은 Gin과 두번째로 많이 받은 Beego 간의 star 차이가 크지 않았는데 2021년 8월 현재를 기준으로 Gin 5만 vs Beego 2.6만 정도로 거의 2배에 가까운 차이를 벌렸습니다. Gin이 압도적으로 치고 올라가는 모습입니다. 개발에 있어 가장 많은 사용자가 있고, 가장 이슈와 포크가 활성화된 오픈소스는 분명히 큰 장점을 가집니다.
Gin은 사용이 간편하면서도 빠른 속도가 장점인 프레임워크입니다. Go Lang의 프레임워크 체험해보기에 아주 좋을 것입니다.
1. Gin 설치하기
Gin의 패키지를 설치하려면 Go version이 1.13이상이어야 합니다.
Mac은 터미널, 윈도우에서는 CMD를 통해 다음 명령어를 입력하여 패키지를 설치합니다.
$ go version : Go 버전 확인
$ go get -u github.com/gin-gonic/gin : Gin 패키지 설치
패키지 설치가 끝나면 작성할 코드에 Gin을 임포트합니다
import github.com/gin-gonic/gin
Gin 가이드에 따르면 필요에 따라 net/http 임포트를 하도록 권장하고 있는데, IDE 환경에서 작성 시 별도의 임포트를 하지 않아도 자동으로 임포트되므로 놓치더라도 큰 문제가 발생하지 않을 것입니다.
2. 간단 예제 작성으로 동작시켜보기
다음의 예제를 작성하여 Gin 패키지가 제대로 동작하는지 직접 확인해보도록 합시다.
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
위의 예제를 직접 작성해서 실행하시면 GET/ping 서버가 동작하고, 메시지가 잘 출력되고 있음을 확인할 수 있습니다.
Gin으로 기본적인 Router를 만드는 방법은 다음과 같습니다.
r := gin.Default()
예제에는 r을 사용했지만 Gin의 다른 많은 예제에서는 router 로 정의하고 있습니다.
서버 포트 변경을 위해서 r.Run에서 원하는 포트번호값을 입력해줄 수 있습니다.
r.Run(":포트번호")
3. GET, POST, PUT, PATCH, DELETE, OPTIONS 사용하기
Gin을 통해 REST API 설계를 작성해볼 수 있습니다
func main() {
router := gin.Default()
router.GET("/someGet", getting)
router.POST("/somePost", posting)
router.PUT("/somePut", putting)
router.DELETE("/someDelete", deleting)
router.PATCH("/somePatch", patching)
router.HEAD("/someHead", head)
router.OPTIONS("/someOptions", options)
router.Run()
}
다음 포스팅에서는 Gin 프레임워크를 활용하여 직접 간단한 웹 서버를 만들어보는 예제를 통해 조금 더 상세한 내용을 알아보도록 하겠습니다.
'IT > Develop' 카테고리의 다른 글
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (3) 기본 템플릿 작성 (0) | 2021.08.20 |
---|---|
Go Lang 웹 프레임워크 기초 - Gin 체험하기 (2) 튜토리얼 개요 (0) | 2021.08.20 |
Go Lang 기초 14 - 고 루틴(Go Routine) (0) | 2021.08.02 |
Go Lang 기초 13 - 인터페이스(interface) (0) | 2021.07.30 |
Go Lang 기초 12 - 메소드(Method) (0) | 2021.07.28 |