ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RaspberryPi로 Golang 서버만들기 - 회원관리 하기 (2) [6]
    Go 2021. 1. 6. 23:06
    728x90
    반응형

    1. API 구조

    .
    ├── db
    │   └── manager.go
    ├── go.mod
    ├── go.sum
    ├── main.go
    ├── user
    │   └── user.go
    └── vendor
        ├── github.com
        ├── golang.org
        └── modules.txt

    Package는 다음과 같이 구성했습니다.

     

    데이터베이스를 쿼리하고 설정하는 코드는 db폴더에 manager.go에 구현하였고,

     

    user관련 비즈니스로직은 user폴더안의 user.go에 구현하였습니다.

     

    따라서 요청이 왔을때 main -> user -> db 순서대로 요청이 가게 됩니다.

     

     

    2. DB Manager

    package db
    
    import (
    	"database/sql"
    
    	_ "github.com/go-sql-driver/mysql"
    )
    
    //DB접속정보를 가지고 있는 객체를 정의합니다.
    type DBMS struct {
    	user     string
    	password string
    	host     string
    	port     string
    	db       string
    }
    
    //DB접속정보를 가지고 DB객체를 생성합니다.
    func NewDBMS(user string, password string, host string, port string, db string) DBMS {
    	return DBMS{user, password, host, port, db}
    }
    
    //쿼리하고 결과를 반환합니다.
    func (dbms DBMS) MySQLExecQuery(query string) ([]map[string]interface{}, error) {
    	//DB의 접속정보를 저장하고 db를 인스턴스화 한다.
    	db, err := sql.Open("mysql", dbms.user+":"+dbms.password+"@tcp("+dbms.host+":"+dbms.port+")/"+dbms.db)
    	//함수 종료시 db를 Close한다.
    	defer db.Close()
    
    	//err발생했는지 확인한다.
    	if err != nil {
    		return nil, err
    	}
    
    	//db를 통해 sql문을 실행 시킨다.
    	rows, err := db.Query(query)
    	// 함수가 종료되면 rows도 Close한다.
    	defer rows.Close()
    
    	//컬럼을 받아온다.
    	cols, err := rows.Columns()
    
    	//err발생했는지 확인한다.
    	if err != nil {
    		return nil, err
    	}
    
    	data := make([]interface{}, len(cols))
    
    	for i, _ := range data {
    		var d []byte
    		data[i] = &d
    	}
    
    	results := make([]map[string]interface{}, 0)
    
    	for rows.Next() {
    		err := rows.Scan(data...)
    		if err != nil {
    			return nil, err
    		}
    		result := make(map[string]interface{})
    		for i, item := range data {
    			result[cols[i]] = string(*(item.(*[]byte)))
    		}
    		results = append(results, result)
    	}
    
    	return results, nil
    }
    
    //SQL을 실행합니다.
    func (dbms DBMS) MySQLExec(query string) (int64, int64, error) {
    	//DB의 접속정보를 저장하고 db를 인스턴스화 한다.
    	db, err := sql.Open("mysql", dbms.user+":"+dbms.password+"@tcp("+dbms.host+":"+dbms.port+")/"+dbms.db)
    	defer db.Close()
    
    	//err발생했는지 확인한다.
    	if err != nil {
    		return -1, -1, err
    	}
    
    	//SQL을 실행합니다.
    	result, err := db.Exec(query)
    	if err != nil {
    		return -1, -1, err
    	}
    
    	// 변경된 row의 갯수를 가져옵니다.
    	rowsAffected, err := result.RowsAffected()
    	if err != nil {
    		return -1, -1, err
    	}
    
    	// 변경된 id를 가져옵니다.
    	lastInsertId, err := result.LastInsertId()
    	if err != nil {
    		return -1, -1, err
    	}
    
    	return rowsAffected, lastInsertId, nil
    }
    

     

    MySQLExecQuery함수는 쿼리하고 데이터를 Map리스트 형태로 반환됩니다. map하나는 row하나를 의미하고 조회 결과가 여러개 일때는 여러게가 리턴됩니다.

     

    MySQLExec함수는 SQL을 실행하고 변경된 row의 갯수, 변경된 id를 반환합니다.

     

     

    3. API 개발

    DB Manager를 사용해서 User를 관리하는데 필요한 함수들을 만들어야 됩니다.

     

    먼저 DB Manager 만든걸 import 해줍니다.

    import (
    	"myserver.com/db"
    )

     

    User 객체를 생성해 줍니다.

    type User struct {
    	Id       string `json:"id"`
    	Password string `json:"password"`
    	Email    string `json:"email"`
    	Phone    string `json:"phone"`
    }

     

    만약 데이터베이스와 테이블이 없을시 생성해야 합니다.

    //DATABASE 생성
    func CreateDatabase() error {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "")
    	//SQL을 실행한다.
    	_, _, err := dbms.MySQLExec("CREATE DATABASE IF NOT EXISTS RASPBERRY_SERVER")
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }
    
    //Table 생성
    func CreateTable() error {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    	//SQL을 실행한다.
    	_, _, err := dbms.MySQLExec(
    		`CREATE TABLE IF NOT EXISTS user (
    			id varchar(12) NOT NULL,
    			password varchar(15) NOT NULL,
    			email varchar(30) DEFAULT NULL,
    			phone varchar(15) DEFAULT NULL,
    			PRIMARY KEY (id)
    		  )`)
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }

     

    User하나를 생성하는 함수입니다.

    func CreateUser(user *User) error {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    	//SQL을 실행한다.
    	_, _, err := dbms.MySQLExec(
    		`INSERT INTO user (
    			id,
    			password,
    			email,
    			phone
    		) VALUES (
    			"` + user.Id + `",
    			"` + user.Password + `",
    			"` + user.Email + `",
    			"` + user.Phone + `"
    		)`)
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }
    

     

    User를 수정하는 함수입니다.

    //User 수정
    func UpdateUser(id string, user *User) error {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    	//SQL을 실행한다.
    	_, _, err := dbms.MySQLExec(
    		`UPDATE 
    			RASPBERRY_SERVER.user
    		SET
    			id = '` + user.Id + `',
    			password = '` + user.Password + `',
    			email = '` + user.Email + `',
    			phone = '` + user.Phone + `'
    		WHERE
    			id='` + id + `'`)
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }

     

    User를 삭제하는 함수입니다.

    //User 삭제
    func DeleteUser(id string) error {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    
    	_, _, err := dbms.MySQLExec(
    		`DELETE FROM
    			RASPBERRY_SERVER.user
    		WHERE
    			id='` + id + `'`)
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }

     

    User를 모두 조회하는 함수입니다.

    func SelectUserList() ([]map[string]interface{}, error) {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    
    	users, err := dbms.MySQLExecQuery("SELECT * FROM user")
    
    	if err != nil {
    		return nil, err
    	}
    
    	return users, nil
    }
    

     

    User를 ID로 조회하는 함수입니다.

    func SelectUser(id string) ([]map[string]interface{}, error) {
    	//DB를 연결정보를 통해 Query할 수 있는 객체를 생성한다.
    	dbms := db.NewDBMS("root", "raspberry", "192.168.0.100", "3306", "RASPBERRY_SERVER")
    
    	users, err := dbms.MySQLExecQuery("SELECT * FROM user WHERE" + id)
    
    	if err != nil {
    		return nil, err
    	}
    
    	return users, nil
    }
    

     

    728x90
    반응형

    댓글

Designed by Tistory.