전체 글

전체 글

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

    [바미] Go - OAuth 2.0

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

    [바미] Go - Template

    Template? 쉽게 얘기하면 어떤 틀을 의미합니다. 코드로 알아보면 main.go package main import "html/template" type User struct { Name string Email string Age int } func main() { user := User{Name: "changbeom", Email: "changbeom@naver.com", Age: 23} tmpl, err := template.New("Tmp11").Parse("Name: {{.Name}}\nEmail: {{.Email}}\nAge: {{.Age}}") // 1 if err != nil { panic(err) } tmpl.Execute(os.Stdout, user) // 2 1 : Tmp11라는 ..

    [바미] Go - SQL query(CRUD)

    model/model.go package model import "time" type Todo struct { ID int `json:"id"` Name string `json:"name"` Completed bool `json:"completed"` CreatedAt time.Time `json:"created_at"` } type DbHandler interface { GetTodos() []*Todo AddTodo(name string) *Todo RemoveTodo(id int) bool CompleteTodo(id int, complete bool) bool // 1 close() } // var handler DbHandler func NewDBHandler() DBHandler { // 2 ..

    [바미] Go - Render, Pat, Negroni

    먼저 심플한 코드 부터 작성 해봅시다! main.go package main type User struct { Name string `json:"name"` Email string `json:"email"` CreatedAt time.Time `json:"created_at"` } func getUserInfoHandler(w http.ResponseWriter, r *http.Request) { user := User{Name: "turcker", Email: "turcker@naver.com"} w.Header().Add("Content-type", "application/json") w.WriteHeader(http.StatusOK) data, _ := json.Marshal(user) fmt.Fp..

    [바미] Go - Decorator 패턴

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