프로그래밍(Web)/Golang

    [바미] 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 - HEROKU를 사용한 웹 호스팅

    HEROKU를 들어가 회원가입 후 로그인을 해줍니다. 그 후 Documentation에 들어가서 Get Started를 클릭 후 Go언어를 선택해 줍니다. 그러면 Go언어를 올릴 수 있는 튜토리얼이 진행이 되는데, Start를 클릭 합니다. 그러면 설치하는 화면이 나오는데, Git을 먼저 설치 한 뒤, 각 운영체제에 맞게 HEROKU Tool을 설치해 줍니다. 설치가 완료 되었다면, 명령프롬프트 창을 열고, heroku login 을 입력해주면 이러한 문구가 뜨는데 아무키나 눌러 줍니다. 그러면 새 창이 뜨면서 로그인 창이 뜨게 되는데요. 그 후 로그인을 하고 브라우저를 닫아주면 로그인이 완료 되어 있는 것을 확인 할 수 있습니다. 다음 단계로 넘어가 봅시다. 그러면 App을 Prepare 하는 페이지가..

    [바미] Go - 세션별 데이터 저장

    다른 아이디로 로그인해도 똑같은 Todo가 나오는게 문제 였었는데 각 세션별로 따로 데이터를 저장해서 각 세션에 해당하는 데이터만 보여주도록 수정 할 것입니다. 먼저 model/sqliteHandler.go에 세션 아이디도 저장할 수 있도록 CREATE TABLE 쿼리문을 수정 해줍니다. func (s *sqliteHandler) GetTodos(sessionId string) []*Todo { todos := []*Todo{} rows, err := s.db.Query("SELECT id, name, completed, createdAt FROM todos WHERE sessionId=?", sessionId) if err != nil { panic(err) } defer rows.Close() for..

    [바미] Go - Login Page

    지난번에 만들었던 Todos에 Login 화면을 추가 해봅시다! 풀소스 부분에 public/signin.css와 public/signin.html파일이 있습니다. 이것을 열어보면 아래와 같이 단순하게 구글 로그인과 페이스북 로그인을 지원하는 Page인데요. 이번에는 지난 번에 했었던 Google OAuth를 가지고 구글 로그인을 할 수 있도록 구현해봅시다. 먼저 app폴더에 signin.go 라는 파일을 추가해서 지난번에 했었던 OAuth 코드를 main()을 가져옵니다. app/signin.go package app import ( "context" "crypto/rand" "encoding/base64" "fmt" "io/ioutil" "log" "net/http" "os" "time" "github..

    [바미] 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..

    [바미] Go - Todo(Add, Delete, Complete)

    public/todo.js .... $(function() { var todoListItem = $('.todo-list'); var todoListInput = $('.todo-list-input'); $('.todo-list-add-btn').on("click", function(event) { event.preventDefault(); var item = $(this).prevAll('.todo-list-input').val(); if (item) { todoListItem.append("" + item + ""); todoListInput.val(""); } }); ... 저번에 이어서 여기에서 '.todo-list-add-btn'을 클릭했을 때 서버에 add를 요청할 수 있게 만들어 봅시다! 이..