본문 바로가기

Language89

Go - Sync - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/sync - 개요 병렬 프로세스에 안전한(thread-safe) counter를 만들어본다. single-thread에서 동작하는 counter를 만들고 난 후, 여러 개의 goroutine으로 unsafe함을 확인하고 Sync를 이용해서 이를 고쳐보자. race condition을 해결하기 위한 Mutex도 사용해본다. - Counter Counter를 증가시키는 메소드와 Counter의 값을 반환하는 메소드를 만들었다고 가정한 후 test 코드를 작성해보자. func TestCounter(t *testing.T) { t.Run("incrementing the counter 3 time.. 2022. 1. 20.
Go - reflection - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/reflection - 개요 reflect package에 대해 알아본다. struct x을 받고 fn을 호출해서 재귀적으로 내부의 string field들을 모두 순회하는 함수 walk(x interface{}, fn func(string))를 작성해보자. 이번 챕터에서는 이 요구사항을 구현하기위해 reflection을 사용해볼것이다. - interface 여태까지는 string, int 형 처럼 Go에서 제공하거나, BankAccount와 같이 형을 정의한 type-safety만 다루었다. 그래서 참조할 문서를 쉽게 찾을 수 있었고, 만약 잘못된 형을 함수에 넘기면 컴파일러가 이를 미.. 2022. 1. 15.
Go - select - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/select - 개요 http 요청 test를 작성하는법을 알아본다. goroutine 사용시 동기화를 위해 select를 이용해본다. - WebsiteRace example 두 URL을 받아서 HTTP GET 요청을 날렸을 때 먼저 응답한 URL을 반환하는 WebsiteRace 함수를 작성해보자. 만약 두 URL 모두 10초내로 답변이 없으면 error를 반환한다. 우선 요구사항에 맞게 간단하게 test 코드를 작성해보자. func TestRacer(t *testing.T) { slowURL := "http://www.facebook.com" fastURL := "http://www.q.. 2022. 1. 12.
Go - Concurrency - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/concurrency - 개요 Go의 병렬 프로그래밍인 concurrency(go 문법)에 대해 알아보자. goroutine과 channel을 사용해본다. - CheckWebsites 예제 아래와 같이 URL 들의 응답 상태를 확인하는 CheckWebsites 함수가 있다고 하자. package concurrency type WebsiteChecker func(string) bool func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool { results := make(map[string]bool) for _, url :.. 2022. 1. 4.
Go - mocking - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/mocking - 개요 mocking에 대해 알아보고 mocking를 사용할 때 장점에 대해 알아본다. - Countdown 프로그램 3부터 하나씩 줄어드는 숫자를 출력하는 프로그램을 만들어보자. 단 각 숫자를 출력하기전에 1초를 멈추고 나서 출력한다. 0에 도달할 때는 0대신 Go!를 출력한다. package main func main() { Countdown() } 사실 프로그램이 맞나 싶을 정도로 보잘 것 없는 요구사항이지만 언제나 작은 단계의 성공적인 소프트웨어를 구축한 후, 이를 점차 반복적인 테스트 접근법을 통해 구축해야 한다. 이렇게 하려면 요구사항을 가능한 잘게 쪼갠 후 동.. 2022. 1. 2.
Go - dependency injection - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/dependency-injection - 개요 Go의 표준 라이브러리의 인터페이스인 Writer를 이용하여 Dependency injection(이하 'DI')에 대해 알아본다. DI를 이용하면 test에 얼마나 많은 도움이 되는지 이해한다. - Dependency injection 한국의 국룰 프레임워크인 Spring을 써본적이 있다면 DI 라는말을 들어본적이 있을것이다. 용어도 멋있기 때문에 오해가 있는데 DI에 관한 약간의 오해를 줄이고자 한다. 우선 DI를 하기 위해 반드시 프레임워크가 필요한것은 아니다. 또한 코드나 디자인을 복잡하게 하지 않는다. test를 용이하게 하고, 함수.. 2021. 12. 31.
Go - maps - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/maps - 개요 array와 slice에서는 데이터를 순차적으로 저장한다. go에서는 key를 기반으로 데이터를 저장할 수 있는 map을 제공한다. dictionary를 만들어 보면서 map에 대해 알아보도록 하자. - map package main import "testing" func TestSearch(t *testing.T) { dictionary := map[string]string{"test": "this is just a test"} got := Search(dictionary, "test") want := "this is just a test" if got != want .. 2021. 12. 31.
Go - pointers & errors - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/pointers-and-errors - 개요 struct의 상태를 갱신하거나 크기가 큰 객체에 대해 값 복사를 하지 않고 참조하기 위한 pointer를 알아본다. 타 언어에서 null에 해당하는 개념인 nil을 알아본다. 또한 Error 처리를 간단하게 살펴본다. 이번에는 간단한 Bitcoin 입출금 시스템 구현 하면서 위에서 언급한 개념들을 살펴보자. - Pointer struct를 사용할 때 마치 Java의 setter처럼 상태를 관리하거나 상태를 변경하도록 메소드를 외부로 노출해야하는 경우가 있다. 이전 struct에서는 field에 직접 접근할 수 있었지만 이번에는 내부 상태를 외.. 2021. 12. 26.
Go - struct, method, interface 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/structs-methods-and-interfaces - 개요 Go에서 관련있는 데이터를 연관시켜 표현할 수 있는 struct에 대하여 알아본다. structd의 method와 interface를 통한 다형성을 알아본다. - struct example 사각형의 너비와 높이가 주어졌을 때 둘레를 구하는 코드를 작성해보자. func TestPerimeter(t *testing.T) { got := Perimeter(10.0, 10.0) want := 40.0 if got != want { t.Errorf("got %.2f want %.2f", got, want) } } Perimeter를 구현.. 2021. 12. 24.
Go - array, slice, test coverage 참조: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/arrays-and-slices - 개요 Go 에서 하나의 데이터 타입을 여러 개 저장할 수 있는 array 와 slice 에 대하여 알아본다. 또한 test coverage 와 array, slice 를 비교하는 reflect.DeepEqual 에 대해서도 알아본다. - Array & Slice Example array 의 수를 모두 더하면 얼마인지 구하는 기능을 구현해보자. 기능을 완성하고 나면 아래와 같이 array 를 인자로 받아서 단일값으로 반환하는 Sum 과 같은 함수를 호출할 것이다. test 값은 1,2,3,4,5 의 합이므로 기대값은 15이다. package main impo.. 2021. 12. 4.