Go 언어와 서버 실행하기
Go 언어란?
Go 언어는 Google에서 개발한 오픈 소스 프로그래밍 언어이다. 간결한 문법을 바탕으로 효율적인 개발이 가능하다.
Go는 절차적 언어이면서도 객체지향 프로그래밍 요소를 일부 포함한다. 전통적인 객체지향 요소인 클래스나 상속이 없다. 대신 구조체와 메소드, 인터페이스를 통해 객체지향 프로그래밍을 지원한다.
구조체(Structs): Go에서는 클래스가 없는 대신 구조체에 메서드를 정의함으로써 객체와 비슷한 구성을 만들 수 있다.
type Person struct {
Name string
Age int
}
func (p *Person) Greet() string {
return "Hello, " + p.Name
}
메소드(Method): Go의 메소드에는 함수명 앞에 receiver를 지정해야 한다. receiver에는 해당 메소드가 어떤 구조체에 속하는지 명시한다.
형식: func (리시버:변수 리시버:구조체타입) 메소드이름(파라미터) 리턴값
type User struct {
Name string
}
// User 구조체의 메소드 Greet 정의
func (u User) Greet() string {
return "Hello, " + u.Name
}
receiver는 p *Person과 같이 포인터 타입으로도 정의할 수 있다. value receiver는 구조체를 복사해서 전달하기 때문에 원본 데이터에 영향을 주지 않지만, pointer receiver는 구조체의 포인터를 전달하기 때문에 원본 데이터의 변경이 가능하고 메모리도 절약할 수 있다.
인터페이스(Interfaces): 구조체가 특정 메서드를 구현하도록 강제하는(추상클래스) 역할을 해준다.
type Greeter interface {
Greet() string
}
func sayHello(g Greeter) {
fmt.Println(g.Greet())
}
Go를 설치하고 서버를 실행해보자.
1. Go 설치와 환경변수 설정
Go 언어는 공식 홈페이지 https://go.dev/dl/에서 다운로드할 수 있었다. 이번에 설치한 버전은 macOS (arm64)용 LTS 버전 1.23.3이다.
1
go version
ERROR : zsh: command not found: go
Go 설치가 완료되었는데도 Go 명령어가 작동하지 않았다. Go가 설치된 위치를 시스템 환경변수에 등록해야 한다. 이젠 익숙해질 만도 한데 안 익숙하다.
1
echo $SHELL
/bin/zsh
~/.zshrc 파일에 이렇게 추가했다.
1
2
3
4
5
export GOROOT="/usr/local/go"
export GOPATH=$GOROOT/gopath
export GOBIN=$GOPATH/bin
export PATH=${PATH}:$GOROOT/bin
export PATH=${PATH}:$GOBIN
1
source ~/.zshrc
설정이 완료되면 이제 go version 명령어로 버전을 확인할 수 있다.
go version go1.23.3 darwin/arm64
2. Go 서버 실행 과정
프로젝트를 클론하고
go.mod파일이 있는지 확인한다.필요한 디펜던시를 설치한다.
1
sudo go mod tidy
- 서버를 실행한다.
1
sudo go run main.go
fail to setup run mode: argument to run server is not satisfied
이 오류는 런타임 모드를 설정하지 않아서 발생했다. setting/setting.go 파일에서 런타임 모드를 확인하는 코드 때문이었다.
func checkRunMode() error {
if len(os.Args) < 2 {
return fmt.Errorf("argument to run server is not satisfied")
}
return validator.Validate.Var(App.RunMode, "oneof=debug test release")
}
서버를 실행할 때는 반드시 debug, test, release 모드 중 하나를 인자로 전달해야 했다.
Debug 모드: 개발 환경에서 주로 사용하는 모드이다. 로컬에서 실행되는 경우 디버깅에 유리하도록 다양한 정보를 출력한다.
Test 모드: 테스트를 위한 설정을 포함하며, 디버깅 정보도 어느 정도(? 아니 챗지피티 너무 어중간하게 대답함) 포함된다. 일반적으로 테스트용 데이터베이스나 테스트 API 엔드포인트를 사용하도록 설정된다.
Release 모드: 실제 운영 환경에서 사용하는 모드이다. 최적화된 성능을 제공하며, 디버깅 정보는 출력되지 않는다.
1
sudo go run main.go debug
이렇게 해줬다.
서버가 로컬에서 실행되었으나 transaction is not initialized 라는 에러 문구가 떴다. 아직 로컬에서 사용할 디비 설정이 안돼서 그런 듯하다. 일단 끗