hchaehyun / ict_ex

0 stars 0 forks source link

ICT 1주 #1

Open hchaehyun opened 5 months ago

hchaehyun commented 5 months ago

240304

Github flow

https://velog.io/@gmlstjq123/Git-Flow-VS-Github-Flow

단일 브랜치 사용해 개발 → 하나의 버전이 만들어지면 즉시 배포 가능

방법 branch 생성 → commit 작성 → PR 생성 → 리뷰 및 피드백 → merge → 배포

장점

단점


Cloud Run

https://cloud.google.com/run?hl=ko#run-applications-fast-and-securely-in-a-fully-managed-environment https://cloud.google.com/run/docs/quickstarts?hl=ko#deploy-a-prebuilt-container https://cloud.google.com/code/docs/intellij/quickstart?hl=ko

Cloud Run은 요청 또는 이벤트를 통해 호출 가능한 컨테이너를 실행할 수 있게 해 주는 관리형 컴퓨팅 플랫폼 Intellij에서 Cloud Run을 사용해 각각 Local에서 java, Go로 test실행 진행

Untitled

Go, Gin

https://go.dev/learn/ https://github.com/gin-gonic/gin http://golang.site/go/article/1-Go-프로그래밍-언어-소개 https://mdpapa.tistory.com/46

Go는 전통적인 컴파일, 링크 모델을 따르는 범용 프로그래밍 언어로, C++, Java, Python의 장점들을 뽑아 만들어진 언어. C++와 같이 Go는 컴파일러를 통해 컴파일되며, 정적 타입 언어이고, Java처럼 Garbage Collection 기능을 제공. Go는 단순하고 간결한 프로그래밍 언어를 지향했는데, 25개의 키워드만으로 프로그래밍이 가능. Go의 큰 특징으로 Communicating Sequential Processes (CSP) 스타일의 Concurrent 프로그래밍을 지원.

기본적인 Go 설치 및 Hello World print 예제 실행 진행

309684412-f6766092-ba42-4ee0-ad71-3394fbc11903

기본적인 Gin 설치 및 import 후 실행 진행

hchaehyun commented 5 months ago

240305

Local에 Docker로 Mysql DB 세팅 후 접속

https://smallsnail.tistory.com/59 https://hipopatamus.tistory.com/109

Local 환경에서 Docker로 Mysql 컨테이너 생성해 DB 세팅 후 접속 및 Mysql workbench에서 확인 image image image image

image

도커 컨테이너의 생애주기와 데이터 저장

https://yenjjun187.tistory.com/815 https://okky.kr/questions/1130534 https://velog.io/@soongle/Docker-docker의-filesystem https://sonseungha.tistory.com/615

도커 컨테이너 종료,삭제시 데이터 손실되는 경우 있음. 저장소 어디에 세팅되어있는지 확인해야한다. → 컨테이너 종료시에는 데이터가 지속되기 어려운 경우 있음, Volume, bind mount, tmpfs mount로 해결할 수 있다(보통의 경우에는 volume 사용)

volume(-v): 컨테이너와 독립적으로 존재하는 데이터 저장소, 컨테이너가 삭제되어도 볼륨에 저장된 데이터는 유지된다. 즉, 도커 종료시에도 데이터 손실 방지 가능

현재 컨테이너 목록 출력 후 해당 컨테이너 id 확인 후 상세정보 표시 진행 docker ps -a docker inspect dca62cf2f617 Mounts 항목 확인 image image

컨테이너 내부의 /var/lib/mysql 디렉토리를 Docker 볼륨(/var/lib/docker/volumes/8cff93a8194c1916c7635fbb9a13566a0631032eb0645f2cd011e037679385a8/_data)에 연결해 데이터를 저장하고 있음을 의미. 즉, 컨테이너가 종료되더라도 볼륨에 저장된 데이터는 유지되므로 데이터 손실을 막을 수 있음


기존 만들어둔 Docker - MySQL과 Cloud Run을 연동해 간단한 SELECT문으로 DB테스트

기존 Cloud Run 환경에서 연동 시도했으나 실패, 간단한 환경에서 재시도. 현재 connection refused 상황까지 진행함. image

hchaehyun commented 5 months ago

240306

기존 만들어둔 Docker - MySQL과 Cloud Run을 연동해 간단한 SELECT문으로 DB테스트(이어서)

Error 1045 (28000): Access denied for user~ 까지 진행, 계정정보에 문제있음을 인지 image

계정정보 hchaehyun -> root로 변경 후 재실행 Error 1049 (42000): Unknown database 'docker_root' 오류 발생 image docker_root라는 데이터베이스가 없다는 오류가 발생, "root:password@tcp(127.0.0.1:3306)/docker_root" 부분에서 데이터베이스 이름 작성하는 부분(docker_root)을 Connection Name을 작성해야 하는 것으로 오인해 발생한 문제. docker_root 위치에 테스트할 database 이름인 test로 변경 후 재시도. -> "root:password@tcp(127.0.0.1:3306)/test" image image ping pong 테스트 성공, console에 SELECT 함수 결과인 John 출력 성공


Unit Test

Unit Test(=단위테스트) 코드의 가장 작은 기능적 단위를 테스트하는 프로세스. 작성한 모든 메소드에 대해서 테스트케이스를 작성하는 것 의미. 좋은 unit test를 위해서는

unit test를 위한 프레임워크, 라이브러리, 패키지도 존재


Go에서의 Unit Test

https://github.com/yakuter/go-test-examples https://www.essential2189.dev/fast-go-test-code https://etloveguitar.tistory.com/64 https://velog.io/@jeonghyeon/Testify를-사용한-golang-unittest http://golang.site/go/article/115-Go-유닛-테스트 https://jokerkwu.tistory.com/193 https://devocean.sk.com/experts/techBoardDetail.do?ID=163605 https://pkg.go.dev/testing

테스트시 주의점

Go에 기본으로 적용되어있는 testing을 사용해 유닛테스트를 진행 image image

testing 사용 시 if문이 많이 사용되었다 -> 위 부분을 개선하기 위해 "github.com/stretchr/testify" 패키지에 assert를 사용해 개선 image image

이외 다른 유닛테스트 케이스도 실습 진행 image image

직접 테스트 케이스를 만들어서 실습 진행 image testCase struct의 구조 이해도 문제로 예상 결과값을 잘못 작성해 테스트에 실패한 모습 image 이후 수정을 진행, 정상적으로 테스트에 성공 image


MySQL 연결 후 Go에서의 Unit Test

기존 DB 연결 후 unit test 실행해보기 https://pkg.go.dev/testing https://www.myhatchpad.com/insight/mocking-techniques-for-go/

*테스트한 main.go 파일은 오전에 서버 연결 진행한 파일과 동일 이번 SQL DB 연결 테스트 코드는 “ping 함수”를 테스트하기 위해 작성 image image image 테스트 성공, 정상적으로 PASS를 받아오는 모습을 확인할 수 있다

이전에 unit test를 공부하기 위해 작성했던 test 코드에서는 이전 Main 코드에 있는 코드내용을 그대로 가져오지 않았는데, 이번 DB 테스트엔 main에 작성한 코드 대부분을 test 코드에 그대로 사용할 수 밖에 없었다 → 테스트 대상 함수의 특성 때문

ping 함수는 DB연결, SQL 쿼리 실행, 결과 처리 작업을 수행하기 때문에, 해당 함수를 테스트하기 위해서는 직접 DB에 연결하거나 test double을 사용해 DB연결을 모방해야함. 이번 테스트 코드의 경우에는 해당 함수를 직접 DB에 연동한 것.

더 올바른 unit test 코드를 작성하려면 테스트 함수를 분할해야 한다. → DB연결 테스트 함수, SQL 쿼리 실행 테스트 함수, 결과 처리 테스트 함수로 분할 시도 image image image image image 테스트 성공, 정상적으로 PASS를 받아오는 모습을 확인할 수 있다


인텔리제이 상에서 mysql 연결 후 쿼리문 실행

https://hihellosuah.tistory.com/91 https://zyngirok.com/entry/IntelliJ-SQL-Error-3D000-1046-conn-183475-No-database-selected

인텔리제이의 database에 직접 DB를 연결해서 쿼리문을 날릴 수 있다

내가 만들었던 MySQL DB를 연결해준다 image

설정을 정상적으로 완료했음에도 테이블을 찾지 못하는 오류가 아래와 같이 발생했다. image

해결책으로 조회하고 싶은 테이블을 직접 갖고 있는 데이터베이스를 선택 후 새로운 쿼리 콘솔을 실행해 해당 콘솔에서 실습을 진행했다. 인텔리제이에서 쿼리 콘솔은 특정 데이터베이스에서 띄울 수 있는데, 이때 쿼리 콘솔을 띄운 데이터베이스에 조회하려는 테이블이 존재하지 않으면 위와 같은 오류가 발생, 모든 데이터베이스를 포함하는 최상위 위치에서 쿼리콘솔을 열어도 마찬가지로 오류가 발생한다.

image 쿼리콘솔을 새로 열고 cmd+enter로 쿼리문을 실행하자 정상적으로 테이블에서 SELECT문을 실행해 결과를 출력한 모습을 확인할 수 있다

hchaehyun commented 5 months ago

240307

Golang으로 연결된 DB에 CREATE, INSERT, SELECT, UPDATE, DELETE, DROP문을 이용한 쿼리문 작성 및 실행

https://fervorwooks.tistory.com/entry/Golang-Mysql-Insert-Update-Delete-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 https://brownbears.tistory.com/186 https://brownbears.tistory.com/180 https://build.tistory.com/5 https://strange-developer.tistory.com/55

Golang으로 연결된 DB에 CREATE, INSERT, SELECT, UPDATE, DELETE, DROP문을 이용한 쿼리문 작성 후 Unit Test 진행

Golang에서 쿼리문을 컨트롤하는 대표적인 함수

이외에도 QueryRow(), Prepare(), Tx.Exec(), MustExec(), QueryContext(), NamedExec()등 약간의 다른 기능을 포함한 쿼리문 컨트롤 함수가 있다.

실제 코드 작성에 앞서, 시나리오 작성을 진행

목표: Golang으로 연결된 DB에 CREATE, INSERT, SELECT, UPDATE, DELETE, DROP문을 이용한 쿼리문 작성 기존(exGoUnitTestDB.go)쿼리 실행은 Query() 함수를 이용해서 실행. (SELECT문만 사용했기 때문) 이번에는 Exec() 함수를 같이 이용해 쿼리문 실행 시도. (CREATE, INSERT, UPDATE, DELETE, DROP문을 사용하기 때문)

  1. Exec(), Query() 함수를 이용해 CREATE, INSERT, SELECT, UPDATE, DELETE, DROP 쿼리문 사용
  2. 위 쿼리문 모두 사용하기 위해서는 일정 순서 필요

    1. DB 연결
    2. new table CREATE / Exec() -> Lush table 생성하기
    3. new data INSERT to new table / Exec() -> item이 intergalatic인 data 삽입
    4. SELECT for check n print new data / Query()
    5. UPDATE new data / Exec() -> intergalatic을 goddess로 변경
    6. SELECT for check UPDATE data / Query()
    7. DELETE new data / Exec() -> goddess data 삭제
    8. SELECT for check DELETE new data / Query()
    9. DROP new table / Exec() -> Lush table 삭제

image image

쿼리문 작성 후 해당 쿼리문을 연결된 DB를 통해 실행한 결과 정상적으로 테이블이 생성되고, 데이터가 입력 및 삭제, 테이블 삭제까지 되는 모습을 확인할 수 있었다. 하지만 현재 작성한 코드는 일반 db를 연결 후 실행하는 목적을 가진 코드였으나, 이해도의 문제로 테스트 코드에 가깝게 만들어진 상황(피드백)-> 추후 refactor 필요.(main.go와 main_test.go를 좀 더 명확하게 목적성을 띈 코드로 분리 및 리펙토링 필요하다고 생각)

해당 코드 내용까지 Github Commit, Push 완료


Stress Test 알아보기

https://velog.io/@imkkuk/서버의-성능-테스트-필요성-개요-간단한-구현 https://loosie.tistory.com/821 https://inpa.tistory.com/entry/JEST-📚-부하-테스트-Stress-Test https://choibulldog.tistory.com/61

성능테스트(Performance Test)

시스템 구성 요소가 특정 상황에서 어떤 성능을 보이는지 확인하기 위해 수행되는 테스트

성능테스트 방법으로는 부하(Load)테스트, 내구성(Endurance)테스트, 성능(Volume)테스트, 확장성(Scalability)테스트, 스파이크(Spike)테스트, 스트레스(Stress)테스트가 있다

데이터베이스, 네트워크, 소프트웨어, 하드웨어 등과 관련될 수 있는 대부분의 성능 문제를 예측해내는게 성공적인 성능 테스트라고 할 수 있다

스트레스 테스트(Stress Test)

일반적인 부하 테스트보다 훨씬 높은 부하 상황에서 시스템 성능을 검증하는 테스트. 기존 자원에 과잉 작업을 과부하시키는 다양한 활동을 수행해 시스템을 무너뜨리는 시도를 하게 된다.

스트레스 테스트의 일부로는,

테스트의 목적은 시스템 장애가 발생하는지 오류를 확인하고, 어떻게 정상적으로 우아하게(gracyfully)복구되는지, 또 사용 가능한 상태로 유지되는지 체크한다.

hchaehyun commented 5 months ago

240308

MySQL 계정정보 관련 알아보기

root 계정을 사용하는건 일반적이지 않고 좋지도 않음, 다른 사용자정보를 추가하고 사용하는 방향 알아보고 수정

https://nickjoit.tistory.com/144 https://computer-science-student.tistory.com/514 https://wildeveloperetrain.tistory.com/198

mysql -u root -p로 mysql 접속 image

use mysql로 데이터베이스 선택

select host, user, password from user;로 현재 생성되어있는 계정정보 확인

create user ‘hchaehyun’@’%’ idetified by ‘password’;

user hchaehyun 계정을 %옵션을 통해 모든 ip에서 접속 가능하게 생성하고 비밀번호는 password로 설정

다시 select host, user, password from user;로 새로 생성한 계정이 잘 만들어졌는지 확인 image

grant all privileges on . to ‘hchaehyun’@’%’; grant 명령어를 이용해 hchaehyun 계정에 모든DB에 모든 권한을 부여 (grant all privileges on . to '사용자'@'localhost' identified by '비밀번호'; 이런식으로 작성하면 사용자 생성과 권한 부여를 한번에 할 수 있다) image

계정정보를 변경 후 테스트해본 결과, 정상적으로 db에 연결해서 테이블 생성 및 데이터 삽입 삭제, 테이블 삭제까지 완료된 모습이다. image

해당 계정정보 수정까지 Github Commit, Push 완료


어제 작성한 DB 연결 및 테스트 진행한 exGoUnitTestDB2 수정하기

어제 피드백 내용 토대로 코드 수정 진행

https://github.com/GoogleCloudPlatform/golang-samples https://github.com/go-sql-driver/mysql

main.go에서 db 연결에 대한 테스트 진행은 main_test.go를 만들어서 유닛테스트를 한다는 의미가 사라짐, 목적성이 불분명한 코드 main_test.go에서 이미 db에 대한 테스트를 모두 진행한 후에, 테스트를 통과하면 main.go에서는 db만 연결해서 바로 사용하는것이 유닛테스트의 목적이자 올바른 방법

어제 작성한 코드 수정 진행, 기존 쿼리문 테스트 모두 main_test.go로 이동 및 수정 ->main.go에는 db 연결 및 http 연결부만 남아있게 수정

image test에 모두 통과한 모습을 확인할 수 있다

해당 test_main.go 수정까지 Github Commit, Push 완료