Go 1.22부터 표준 라이브러리에서 더 나은 라우팅 지원을 제공함
- 기존에는 수동으로 라우팅을 처리했으나, 이제는
mux.HandleFunc
을 사용하여 간단하게 라우팅 가능
- 로그인 미들웨어를 추가하여 보안 강화 가능
내장 라우터의 주의사항: 후행 슬래시로 인한 리디렉션
-
/records/
경로를 만들면 /records
요청이 /records/
로 리디렉션됨
- 이로 인해 POST 요청의 본문이 제거되어 GET 요청으로 변경되는 문제가 발생할 수 있음
- 해결책은
POST /records/
대신 POST /records
와 같은 API 엔드포인트를 사용하는
sqlc로 데이터베이스 쿼리 코드 자동 생성
- ORM을 배우지 않고도 SQL 쿼리를 작성할 수 있는 sqlc 도구 발견
- SQL 쿼리를 작성하면 Go 코드로 자동 변환됨
- ORM의 문서를 참조하지 않고도 필요한 SQL 쿼리를 쉽게 작성 가능
sqlite 최적화 팁
- 데이터베이스에 쓰기 전용 객체를 사용하고
db.SetMaxOpenConns(1)
설정
- 읽기 속도를 높이려면 쓰기용과 읽기용으로 별도의 DB 객체를 사용
- JOIN이 필요 없는 두 개의 테이블은 별도의 데이터베이스에 넣어 독립적으로 연결 가능ㅍ
Go 1.19의 GC 메모리 제한 설정
- 256MB 또는 512MB와 같이 메모리가 상대적으로 적은 VM에서 모든 Go 프로젝트를 실행하면 애플리케이션이 계속 OOM으로 종료되는 문제 발생
- 가비지 컬렉터 기본 설정으로 인해 현재 힙 크기의 2배까지 메모리 할당을 허용
- Go 1.19에서 애플리케이션이 특정 메모리 사용량에 도달하면 GC를 실행하도록 지시하는 방법이 추가됨
- GC 메모리 제한을 250MB로 설정한 후 OOM 종료 빈도가 줄어듦
export GOMEMLIMIT=250MiB
Go로 웹사이트를 만드는 이유
- 단일 정적 바이너리로 배포가 간편함
- 프로덕션에서 사용할 수 있는 내장 웹서버가 있어 WSGI 등을 구성할 필요가 없음
- Go의 도구 체인이 설치 및 사용이 간편함
- HTTP 응답을 보내는 것이 간단하여 프로젝트 유지보수가 쉬움
- 표준 라이브러리에
net/http
가 포함되어 있어 추가 라이브러리 설치 없이 웹사이트 제작 가능
- 시스템 수준의 작업도 쉽게 수행 가능
- 모든 것이 프로젝트를 쉽게 다룰 수 있도록 만들어진 것 같음
아직 해결하지 못한 문제들
- Go에서 아직 많이 해보지 않은 것들
- HTML 템플릿 렌더링
- 실제 로그인 시스템 구현
- CSRF 구현
- 일반적으로 보안에 민감한 기능을 구현하는 방법을 잘 모르기 때문에 로그인/CSRF 등이 필요한 프로젝트는 시작하지 않음
Go의 새로운 기능을 보는 것이 멋짐
- 이 글에서 언급한 두 가지 Go 기능(
GOMEMLIMIT
와 라우팅)은 지난 몇 년 동안 새로 추가된 것
- 새로운 Go 버전에 대한 릴리스 노트에 더 주의를 기울여야 할 것 같음