golang

    [바미] 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를 요청할 수 있게 만들어 봅시다! 이..

    [바미] Go - OAuth 2.0

    OAuth? 자체 회원가입을 가지지 않고(또는 있음에도), 외부 유명한 사이트(구글, 페이스북, 등등)를 통해 계정의 정보를 가져오는것을 말합니다. 이것이 동작하는 구조는 클라이언트가 웹 사이트(A)에 로그인 요청을 하고, 그 사이트가 요청을 받으면 구글이나 페이스북 등에 OAuth를 요청하고, 그러면 클라이언트에게 해당 사이트(구글, 페이스북 등)의 로그인화면을 알려주게 되고, 클라이언트가 그 화면에서 로그인을 하고, 완료가 되면 콜백주소를 등록하게 되고, 그 해당 사이트(구글, 페이스북 등)가 클라이언트가 원래 로그인 하려고 했었던 사이트(A)에 콜백 주소를 통해 Refresh Key와 API Key를 알려주게 됩니다. 그리고 그 API Key를 통해 회원의 정보를 인가받게 됩니다. 근데 이 Key는..

    [바미] Go - Decorator 패턴

    Decorator? 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴입니다. 실제 예로 들면 Data를 어떤 사람에게 보낼려 할 때 '압축'을 해서 보낸다던지, '암호화'를 해서 보낸다던지, 나중에 추적할 수 있도록'log'를 단다던지, 마케팅 서버가 있다면 그 곳에 보낸다던지, 등의 기능들이 추가 되는 것이 Decorator입니다. 그렇다면 왜 Decorator를 사용할까요? 앞서 설명했던 '압축', '암호화', 'log', '마케팅요소'등을 하나로 뭉쳐서 만들 수도 있지만 이 부가 기능들은 대체로 잘 바뀌는 특성이 있습니다. 그래서 Data(오리지날 기능)는 바뀌지 않는데, 부가 기능들이 바뀔 때 마다 다 바꾸어 주어야 하기 때문이며, 이는 ..

    [바미] Go - RESTful API(PUT, GET list)

    먼저 테스트 코드 부터 작성하고 시작합시다! myapp/app_test.go 맨 아래에 추가해줍니다. func TestUpdateUser(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() req, _ := http.NewRequest("PUT", ts.URL+"/users", strings.NewReader(`{"id":1, "first_name":"changbeom", "last_name":"song", "email":"changbeom@naver.com"}`))) resp, err := http.DefaultClient.Do(req) assert.NoError(err) assert..

    [바미] Go - RESTful API(DELETE)

    기존에 있는 코드에 이어서 테스트 코드 부터 만들어 줍니다. myapp/app_test.go package myapp import ( "encoding/json" "io/ioutil" "net/http" "net/http/httptest" "strconv" "strings" "testing" "github.com/stretchr/testify/assert" ) func TestIndex(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Get(ts.URL) assert.NoError(err) assert.Equal(http.StatusOK, resp.S..

    [바미] Go - RESTful API(POST)

    GET에 이어서 myapp/app_test.go를 수정 해줍니다. myapp/app_test.go package myapp import ( "io/ioutil" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestIndex(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Get(ts.URL) assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ := ioutil.Read..

    [바미] Go - 간단한 JSON Transfer 만들기.

    Web Handler에 이어서 main함수의 http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello Bar!") }) 부분 중 fooHandler처럼 func(w http.ResponseWriter, r *http.Request) 부분을 바깥으로 빼서 수정 해줍니다. func barHandeler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello Bar!") }) 이렇게 수정한 뒤 main함수에 이에 해당하는 코드를 수정해줍니다. http.HandleFunc("/bar", barHandler) 이렇게 각각 경로에 해당하는 Handl..

    [바미] Go - 간단한 Web Handler 만들기

    package main func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 1 fmt.Fprint(w, "Hello World") // 2 }) http.ListenAndServe(":3000", nil) // 3 1 : http.HandleFunc으로 선언 하여 경로는 처음 경로인 "/"으로 해주고, 함수 타입을 w http.ResponseWriter, r *http.Request" 으로 넣어줍니다. 2 : 함수의 내용. 3 : port 번호 3000으로 지정 합니다. 여기서 중요한 건 http.HandleFunc, http.ListenAndServe인데 HandleFunc은 어떤 Handler를 등록하..