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 5 # 29

 

더보기

src/app/app.module.ts 수정

버튼에 대한 아이콘 추가를 위해 아이콘 Module Import를 진행합니다.

...

// 코드 추가 : icon
import { faUserMinus } from '@fortawesome/free-solid-svg-icons';
import { faUserPlus } from '@fortawesome/free-solid-svg-icons';
import { faUndo } from '@fortawesome/free-solid-svg-icons';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    ...
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
  
  constructor(library: FaIconLibrary) {
    // 코드 수정
    library.addIcons(faEdit, faUserMinus, faUserPlus, faUndo);
  }
}

 

src/app/user.service.ts 수정

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

  public getUser(id: string) {
    ...
  }

  public postUser(user: any) {
    ...
  }

  public putUser(user: any) {
    ...
  }

  // 코드 추가
  public deleteUser(id: string) {
    return this.http.delete(`${this.Uri}/${id}`);
  }
}

 

src/app/app.component.ts 수정

...

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

  public onSubmit(form: FormGroup) {
    ...
  }

  public onEdit(id: string) {
    ...
  }
  
  public updateList(user: any) {
    ...
  }

  // 코드 추가 : user 정보 삭제
  public onDelete(id: string) { 

    this.service.deleteUser(id)
      .subscribe((resp) => {
        console.log(resp);

        if(resp["Status"] == 200) {

          this.users = this.users.filter((user) => user.id != id);
        }
      });
  }

  public clearForm() {
    ...
}

 

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)">
        ...
 
        <div class="form-row">
          <div class="d-grid gap-2 d-md-flex justify-content-md-end">
            <!-- 코드 수정 : icon 추가 -->
            <button class="btn btn-sm btn-block btn-primary col-lg-2" [disabled]="!form.valid" >
              submit &nbsp; <fa-icon icon="user-plus"></fa-icon>
            </button>

            <!-- 코드 수정 : icon 추가 -->
            <button class="btn btn-sm btn-block btn-secondary col-lg-2" (click)="clearForm()">
              clear &nbsp; <fa-icon icon="undo"></fa-icon>
            </button>
          </div>
        </div>
      </form>
    </div>
  </div>

  <br>
  <div class="row">
    <div clas="col-md-12" *ngIf="users">

      <h3>User Data List</h3>
      
      <table class="table table-bordered table-hover text-center">
        <thead>
          <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Email</th>
            <th>Password</th>
            <th>Edit</th>
            <!-- 코드 수정 -->
            <th>Delete</th>
          </tr>
        </thead>
        <tbody>
          <tr *ngFor="let user of users">
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
            <td>{{ user.email }}</td>
            <td>{{ user.password }}</td>
            <td>
              <button type="button" class="btn btn-sm btn-info col-block col-lg-8" (click)="onEdit(user.id)">
                <fa-icon icon="edit"></fa-icon>
              </button>
            </td>
            <!-- 코드 수정 : delete 추가 -->
            <td>
              <button type="button" class="btn btn-sm btn-danger col-block col-lg-8" (click)="onDelete(user.id)">
                <fa-icon icon="user-minus"></fa-icon>
              </button>
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>

  <br>
  <footer>
    <p class="alert text-center"></p>
  </footer>
</div>

 

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

참고영상 : Como Programar uma API REST Simples em Golang Parte 5 # 22

 

더보기

main.go 수정

이전 내용에 추가 및 수정

* user 데이터 삭제(delete) 함수 추가
* 핸들러 로직 추가

package main

import (    
	...
)

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")
	r.HandleFunc("/users", postUser).Methods("POST")
	r.HandleFunc("/users/{id}", putUser).Methods(("PUT"))
    
	// user 정보 삭제
	r.HandleFunc("/users/{id}", deleteUser).Methods(("DELETE"))

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

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

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

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

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

// 추가 : user 정보 삭제
func deleteUser(w http.ResponseWriter, r *http.Request) {

	setJsonHeader(w)

	HttpInfo(r)

	params := mux.Vars(r)

	id, _ := strconv.Atoi(params["id"])

	// id값이 일치하는 user 데이터 삭제
	for index, _ := range users {
		if users[index].Id == id {
			users = append(users[:index], users[index+1:]...)
			json.NewEncoder(w).Encode(users)
			fmt.Println(users)
			return
		}
	}

	json.NewEncoder(w).Encode(&User{})
}

 

users = append(users[:index], users[index+1:]...)

삭제하고자 하는 user 데이터의 index값을 if문으로 체크,

user[index]의 이전 데이터 배열과 user[index]의 이후의 user 데이터 배열을 결합(append).

 

 

Postman 을 통한 User 정보 삭제(DELETE 테스트) 결과 화면
728x90
Posted by 게으른거북
: