Toy Project with Go Lang - 1

1 minute read

Project 시작

Project 를 시작하기에 앞서 구상하고 있는 것을 먼저 정리를 해 보려고 한다. 우선, 간단하게 생각하면 Front-End 에는 사용자가 게시글을 작성하고 확인할 수 있어야 하고 Back-End 는 사용자의 요청에 따라 게시글 작성을 하면 DB 에 해당 내용을 저장하고, 게시판 화면에서는 DB 에서 게시글 리스트를 받아와 제공해야 한다.

그러면, 내가 가장 우선적으로 해 봐야할 것은 GoLang 으로 DB 만지기 게시글 포맷은 일반 커뮤니티 사이트에서 가져오고, 해당 포맷으로 데이터를 넘겨주면 해당 내용을 DB 에 저장하는 것부터 시작하자.

가장 기본적으로 게시글이 가져야 할 포맷은 제목본문 이라고 생각해서 다음과 같이 구조체를 만들었다.

type Post struct {
  Title string
  Text string
}

간단한 테스트를 위해 테스트 코드를 다음과 같이 작성했고, 결과를 확인하기 위해 GoLang 에서 select 문을 사용해 확인도 했지만 추가적으로 MySQL Workbench 에서도 데이터를 확인할 수 있는지를 봤다.

func main() {
  fmt.Println("Go MySQL Tutorial")

	db, err := sql.Open("mysql", "username:pwd@tcp(127.0.0.1:3306)/test")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	var p Database.Post
	for i := 0; i<3; i++ {
		fmt.Print("Title : ")
		fmt.Scanln(&p.Title)
		fmt.Print("Text : ")
		fmt.Scanln(&p.Text)

		Database.InsertPost(db, p)
	}

	Database.SelectAll(db)
}

위의 코드에서 Database 패키지의 함수들을 사용할 수 있도록 만들었고, 가장 기본적인 포맷만 지정을 했다. sql Open 한 객체 db 를 함수에 인자로 넘김으로써 해당 함수에서 SQL 객체를 사용할 수 있도록 했고, DB 에 데이터를 추가하고자 사용한 InsertPost 함수에서는 Data Format 을 갖춰 인자로 넘겨줬다.

Database 패키지의 내용은 다음과 같이 작성했다. 아직 추가해야 할 내용들이 있지만, 우선 데이터를 추가하고 조회하는 것만 기능하도록 구현했다.

package Database

import (
	"database/sql"
)

type Post struct {
	Title string
	Text string
}

func InsertPost(db *sql.DB, p Post) error {
	insert, err := db.Query("INSERT INTO posts (title, text) VALUES(?, ?)", p.Text, p.Title)
	if err != nil {
		return err
	}
	defer insert.Close()
	return nil
}

func SelectAll(db *sql.DB) error {
	results, err := db.Query("SELECT title, text from posts")
	if err != nil {
		return err
	}

	for results.Next() {
		var post Post

		err = results.Scan(&post.Title, &post.Text)
		if err != nil {
			panic(err)
		}

		println(post.Title, post.Text)
		// log.Printf(post.Title, post.Text)
	}
	return nil
}

우선 오늘은 여기까지.. 다음에는 사용자 입력을 통해서 데이터를 추가/조회하는 게 아니라, http Post/Get 을 활용해서 할 수 있도록 http 를 활용하는 것을 공부해 볼 생각이다.