개요go의 context 기능은 go 커뮤니티에서도 논쟁이 많고 이야기가 여러 가지가 있습니다.정리하면 주로 아래와 같죠 작업 취소와 타임 아웃의 유용성 : 고루틴 작업에서의 취소와 타임아웃에서는 리소스 누수 방지와 응답 개선의 효과가 있음사용에 대한 어려움 : 초기 학습의 혼란과 올바른 패턴에 이해 필요매개변수 남용 우려 : context로 값을 전달하는 과정이 오히려 가독성을 해칠 수 있다로깅과 통합 : 고유 값을 context에 담아서 로깅에 사용, 매개변수 남용이 될 수 있음동시성에서 필요하고 쓰기는 좋은 건 맞지만, 올바른 패턴의 필요성을 강조하고 있습니다.남발하면 가독성을 그만큼 해쳐지기 때문이죠 저 같으 경우 아직 Context의 존재와 기능은 머리로는 알고 있습니다만회사 소스 중에 어디에 ..
Go Lang/Study

개요https://seung.tistory.com/entry/GoLang-Go%EC%97%90%EC%84%9C-%EB%8F%99%EC%8B%9C%EC%84%B1%EC%9D%B4%EB%9E%80 [GoLang] Go에서 동시성이란Go 스케줄링고루틴 : Go의 최소 실행 단위로, main도 profile도 모든 게 다 고루틴고의 동시성에서는 Go 스케줄러로 어떻게 효율적으로 관리하느냐에 크게 의존합니다. goroutine 생성새로운 작업(Gorouseung.tistory.com요즘 고루틴에 대한 기억을 다시 떠올리며 공부하고 있습니다.생각해 보니 GoLang을 http 서버로 이용할 때도 고루틴으로 선언 안 해도 모든 요청을 고루틴으로 돌리더군요.즉 샘플 코드를 안만들어도, 이렇게 가까이에 좋은 예제가 있..

개요지난번 글에서 이어져서, 튜닝을 직접 해보는 글입니다.https://seung.tistory.com/entry/GoLang-Garbage-Collector-%EA%B0%9C%EB%85%90 [GoLang] Garbage Collector 개념GC, Garbage Collector Garbage Collector(GC)은 프로그램 실행 중 사용되지 않는 메모리를 자동으로 회수하는 메모리 관리 기법이다.이를 통해 개발자는 명시적으로 메모리를 해제할 필요 없이, 안전하고seung.tistory.com 저번 글에서 GC, CMS, STW, GC의 청소 대상, TCMalloc 등을 알아보았는데 GC 튜닝은 메모리 사용량, CPU 사용량 그리고 STW(Stop-The-World) 시간 사이의 trade-off(..

GC, Garbage Collector Garbage Collector(GC)은 프로그램 실행 중 사용되지 않는 메모리를 자동으로 회수하는 메모리 관리 기법이다.이를 통해 개발자는 명시적으로 메모리를 해제할 필요 없이, 안전하고 효율적인 메모리 관리를 수행할 수 있습니다. Go에서는 이런 GC를 Concurrent Mark and Sweep(CMS) 방식을 채택하여 애플리케이션과 GC 작업을 동시에 수행합니다, Go는 STW의 Latency 시간을 최소화하는 방향으로 발전해 왔습니다.Golang GC 튜닝의 핵심은 STW가 덜 발생하도록, 발생해도 빨리 해소되도록 하는 게 목표입니다. Concurrent Mark and Sweep, CMS CMS는 Tri-color Marking 기법으로 GC 작업을 수..

추상 팩토리 디자인 패턴추상 팩토리 디자인을 사용해 보겠습니다.아마 여러분이 디자인 패턴을 한 번이라도 봤다면 이 패턴을 가장 처음 보게 될 텐데이게 디자인 패턴 중 가장 친근할 겁니다. 요약하자면 일정한 패턴을 가진 객체들을 자주 사용할 때공통된 함수나 변수로 묶어서 인터페이스를 만들고, 이 인터페이스를 잘 활용을 하는 방법입니다. 이걸 구현하는 하위 객체들을 사용하는, 호출 부에서는 객체 하나하나의 생성을 로직을 몰라도 바로 쓸 수 있습니다.이로써 객체 생성의 추상화가 구현됨으로써 유연성과 확장성을 높여 줍니다. 개념추상화라는 말이 들어가는 걸로, 알 수 있듯이 객체 지향 언어에서 인터페이스를 사용해서 주로 구현합니다.여러 객체를 생성하기 위해 이들을 묶는 상위 개념의 인터페이스 제공각 객체는 Fac..

GraphQL이 뭔지 궁금하다면 다음 주소를 참고 ㄱㄱ https://seung.tistory.com/entry/GraphQL%EC%9D%B4-%EB%AD%94%EC%A7%80-%EC%95%8C%EC%95%84%EB%B3%BC%EA%B9%8C Go에서는 GraphQL을 지원하는 라이브러리는 참 많던데 주로 쓰이는 건 아래와 같다 99designs/gqlgen: https://github.com/99designs/gqlgen graphql-go/graphql: https://github.com/graphql-go/graphql graph-gophers/graphql-go: https://github.com/graph-gophers/graphql-go 뭘 할까.. 대충 아래 목록을 기준으로 고르도록 했다 해..

1. Go가 뭐라고 생각해요? Go는 요즘 같은 시대에 딱 적합한 언어라고 생각합니다 빠르게 컴파일링 가능하고, 복잡함을 최소화했으며 문법도 간단하고 경량 스레드를 가진 데다가 C와 라이브러리와 네이티브 시스템 호출 등 상호운용성도 챙겼기에 매우 좋은 언어라 생각합니다. 2. Go 프로그램의 패키지를 설명해 주세요? 패키지란 비슷한 기능을 가진 함수, 타입, 변수들이 집합으로 패키지는 코드의 구조를 조직화하고 네임스페이스를 제공하는 역할을 합니다. GO는 패키지로 구성되며 main 패키지에서 실행됩니다. go mod init : 모듈을 초기화합니다. go get : 외부 모를 가져옵니다. go build : 코드를 빌드합니다 3. 사용자 지정 패키지란? 프로젝트 디렉터리 아래에 라이브러리 파일이 있는 디..

주의반복문에서 고루틴을 돌리면 신기하게 결과물이 나올 때가 있습니다.아래 코드를 실행했을 때의 결과는 무엇일까요?import ( "fmt" "sync")func main() { var wg sync.WaitGroup for _, text := range []string{"a", "b", "c"} { wg.Add(1) go func() { defer wg.Done() fmt.Println(text) }() } wg.Wait()} 만약 a, b, c가 랜덤으로 출력 것이라 생각하신다면 틀렸습니다결과는 아래와 같습니다.ccc 왜 이런 일이이유는 루프문이 고루틴보다 먼저 끝나서 고루틴에서 사용할 수 있도록 메모리를 힙으로 옮겼기 때문입니다.즉 for문이 먼저 끝나서 text의 값은 마지막 c를 가리..

Go 스케줄링고루틴 : Go의 최소 실행 단위로, main도 profile도 모든 게 다 고루틴고의 동시성에서는 Go 스케줄러로 어떻게 효율적으로 관리하느냐에 크게 의존합니다. goroutine 생성새로운 작업(Goroutine, G)이 생성되면, 해당 작업은 현재 P(processor)의 LRQ에 삽입됩니다.P는 자신만의 LRQ(Local Run Queue)를 보유하며 P의 개수는 GOMAXPROCS로 결정됩니다.이거로 동시 실행이 가능한 goroutine 수를 제한합니다.로컬 처리P는 자신의 LRQ에 있는 작업을 우선 실행하는 데 이 과정은 빠르고 효율적이며, 락 경합 없이 처리됩니다.글로벌 작업 분배만약 한 P의 LRQ가 비거나 작업이 부족하면, 해당 P는 다른 P의 LRQ에서 작업을 훔치거나 G..

개요이번 포스팅은 Golang을 할 때 가장 큰 장점으로 꼽히는 부분인 동시성(고루틴)과 크게 관련된 내용입니다.동시성 프로그래밍은 사실 쉽지 않습니다. 동시에 실행된다는 개념 때문에 프로그래머가 생각하는 순서와 실제 프로세스의 순서가 다를 수 있습니다.이 문제를 레이스 컨디션이라 부릅니다.레이스 컨디션 (Race Condition) : 개발자의 의도와 상관없이 프로세스의 순서가 바뀌어 결과가 일정하지 않은 문제 아래는 간단한 레이스 컨디션의 예제입니다.var num intgo func() { num++}()if num == 0 { fmt.Printf("The value is %d.\n", num)} 위 코드의 결과는 대부분 "The value is 0."로 출력될 겁니다.요즘 사용하는 컴퓨터의 수준은..