golang

    [바미] Go - 포인터에 대해 알아보자!

    C#, Java는 포인터가 없지만 명시적으로 없을 뿐이지 묵시적으로 내부에선 포인터를 사용하고 있습니다. Golang은 포인터가 있습니다. 대부분 현대 언어는 포인터가 없죠. 이해하기 어려운 부분도 있고, 포인터 연산자체가 메모리를 직접 접근하기 때문에 위험하기 때문에 다른 언어들은 포인터를 감추어 내부에서만 사용하고 있습니다. 포인터를 감추다보니 다른 언어에서는 또 다른 문제들이 생겨나게 되었는데요. 내부 기능을 이해하기 어려운 부분도 있고, 이 타입이 Pointer타입인지, Value타입인지를 명시적으로 나와 있지 않다 보니까 프로그래머가 알고 있어야 되는데 그것을 잘 모르고 사용하면 문제가 되는 케이스가 발생하게 됩니다. 그 반면에 C, C++은 포인터를 가지고 있습니다. 그런데 포인터의 연산이나 ..

    [바미] Go - 구조체에 대해 알아보자!

    구조체? 영어로는 Struct라고 쓰이는데 말 그대로 어떤 구조를 가진 것이라고 보면 됩니다. 예를 들면 이런 것이죠. type Person struct { name string age int } 이런식으로 여러가지 변수들을 하나로 묶어서 하나의 이름으로 말하는게 구조체라고 보면 됩니다. 이것이 나온 이유는 프로그래밍이 발전된 과정을 보면 응집성(Cohesive)이 올라가고, 종속성(Dependency)이 낮아지는 방향으로 프로그래밍이 발전해 왔다고 보면 됩니다. 이렇게 만들어야 좋은 프로그래밍을 할 수 있기 때문에 이런 방향으로 계속 발전해 왔습니다. 그래서 이 Struct는 응집성을 높이는 방법입니다. 어떤 결합된 개념들이 있는데 예를 들면 성적 처리 프로그램을 만든다 했을 때 중요한 객체는 학생이 ..

    [바미] TDD에 대해 알아 봅시다!

    TDD? TDD란 Test Driven Development의 약자인데 테스트 주도 개발법이라는 뜻이며 개발 방법인데 테스트가 주도하는 개발 방법이라는 의미 입니다. 기존의 개발법은 설계 - 코딩 - 테스트 였어서 이 순서대로 진행하다 테스트에서 문제가 발생하면 다시 코딩하고, 테스트하여 코딩과 테스트가 반복되는 방식이였었는데 TDD는 테스트 - 코딩 - 개선을 반복하는 방식입니다. 간단하게 TDD를 실습해보자면 Calculator("+", 3, 2)를 만들어서 실행시켰을 때 5라는 결과가 나오는 함수를 만들어 봅시다. TDD니까 처음부터 테스트를 시켜줍니다. hello.go package main func main() { Test() } 이렇게 작성 후에 코드를 실행 시켜 보면 undefined: Te..

    [바미] Go - Websocket

    WebSocket? Web에서 할 수 있는 Socket 프로그래밍이라는 뜻인데, HTML5에 들어간 표준에 하나로, 지난번에 다루었던 Event소스라는 것과 더불어서 동적인 웹을 만드는데 사용되는 도구입니다. 이것을 사용하여 채팅 서비스 앱을 구현 해봅시다! 우선 EventSource에서 불필요한 부분들을 지운 코드를 가져왔습니다. main.go package main import ( "net/http" "github.com/gorilla/pat" "github.com/urfave/negroni" ) func main() { mux := pat.New() n := negroni.Classic() n.UseHandler(mux) http.ListenAndServe(":3000", n) } 기본 mux에 기..

    [바미] Go - PostgreDB(2) feat. 드디어 풀린 에러

    위와 같은 에러는 main함수의 os.Getenv()에서 발생하여 m := app.MakeHandler("발급받은 Postgre URL") 이런식으로 해결했습니다. 그 후 git add, commit, push 후 heroku -logs --tail을 사용하여 정상적으로 작동하는지 로그를 확인해 줍니다. postgre에서는 '?'를 지원하지 않는다는 의미인데, postgre ?가 아닌 $와 숫자를 사용해야 합니다. func (s *pqHandler) GetTodos(sessionId string) []*Todo { todos := []*Todo{} rows, err := s.db.Query("SELECT id, name, completed, createdAt FROM todos sessionId=$1",..

    [바미] Go - PostgreDB

    지금까지 Todos를 Heroku에 배포를 했습니다. heroku에서는 dyno라는 컨테이너를 쓰는데, 이것이 statelss라 fileDB를 사용할 수 없게 되어 실제 DB를 사용해야 하는데 heroku가 클라우드 서비스이기 때문에 PostgreDB라는 DB서비스를 10000레코드까지만 무료로 제공하고 있습니다. 우선 커맨드 창을 띄운 뒤에 Heroku 로그인을 해줍니다. 그 후 해당 명령어를 입력합니다. heroku addons:create heroku-postgresql:hobby-dev 이렇게 하면 현재 앱에 postgresqlDB가 추가가 되고, 티어는 hobby-dev인 무료티어로 추가가 됩니다. Created postgresql-round-47123 as DATABASE_URL 라는 의미는 ..

    [바미] Go - todos 배포

    우선 기존에 만들었었던 todos 파일을 사용자 계정 폴더에 빼내어 줍니다. 여기에 Go 모듈을 만들어 줍니다. 명령 프롬프트 창을 키고 방금 옮겼던 폴더로 이동 합니다. 그 다음 go mod init changbeomWeb/todos를 입력해 줍니다. go mod init하면 mod가 initialize하게 되는데 그 때 뒷부분에 만들려는 모듈의 이름을 적어준다. 되도록 겹치지 않게 해줍니다. 이렇게 하면 MOD파일이 생성된 것을 확인할 수 있습니다. 그 후 git init를 사용하여 git을 initialize하게 해줍니다. 그 후 해당 폴더를 열어서 import 부분들을 mod init했던 부분과 맞추어 수정해 줍니다. app/app_test.go import ( "encoding/json" "fm..

    [바미] Go - sqlite3

    SQLite 설치 Go에서 SQLite를 사용하기 위해서 mattn/go-sqlite3를 사용할 것인데요. 이 패키지가 사용하는 것이 CGO라는 것을 사용합니다. CGO는 C언어 라이브러리를 사용 할 수 있게 해주는 것인데, 문제는 이 C언어를 컴파일 할 수 있어야 합니다. 이 C언어가 표준 C언어인데, 표준 C언어를 컴파일 하기 위해서는 표준 컴파일러가 필요 합니다. MAC이나 리눅스는 기본적으로 표준 C컴파일러가 깔려있는데 MS-Window는 표준 컴파일러인 gcc가 깔려있지 않습니다. Go에서는 gcc를 기본적으로 사용하는데 윈도우에서는 제공을 하고 있지 않아서 'MinGW'라는 표준 컴파일러가 돌아가는 환경을 만들었습니다. 그래서 MinGW에서 gcc를 돌려야하는 복잡한 문제가 생겼습니다. MS가..

    [바미] Go - Refactoring

    메모리맵을 파일DB로 바꾸기 위한 전작업으로 리팩토링을 시작해봅시다. 먼저 테스트 코드를 만들어보죠! app/app_test.go package app import ( "testing" "github.com/stretchr/testify/assert" ) func TestTodos(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(MakeHandler()) defer ts.Close() resp, err := http.PostForm(ts.URL+"/todos", url.Values{"name": {"Test todo"}}) // 1 assert.NoError(err) // 2 assert.Equal(http.StatusCreated, r..