Golang 및 Cassandra DB를 사용한 Rest API
이 게시물에서는 Golang 및 Cassandra DB 형식의 REST API를 생성합니다.
먼저 이 블로그의 개요를 설명하겠습니다.
참고: 이 블로그는 우분투 시스템에 따라 작성되므로 OS에 따라 약간의 변경이 있을 수 있습니다.
1. 카산드라 키스페이스 생성
CREATE KEYSPACE users
WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};
복제 계수가 1이라는 것은 Cassandra 클러스터에 각 행의 복사본이 하나만 있음을 의미합니다. 복제 팩터가 2라는 것은 각 행에 대해 두 개의 복사본이 있으며 각 복사본이 다른 노드에 있음을 의미합니다.
이 용어의 세부 사항은 이 블로그의 초점이 아니므로 나중에 블로그에서 설명하겠습니다.
2. 키스페이스 내부에 테이블 생성
use users;
CREATE TABLE stu(
username text PRIMARY KEY,
email text
);
골랑을 위한 시간!!!
먼저 main.go 파일을 만들고 그 안에 데이터베이스 구조와 매핑할 구조체를 만듭니다.
type Student struct {
Username string `json:"username"`
Email string `json:"email"`
}
cassandra와 연결하기 위해 우리는 gocql 패키지를 사용할 것이고 그것의 링크는 아래에 주어집니다.
이제 주요 기능을 만들고 서버를 시작합니다.
func main() {
http.HandleFunc("/", handleRequest)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
fmt.Println("Server has Started")
}
cassandra 클라이언트의 경우 데이터베이스와 상호 작용하는 데 필요한 모든 기능이 있는 gocql.Session에 대한 포인터가 있는 Client라는 새 구조체를 만듭니다.
type Client struct {
cassandra *gocql.Session
}
var cassandraClient *Client
IniitalizeDB() 함수
이 함수는 cassandra와 Go 사이의 연결을 만들고 *Client 유형 변수를 반환합니다.
func InitializeDB() *Client {
cluster := gocql.NewCluster("127.0.0.1")
cluster.Consistency = gocql.Quorum
cluster.Keyspace = "users"
session, _ := cluster.CreateSession()
fmt.Println("********************** Cassandra Initialized")
return &Client{cassandra: session}
}
이제 main 함수에서 InitializeDb()를 호출하고 cassandraClient를 변수에 전달합니다.
cassandraClient = InitializeDB();
이제 POST, GET, PUT, DELETE에 따라 요청을 함수에 매핑합니다.
func handleRequest(w http.ResponseWriter, r *http.Request) {
switch true {
case r.Method == "POST":
createStudent(w, r)
case r.Method == "GET":
getStudent(w, r)
case r.Method == "PUT":
updateStudent(w, r)
case r.Method == "DELETE":
deleteStudent(w, r)
}
}
Atlast 모든 설정이 완료되었습니다. 이제 CRUD 작업을 생성합니다.
1. CreateStudent 기능
먼저 사후 요청을 받아 데이터베이스 쿼리를 수행하는 CreateStudent 함수를 라우팅하는 createStudent 함수가 있습니다.
cassandra에 삽입하기 위해 쿼리를 사용합니다.
사용자(사용자 이름, 이메일) 값(?,?)에 삽입한 다음 값을 추가합니다.
기능은 아래와 같습니다.
func createStudent(w http.ResponseWriter, r *http.Request) {
var NewUser Student
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "wrong data")
}
json.Unmarshal(reqBody, &NewUser)
//Call the DB
err = cassandraClient.CreateStudent(NewUser)
if err != nil {
panic(err)
}
fmt.Println(NewUser)
}
func (s *Client) CreateStudent(stu Student) error {
err := s.cassandra.Query("INSERT INTO users (username, email) VALUES(?,?)", stu.Username, stu.Email).Exec()
if err != nil {
return err
}
return nil
}
다른 방법에 대해서도 마찬가지로
2. 학생 업데이트
업데이트 사용자 SET 이메일=? WHERE 사용자 이름=?
func updateStudent(w http.ResponseWriter, r *http.Request) {
var UpdateStu Student
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "Kindly enter data properly")
}
json.Unmarshal(reqBody, &UpdateStu)
//DB Call
err = cassandraClient.UpdateStudent(UpdateStu)
if err != nil {
panic(err)
}
fmt.Println(UpdateStu)
}
func (s *Client) UpdateStudent(stu Student) error {
err := s.cassandra.Query("UPDATE users SET email=? WHERE username=?", stu.Email, stu.Username).Exec()
if err != nil {
return err
}
return nil
}
3. 학생 확보
SELECT * FROM users WHERE username=?
func getStudent(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("username")
//DB call
stu, err := cassandraClient.GetStudent(name)
if err != nil {
panic(err)
}
fmt.Println(stu)
}
func (s *Client) GetStudent(username string) (Student, error) {
stu := Student{}
ctx := context.Background()
err := s.cassandra.Query("SELECT * FROM users WHERE username=?", username).WithContext(ctx).Consistency(gocql.One).Scan(&stu.Username, &stu.Email)
if err != nil {
return stu, err
}
return stu, nil
}
4. 학생 삭제
func deleteStudent(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("username")
//Db Call
err := cassandraClient.DeleteStudent(name)
if err != nil {
panic(err)
}
fmt.Println("Successfully Deleted")
}
func (s *Client) DeleteStudent(name string) error {
err := s.cassandra.Query("DELETE FROM users WHERE username=?", name).Exec()
if err != nil {
return err
}
return nil
}
이제 전체 코드에 액세스하려면 여기 링크가 있습니다.
https://github.com/mrshukla1805/golang-cassandra
저장소에 별표를 제공해주세요!!
즐기면서 계속 배우세요 ;)
Reference
이 문제에 관하여(Golang 및 Cassandra DB를 사용한 Rest API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/docudev/rest-api-with-golang-and-cassandra-db-10o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)