3장.

앗...? DB가 없는 환경에서 동작하게 만들라고...!??!


처음 go를 쓰면서 커피 어드민 툴을 만들 때 제가 들었던 말이예요 .

지금 남는 서버가 있긴 한데, 그 서버에 있는 DB는 사용하면 안 되는게 서버를 사용할 수 있는 조건 이였어요.


그래서 FileIO를 통하여 프로그램을 작성하기로 결심했어요.


파일 io는 2가지 정도의 조건이 있을 것 같아요.

1. CSV(comma seperate version )

2. normal version.


자, 이 두 가지를 사용하기 앞서서,

앞으로 우리가 사용할 모델을 정의해 줄거예요.

앞에서 이야기 한 조건들을 생각해 보면,

"개발자 말고 다른 직군(디자이너, 기획자)도 같이 먹을 수 있게 해주세요"

"하루 이틀은 제가 빠질 수 있도록 조정하고 싶어요"

이 말을 바탕으로 생각해보면,


이름, 직군, 이메일, 참가여부

정도의 정보를 갖는 모델이 필요해요. (이메일은 결과를 메일로 받아야하기 때문이예요!)

이를 바탕으로 모델을 만들면 다음처럼 될 수 있을 것 같아요.

type Colleague struct {
Name string
Position string
Email string `gorm:"PRIMARY_KEY"`
Attend string
}


여기서 email에서 gorm을 사용했는데요, golang에서 많이 사용하는 orm이예요 . 

이거에 대해서도 하나의 포스팅으로 분리할게요!



csv파일을 컨트롤 하기 위해서는 encoding/csv 패키지의 기본 라이브러리를 사용 할거예요.

백문이 문여일견, 먼저 읽어들이는 코드를 보고 갈게요.

func getColleagueInfoFromCsv(filename string) []Colleague {
// 파일 오픈 !
file, _ := os.Open(filename)

// csv reader 생성
rdr := csv.NewReader(bufio.NewReader(file))

// csv 내용 모두 읽기
rows, _ := rdr.ReadAll()

colleagues := []Colleague{}

var temp Colleague

// 행,열 읽기
for i := range rows {
temp.Email = strings.TrimSpace(rows[i][0])
temp.Name = strings.TrimSpace(rows[i][1])
temp.Position = strings.TrimSpace(rows[i][2])
temp.Attend = strings.TrimSpace(rows[i][3])

colleagues = append(colleagues, temp) // 1
}
return colleagues
}

나 아직 여기에서 어떻게 최적화를 해야할지 모르겠어요

// 1에 있는 부분도 최적화가 가능할 것 같은데,

일단은 돌아가는 코드를 만들고, 리팩토링 하는 리뷰도 한번 만들게요.


---- 여기부터는 작성중인 문서입니다. ---- 

2장.

Golang을 이용하여 hello-world restful api 만들기.

개발 환경.

IDE : goland

web framework : echo



이 글에서는 기초적인 go를 알고 있다는 전제조건으로 진행할거예요.


그래도 go가 처음이신 분들이 있을터이니 공부할 수 있는 링크를 같이 첨부해 둘게요.


go를 익힌 다음으로 어떤 웹 프레임워크를 사용해야하나 고민이 많았어요.


java는 spring을 쓰면 되고,

javscript는 node+express를 사용하면 되고,

python은 django를 쓰면 되는데


go는 한번도 뭘 사용해야할지 잘 모르겠더라구요.

그래서 읽은 문서들이 다음 문서들이예요.


https://wikinote.bluemir.me/golang/choose-web-framework.md

https://jaehue.github.io/post/go-my-way-1-webframework/

https://okky.kr/article/386116

https://www.buzzvil.com/ko/2018/02/12/tech-blog-go-%EC%84%9C%EB%B2%84-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0/

https://dev.to/speedwheel/top-6-web-frameworks-for-go-as-of-2017-34i 


결국에 제가 고른 웹 프레임워크는 echo 에요

마지막 업데이트가 1년전이라, 요즘엔 iris를 보고있긴 해요

처음부터 iris를 봤으면 좋을텐데..

맨 마지막 링크를 보시면 알다싶이, iris가 learning curve가 가장 낮아요. 

마지막 업데이트도 글 쓴 날 기준(2019년 1월 6일)으로 두 달 전이구요.


그래도 다른걸 써봐야지 어떤게 더 좋은지 아니까 ㅎㅎ


echo는 document를 봤을 때 정리가 너무 잘 되어있어서 사용 해야겠다고 결심했어요.


시작 전, 다음 코드를 터미널에서 실행하여 다운로드 해주세요


go get -u github.com/labstack/echo/...


최종코드.

reference : https://github.com/KwonGiho/go-starter/blob/master/go-simple-restful-api.go

package main

import (
"github.com/labstack/echo"
"net/http"
)

func main() {

e := echo.New() // 1

e.GET("/say", func(c echo.Context) error { // 2
return c.JSON(http.StatusOK, "hi")
})

e.Logger.Fatal(e.Start(":1331"))
}





1번. 

echo는 echo.New() 함수를 호출하면 

Echo 변수를 생성하고, 포인터 변수에 이 변수의 주소를 저장해요.

그리고 이 변수의 주소를 반환해요.


c언어를 좀 더 많이 하셨던 분을 위해서 좀 더 명확하게 작성해 드리면,

다음과 같이 작성할 수도 있어요.

var e echo.Echo
e = *echo.New()
e.GET("/say", sayHi)

e.Logger.Fatal(e.Start(":1332")) // 3


변수 사용 & 미사용 버전

reference : https://github.com/KwonGiho/go-starter/blob/master/go-simple-restful-api-seperate.go



2번.

앞으로 URI:1331/say로 오는 모든 요청을 이 함수가 책임질 예정이예요.


실행 url : localhost:1331/say

curl localhost:1331/say 

아래로 요청하면, "hi"라는 결과가 노출되요.

쿼리 스트링으로 요청을 보내고 싶으시면,

다음과 같이 사용하시면 됩니다.

name := c.QueryParam("name")


하위 url을 두고 싶으시면, 다음과 같이 사용하시면 되요.

e.GET("/say/:name", func(c echo.Context) error {
name := c.Param("name")
return c.JSON(http.StatusOK, name)
})


3번.

Fatal은 에러가 있을 시, 에러 메시지를 노출하고, os.Exit(0이 아닌 정수)을 호출하여 프로그램을 종료합니다.

이상이 없을 경우엔 아무 로그도 발생시키지 않아요.

1 장

"왜 이 시리즈를 작성 하는가?"


엄청 오랜만에 포스팅 하네요~


작년 하반기 회고 때 이런 말이 나왔어요.

"요즘 팀 내에서 사람들이 이야기 할 시간이 별로 없는 것 같아요"


그리하여, 커피 마시기 스크립트를 만들었는데요.

이 스크립트는 매일 3시~4시에 커피 마실 팀원들을 랜덤으로 3명 골라서

그 팀원들보고 커피를 마시라고 메일을 보내주는 스크립트예요.


팀 막내이기도 하고, 최근 일정이 바쁜 작업이 없기도 하고 재미있어 보여서 단번에 이렇게 말 했어요.

"앗 ㅎㅎ 이건 제가 만들어야 할 것 같습니다"


이 글을 쓰게 된 시초가 되어버렸네요.

처음에는 groovy로 작성하여,

정말 3명씩만 골라서 메일을 보내주는 스크립트를 작성했는데요.


원래 요구사항은 항상 변하는 것 같아요


1.0v을 만든 뒤, 많은 사람들이 저에게 가면서 던져준 퀘스트가 있었어요.


"교님 저2일 전에도 걸리고, 어제도 걸렸는데 오늘도 걸렸어요.. 한 번 걸리면 2일동안 안 걸리게 해주세요"

"교님, 저 저때만 프리미엄 커피 걸렸는데, 또 제 타임에 프리미엄 커피로 걸렸어요. 프리미엄 커피를 사야 할 확률을 우리가 변경할 수 있게 만들어 주세요"

"교님 우리 팀 내의 사람뿐만 아니라, 기획자랑 디자이너 분들도 추가해서 같이 마시는게 어때요 ?"

"교님 이거 코드 사내 깃에 올려서 공유좀 해주세요"

...



그래서 coffeeScriptAdmin을 만들기로 결심 했는데요.

요즘 NEXTERS에서 smart contract language을 만들고 있는데,

이거 만들면서 go를 많이 보고있어서 go로 다시 짜기로 결심했습니다.


그리하여, 2장부터는 간단한 restful api를 만들기부터, 

file-io, mysql을 이용한 DB연동까지 해볼 예정이예요.

+ Recent posts