728x90

참고페이지 : Using Go with MariaDB (링크

 

Using Go with MariaDB | MariaDB

2019 Webinar: Building Modern Applications with MariaDB Hybrid Transactional/Analytical Processing (HTAP) Watch Now _________________________ I have been using Google’s Go programming language for a…

mariadb.com

이전 Database 연동 작업 이후,

생성(Create-POST), 읽기(Read-GET), 수정(Update-PUT), 삭제(Delete-DELETE)

작업을 추가로 진행하겠습니다.

 

더보기

main.go 수정

...

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))
}

 

728x90
Posted by 게으른거북
:
728x90

참고영상 : Consumindo uma (GO) API REST com Angular 7 Parte 3 # 27

 

더보기

src/app/user.service.ts 수정

...
export class UserService {
  ...
 
  constructor(private http: HttpClient) { ... }
 
  public getUsers() { ... }

  // 코드 추가
  public getUser(id: string) {
    // 특정 user의 데이터를 Get
    return this.http.get(`${this.Uri}/${id}`);
  }

  // 코드 추가
  public postUser(user: any) {

    user.id = this.nextUserId;

    // form을 통해 전달 받은 값을 저장
    let data = {
      "id"        :   user.id,
      "name"      :   user.name,
      "email"     :   user.email,
      "password"  :   user.password
    };
	
    // data에 저장된 데이터를 JOSN 형식으로 변경하여,
    // Uri로 Post 진행
    // Return 값은 Response가 반환됨
    return this.http.post(this.Uri, JSON.stringify(data));
  }
}

 

src/app/app.component.ts 수정

...

export class AppComponent {
  ...
 
  constructor(public service: UserService) { ... }

  public onSubmit(form: FormGroup) {
 
    console.log(form.value)

    // 코드 추가
    if( form.value.id == null) {
      // postUser 서비스 함수 이용
      this.service.postUser(form.value)
        .subscribe((resp) => {
          console.log(resp)

          // Response를 통해 전달 받은 Status가 201일 경우,
          // user 데이터를 갱신
          if(resp["Status"] == 201) {
            this.service.getUsers()
              .subscribe((data) => this.users = data);
          }
        })
    }
  }
}

 

src/app/app.component.html 수정

<div class="container">
  <header>
    ...
  </header>

  <hr>

  <div class="row">
    <div class="col-md-12">
      <h3>Insert User Data</h3>
      <form method="post" #form="ngForm" (ngSubmit)="onSubmit(form)">
 
        <input type="hidden" name="id" [(ngModel)]="service.selectedUser.id">
        <div class="form-group">
          <label for="name">Name : </label>
          <!-- 입력 여부를 파악하기 위한 구분자 required 추가 -->
          <input type="text" name="name" id="name" class="form-control" placeholder="insert your name" [(ngModel)]="service.selectedUser.name" required >
        </div> 
        <div class="form-group">
          <label for="email">Email : </label>
          <!-- 입력 여부를 파악하기 위한 구분자 required 추가 -->
          <input type="text" name="email" id="email" class="form-control" placeholder="insert your email" [(ngModel)]="service.selectedUser.email" required>
        </div>
        <div class="form-group">
          <label for="password">Password : </label>
          <!-- 입력 여부를 파악하기 위한 구분자 required 추가 -->
          <input type="text" name="password" id="password" class="form-control" placeholder="insert your password" [(ngModel)]="service.selectedUser.password" required>
        </div>
 
        <div class="form-row">
          <div class="d-grid gap-2 d-md-flex justify-content-md-end">
            <!-- [disabled]="!form.valid : 미입력한 항목(required)이 있을 경우, disable 처리 -->
            <button class="btn btn-sm btn-block btn-primary col-lg-2" [disabled]="!form.valid" >submit</button>
            <button class="btn btn-sm btn-block btn-secondary col-lg-2">clear</button>
          </div>
        </div>
      </form>
    </div>
  </div>

  <br>
  <div class="row">
    ...
  </div>
  
</div>

 

Web 결과화면
728x90
Posted by 게으른거북
:
728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 3 # 20

 

더보기

main.go 수정

이전 내용에 추가 및 수정.

* import 추가
* user 데이터 등록(post) 함수 추가
* 핸들러 로직 추가

package main

import (
	...
    
	"io/ioutil"
    
	...
)

type User struct { ... }

var users = []User{ ... }

func HttpInfo(r *http.Request) { ... }

func setJsonHeader(w http.ResponseWriter) { ... }

func main() {
	fmt.Println("Api Connected Port 3000....")

	r := mux.NewRouter().StrictSlash(true)

	r.HandleFunc("/users", getUsers).Methods("GET")
	r.HandleFunc("/users/{id}", getUser).Methods("GET")

	// user 데이터 추가
	r.HandleFunc("/users", postUser).Methods("POST")

	log.Fatal(http.ListenAndServe(":3000", r))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
	...
}

func getUser(w http.ResponseWriter, r *http.Request) {
	...
}

// 추가 : 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 {
		log.Fatal(err)
	}

	users = append(users, user)

	json.NewEncoder(w).Encode(users)
}

 

body, _ := ioutil.ReadAll(r.Body)

r.Body의 값에서 EOF를 만날 때까지 Read를 해주는 함수.

 

err := json.Unmarshal(body, &user)

json.Unmarshal는 바이트 슬라이스나 문자열을 논리적 자료 구조로 변경하는 함수.

첫 번째 파라미터에는 JSON 데이터(body)를, 두 번째 파라미터에는 출력할 구조체(user)를 포인터로 지정합니다.

리턴 값은 에러 객체이지만, 에러가 없을 경우, 두 번째 파라미터에 원래 데이터가 저장됩니다.

 

defer r.Body.Close()

r.Body를 사용한 이후에는 Close를 호출하여 닫아줘야 합니다.

 

확장 프로그램 다운 - Postman (링크)

REST 테스트를 위한 프로그램을 설치.

이를 통해 Golang server를 테스트할 수 있습니다.

 

크롬 웹 스토어 - Postman

 

Postman - Get 결과 화면

 

Postman - Post 과정 및 결과 화면
728x90
Posted by 게으른거북
: