핵심 정리
package main
import "fmt"
func main() {
fmt.Println("hello, go")
}Go는 새 런타임보다 간단한 배포, 빠른 컴파일, 표준 도구 체인, 동시성 모델을 같이 가져가는 언어로 보면 판단이 빨라집니다.
도입 효과
배포와 실행 경계가 단순하다
Go는 보통 go build로 실행 파일을 바로 만들고 배포합니다. Python처럼 인터프리터 환경을 같이 맞춰야 하거나, Java처럼 런타임 배포 전략을 먼저 고민해야 하는 경우보다 운영 경계가 단순한 편입니다.
go build ./cmd/api
./api즉 "어떤 환경에서 어떤 명령으로 돌릴 것인가"가 비교적 선명합니다.
표준 도구 체인이 강하다
Go는 언어 문법과 함께 go fmt, go test, go mod, go build가 기본 흐름으로 붙어 있습니다. 프로젝트마다 코드 스타일, 의존성 방식, 테스트 진입점을 따로 합의해야 하는 부담이 상대적으로 적습니다.
- 포맷팅:
go fmt - 테스트:
go test - 모듈 관리:
go mod - 빌드:
go build
이 도구 체인 일관성이 팀 생산성을 많이 좌우합니다.
동시성을 언어 표면에서 바로 다룬다
Go는 goroutine과 channel을 표준 표면으로 제공합니다. 비동기를 프레임워크가 대신 감싸는 구조보다, "작업을 나누고 결과를 합친다"는 모델을 언어 차원에서 직접 읽기 쉽습니다.
go worker(jobs, results)
result := <-results다만 이 점이 "아무 곳에나 goroutine을 뿌리기 좋다"는 뜻은 아닙니다. 취소, 종료, 소유권, 에러 전파 설계를 같이 봐야 합니다.
서버와 CLI에 특히 잘 맞는다
Go는 HTTP 서버, 백그라운드 워커, CLI처럼 오래 살아 있는 프로세스에 특히 잘 맞습니다. 표준 라이브러리만으로도 net/http, context, encoding/json, os, io 축이 강해서 초반 생산성이 좋습니다.
단순함이 장점이자 제약이다
Go는 제네릭이나 메타프로그래밍을 과하게 앞세우는 언어가 아닙니다. 문법적 표현력보다 읽기 쉬운 기본 문법과 운영 단순성을 더 우선합니다. 그래서 "언어로 많은 것을 표현하고 싶다"는 기대보다, "팀이 오래 읽고 운영할 코드를 안정적으로 쓴다"는 기대에 더 잘 맞습니다.
언제 도입할까
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 단일 실행 파일 배포가 중요 | Go |
| 표준 도구 체인을 강하게 가져가고 싶음 | Go |
| HTTP 서버, worker, CLI를 빠르게 묶고 싶음 | Go |
| 복잡한 런타임/프레임워크보다 운영 단순성이 중요 | Go |
| 언어 표현력보다 팀 일관성과 읽기 쉬움이 중요 | Go |
주의할 점
Go를 "동시성이 쉬운 언어"로만 읽으면 초반에 goroutine 누수, channel 교착, context 누락이 바로 생깁니다. Go의 장점은 goroutine 자체보다 표준 도구 체인과 운영 경계가 단순하다는 점까지 같이 가져갈 때 더 크게 드러납니다.
참고 링크
2 sources