Golang 파일서버 만들기 - 읽기

Server

Language :

안녕하세요 Lovefield입니다.

최근 파일서버를 관리하면서 Node.js의 여러 문제를 마주치게 되었습니다. 많은 고민을 하다가 결국 Golang으로 넘어가기로 결정하고 빠르게 작업에 착수했습니다. 생각보다 Golang은 만족스러웠고, 이 글에 사용한 방법을 작성하려합니다.

먼저 Golang을 사용하기 위해서 다운로드를 받아야합니다. 공식 홈페이지 https://go.dev/dl/ 에서 Golang을 다운로드해줍니다. 다음 명령어로 Golang이 잘 설치 되었는지 확인합니다.

shell

go version

버전이 잘 뜬다면 Golang의 설치가 잘 되었다는 뜻입니다. 이제 기본적으로 서버상에 있는 파일을 읽어서 내보내주는 코드를 작성합니다.

1. go.mod 파일 생성

text

module main

go 1.20

require ()

Golang을 사용하는데 있어서 필요한 정보가 기록됩니다. Node.js로 치자면 package.json의 역할을 하는 파일이죠. module부분은 npm run 처럼 실행할 패키지를 지정합니다.

2. index.go 파일 생성

text

package main

import ()

func main(){
  …
}

Golang파일의 기본 구조입니다. func를 이용해 main이라는 함수를 생성합니다. 이 함수 명을 package 에 등록함으로써 이 Golang에서 main package가 있음을 인지합니다. 앞서 "go.mod" 파일에서 module 부분에 선언한 이름이 package 명이 되는것이죠. 즉 go run . 명령어를 사용해 실행을 하게 되면 "go.mod" 에서 선언한 module 부분을 읽어 실행해야할 package를 탐색합니다. "index.go" 에서 main이라는 함수를 package에 등록했으니 해당 함수가 실행되게 됩니다.

자, 이제 실질적으로 Golang으로 서버에 있는 파일을 읽어서 response에 담아주는 작업을 진행 합니다. 기본적으로 다음과 같은 모듈을 사용했습니다 : "net/http" ,"os" ,"github.com/gorilla/mux"

"net/http" ,"os" 이 두 모듈은 기본 모듈이기 때문에 따로 설치할 필요가 없습니다. "github.com/gorilla/mux"는 별도로 설치를 해줘야 하는 모듈이므로 터미널에서 다음 명령어를 사용해줍니다.

text

go get -u github.com/gorilla/mux

설치가 완료되었다면 사용할 모듈을 등록해줍니다.

text

import (
  “net/http”
  “os”
  “github.com/gorilla/mux”
)

IDE에 Golang 관련 설정이 있다면 사용한 모듈은 자동으로 로드하고 사용하지 않은 모듈은 자동으로 제거될겁니다. 이제 main 함수를 작성합니다.

text

func main(){
  r := mux.NewRouter() # mux 라우터

  r.HandleFunc("/file/{fileName}", func(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r) # URL 파라미터 값 추출
    fileBytes, err := os.ReadFile(“somePath”+vars[“fileName”]) # 파일 읽기

    if err != nil{ # 에러
      panic(err)
    }

    w.WriteHeader(http.StatusOK)
    w.Header().Set("Content-Type", "application/octet-stream")
    w.Write(fileBytes)  
  }).Methods("GET")


  http.ListenAndServe(":3000", r) # 서버 시작
}

위의 코드는 매우 단순합니다. 단지 URL로 파일 이름을 전달받고 해당 파일을 읽어서 body에 내려줄 뿐이죠. 생각보다 Golang으로 파일을 읽어 내려주는 방법은 간단했습니다. 저는 여기서 더 많은 기능을 구현했는데요. 해당 기술들은 다음 글에서 서술하도록 하겠습니다. 감사합니다.

Lovefield

Web Front-End developer

하고싶은게 많고, 나만의 서비스를 만들고 싶은 변태스러운 개발자입니다.