...
func main() {
...
}
func connetDatabase() *sql.DB { ... }
func checkErr(err error) { ... }
func getUsers(w http.ResponseWriter, r *http.Request) { ... }
// 특정 user 정보 전달
func getUser(w http.ResponseWriter, r *http.Request) {
setJsonHeader(w)
HttpInfo(r)
// 파라미터값 체크
params := mux.Vars(r)
// 파라미터값 중 id값 추출
id, _ := strconv.Atoi(params["id"])
// 주석 처리 or 제거
// 일치하는 user id를 확인
/*for _, user := range users {
if user.Id == id {
// 일치하는 user의 데이터 표시 및 함수 종료
json.NewEncoder(w).Encode(user)
return
}
}*/
// 코드 추가
// sql.DB 객체 생성
db := connetDatabase()
// 지연하여 닫는다(필수)
defer db.Close()
// 하나의 Row를 갖는 SQL 쿼리
user = User{}
err := db.QueryRow("SELECT * FROM users WHERE id = ?", id).Scan(&user.Id, &user.Name, &user.Email, &user.Password)
checkErr(err)
fmt.Println(user)
if user.Id != 0 {
// 일치하는 user의 데이터 표시 및 함수 종료
json.NewEncoder(w).Encode(user)
return
} else {
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
}
}
// user 정보 추가
func postUser(w http.ResponseWriter, r *http.Request) {
setJsonHeader(w)
HttpInfo(r)
body, _ := ioutil.ReadAll(r.Body)
var user User
err := json.Unmarshal(body, &user)
defer r.Body.Close()
if err != nil {
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
return
}
// 주석 처리 or 제거
//users = append(users, user)
// 코드 추가
// sql.DB 객체 생성
db := connetDatabase()
defer db.Close()
// INSERT 문 실행
result, err := db.Exec("INSERT INTO users VALUES (?, ?, ?, ?)", user.Id, user.Name, user.Email, user.Password)
checkErr(err)
// sql.Result.RowsAffected() 체크
n, err := result.RowsAffected()
if n == 1 {
fmt.Println("1 row inserted.")
} else {
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
return
}
json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 201))
}
// user 정보 수정
func putUser(w http.ResponseWriter, r *http.Request) {
setJsonHeader(w)
HttpInfo(r)
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
body, _ := ioutil.ReadAll(r.Body)
var user User
err := json.Unmarshal(body, &user)
checkErr(err)
// 주석 처리 or 제거
/*for index, _ := range users {
if users[index].Id == id {
users[index] = user
json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 200))
return
}
}
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))*/
// 코드 추가
// sql.DB 객체 생성
db := connetDatabase()
defer db.Close()
// UPDATE 문 실행
result, err := db.Exec("UPDATE users SET id=?, name=?, email=?, password=? WHERE id=?", user.Id, user.Name, user.Email, user.Password, id)
checkErr(err)
// sql.Result.RowsAffected() 체크
n, err := result.RowsAffected()
if n == 1 {
fmt.Println("1 row updated.")
} else {
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
return
}
json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 201))
}
// user 정보 삭제
func deleteUser(w http.ResponseWriter, r *http.Request) {
setJsonHeader(w)
HttpInfo(r)
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
// 주석 처리 or 제거
/*for index, _ := range users {
if users[index].Id == id {
users = append(users[:index], users[index+1:]...)
json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 200))
return
}
}
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))*/
// 코드 추가
// sql.DB 객체 생성
db := connetDatabase()
defer db.Close()
// Delete 문 실행
result, err := db.Exec("DELETE FROM users WHERE id = ?", id)
checkErr(err)
// sql.Result.RowsAffected() 체크
n, err := result.RowsAffected()
if n == 1 {
fmt.Println("1 row deleted.")
} else {
json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
return
}
json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 200))
}
cd workspace/go/src/api
go get github.com/go-sql-driver/mysql
main.go 수정
package main
import (
...
// 코드 추가
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
...
}
// Database 정보를 저장할 구조체
type DBInfo struct {
user string
pwd string
url string
engine string
database string
}
// 주석 처리 or 제거
// Database에서 정보를 받아오기에, 더 이상 쓰지 않음
/*
var users = []User{
User{Id: 1, Name: "David", Email: "test@gmail.com", Password: "123"},
User{Id: 2, Name: "Nata", Email: "test@email.com", Password: "qwer"},
}
*/
// 코드 추가
var users = []User{} // 별도로 데이터를 저장
var user = User{} // 별도로 데이터를 저장
// Database 연결 정보
var dbInfo = DBInfo{"아이디", "비밀번호", "localhost:3306", "mysql", "test_crud"}
type Response struct { ... }
func NewResponse(method, message string, status int) Response { ... }
func HttpInfo(r *http.Request) { ... }
// Content-Type을 "application/json"으로 설정하여 JSON 전달
func setJsonHeader(w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json")
}
func main() { ... }
// 코드 추가 : sql.DB 객체 생성
func connetDatabase() *sql.DB {
dataSource := dbInfo.user + ":" + dbInfo.pwd + "@tcp(" + dbInfo.url + ")/" + dbInfo.database
db, err := sql.Open(dbInfo.engine, dataSource)
checkErr(err)
return db
}
// 코드 추가 : 에러 체크
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
// 전체 user 정보 전달
func getUsers(w http.ResponseWriter, r *http.Request) {
setJsonHeader(w)
HttpInfo(r)
// sql.DB 객체 생성
db := connetDatabase()
// 지연하여 닫는다(필수)
defer db.Close()
// User 전체 데이터를 불러오는 SQL 쿼리
rows, err := db.Query("SELECT * FROM users")
checkErr(err)
// 지연하여 닫는다(필수)
defer rows.Close()
users = []User{}
for rows.Next() {
user = User{}
err := rows.Scan(&user.Id, &user.Name, &user.Email, &user.Password)
checkErr(err)
fmt.Println(user)
users = append(users, user)
}
fmt.Println(len(users))
json.NewEncoder(w).Encode(users)
}
...