Back-End/Golang
-
golang: Gin vs ChiBack-End/Golang 2024. 10. 17. 21:58
제가 Golang으로 웹 애플리케이션을 개발할 때 대표적으로 선택한 두 가지 프레임워크는 Gin과 Chi입니다. 이 글에서는 두 프레임워크를 다양한 측면에서 비교하여 각 프레임워크의 장단점을 심도 있게 살펴보고, 어떤 상황에서 어떤 프레임워크가 더 적합한지 알아보겠습니다.1. 성능Gin과 Chi 모두 경량 프레임워크로 높은 성능을 제공합니다. 하지만 일부 최적화 방법과 설계 철학이 다릅니다.Gin의 성능Gin은 컴파일된 정규 표현식과 트리 라우팅을 통해 요청을 빠르게 처리합니다.JSON 직렬화/역직렬화 작업에 최적화된 기능을 포함하여 빠른 성능을 발휘합니다.요청 처리 속도는 초당 수천 개의 요청을 처리할 수 있을 정도로 뛰어납니다.Chi의 성능Chi는 Go 표준 라이브러리의 net/http 위에 구축되어..
-
golang: 루프 변수의 스코프 이슈(Fixing For Loops in Go 1.22)Back-End/Golang 2024. 8. 5. 12:46
이 글은 https://go.dev/blog/loopvar-preview 주제를 다룹니다. 문제 설명루프 변수의 스코프 문제Go에서 for 루프는 반복문 내에서 루프 변수를 사용합니다. 하지만 기존의 Go 버전에서는 루프 변수의 스코프가 루프 전체에 걸쳐 있기 때문에, 개발자가 의도하지 않게 루프 변수가 변경되는 상황이 발생할 수 있습니다. 이 문제는 특히 **고루틴(goroutine)**이나 **클로저(closure)**를 사용할 때 더욱 두드러지며, 예측하지 못한 동작을 초래할 수 있습니다.예시 코드 및 문제점2. 고루틴 사용 예시func main() { done := make(chan bool) values := []string{"a", "b", "c"} for _, v := ran..
-
golang: 제네릭(Generic)이란?Back-End/Golang 2024. 8. 3. 13:14
제네릭(Generic)은 Go 언어에서 매우 강력한 도구로, 다양한 데이터 타입을 처리하고 코드를 간결하고 유연하게 만드는 데 유용합니다. 이를 통해 코드의 확장성, 안정성, 재사용성을 높일 수 있으며, 다양한 상황에서 효율적으로 사용할 수 있습니다. 제네릭을 잘 활용하면 더 나은 설계를 하고 변화하는 요구사항에 유연하게 대응할 수 있는 코드를 작성할 수 있습니다. 1. 타입 확장성제네릭을 사용하면 다양한 데이터 타입을 하나의 함수나 구조체로 처리할 수 있습니다. 이는 특정 타입에 제한되지 않고, 여러 타입에 대해 동일한 로직을 사용할 수 있게 합니다.예시: 숫자 계산 함수package mainimport "fmt"// 제네릭 타입 정의type Number interface { ~int | ~float6..
-
golang: Tee 패턴이란?Back-End/Golang 2024. 5. 15. 21:12
Tee 패턴은 하나의 입력 채널에서 읽은 데이터를 여러 출력 채널로 복사하여 동시에 여러 곳에서 사용할 수 있게 하는 패턴입니다. 이 패턴은 이름 그대로 "티" 모양처럼 데이터를 여러 갈래로 나누는 기능을 합니다. 이 패턴은 데이터를 여러 곳에서 병렬로 처리할 때 유용합니다.Tee 패턴의 구조입력 채널: 데이터를 제공하는 채널입니다.출력 채널들: 입력 채널에서 읽은 데이터를 복사하여 전달할 여러 개의 출력 채널입니다.예제 코드아래 예제에서는 tee 함수가 입력 채널에서 데이터를 읽어 두 개의 출력 채널로 복사하는 기능을 수행합니다.package mainimport ( "fmt" "sync")// tee 함수는 입력 채널에서 데이터를 읽어 여러 출력 채널로 복사합니다.func tee(done 코..
-
golang: 파이프라인(pipeline)이란?Back-End/Golang 2024. 5. 15. 20:36
파이프라인(pipeline)은 데이터를 단계별로 처리하는 시스템에서 자주 사용되는 패턴입니다. 각 단계는 특정 작업을 수행하며, 한 단계의 출력이 다음 단계의 입력이 되는 방식입니다. 파이프라인 패턴을 사용하면 복잡한 작업을 작은 단계로 나누어 처리할 수 있어 코드의 이해와 유지보수가 쉬워집니다. Go 언어에서는 고루틴과 채널을 사용하여 파이프라인을 구현할 수 있습니다.파이프라인의 구성 요소생산자(Producer): 데이터를 생성하여 파이프라인에 입력하는 역할을 합니다.처리자(Processor): 데이터를 처리하여 다음 단계로 전달하는 역할을 합니다.소비자(Consumer): 최종 데이터를 받아 처리하는 역할을 합니다.파이프라인의 기본 구조단계(Stage): 각 단계는 독립적인 고루틴으로 실행됩니다.채널..
-
golang: 배열(Array)과 슬라이스(Slice)Back-End/Golang 2024. 5. 11. 13:10
I. 정의 및 기본 개념배열(Array): 배열은 Go에서 고정된 크기의 연속적인 메모리 영역에 동일한 타입의 요소들을 순차적으로 저장하는 데이터 구조입니다. 배열의 길이는 선언 시에 정해지며, 이후에는 변경할 수 없습니다. 배열 초기화 방법1. 기본 초기화: 배열을 선언하고, Go의 기본값으로 초기화됩니다. 숫자 타입의 배열은 0, 불리언 배열은 false, 포인터와 슬라이스, 맵, 채널은 nil로 초기화됩니다.var arr1 [3]int 2. 리터럴을 사용한 초기화: 배열 선언과 동시에 특정 값으로 초기화합니다.arr2 := [3]int{10, 20, 30} 3. 인덱스 지정 초기화: 특정 인덱스에 값을 할당합니다. 할당되지 않은 인덱스는 타입의 기본값으로 초기화됩니다.arr3 := [5]int{1:..
-
고루틴 누수(Goroutine Leak)란?Back-End/Golang 2024. 5. 10. 11:59
고루틴 누수(Goroutine Leak)는 고루틴이 끝나지 않고 계속 메모리와 시스템 리소스를 소비하는 상태를 말합니다. 고루틴은 Go 언어에서 경량 스레드처럼 동작하며, 고루틴 누수는 프로그램의 성능 저하나 예상치 못한 동작을 초래할 수 있습니다. 고루틴이 제대로 종료되지 않으면 그에 따른 채널이나 다른 리소스도 해제되지 않아 리소스 누수로 이어질 수 있습니다. 고루틴 누수가 어떤 피해를 주나요?고루틴 누수는 프로그램의 성능과 안정성에 여러 가지 해로운 영향을 미칠 수 있습니다. 이러한 영향을 구체적으로 살펴보겠습니다:1. 메모리 사용 증가고루틴은 스택 메모리를 사용하고, 각 고루틴은 일반적으로 몇 킬로바이트의 메모리를 소비합니다. 고루틴이 계속 누적되면 사용되지 않는 메모리가 점점 증가하여 전체 시스..
-
golang: 1급 시민(First-class citizen)이란?Back-End/Golang 2024. 4. 28. 22:20
프로그래밍 언어에서 "1급 시민" 또는 "1급 객체"라는 용어는 해당 언어의 요소가 다음과 같은 특성을 갖추었을 때 사용됩니다:변수나 데이터 구조 안에 담길 수 있음: 1급 객체는 변수에 할당될 수 있습니다. 예를 들어, 함수가 1급 객체인 언어에서는 함수를 변수에 할당할 수 있습니다.함수의 인자로 전달될 수 있음: 함수를 다른 함수의 인자로 전달할 수 있습니다. 이는 고차 함수(higher-order function)를 가능하게 합니다.함수의 결과로 반환될 수 있음: 함수에서 다른 함수를 결과로 반환할 수 있습니다. 이는 함수를 동적으로 생성하고 조작할 수 있음을 의미합니다.할당에 사용된 표현식 내에서 리터럴로 표현될 수 있음: 객체를 코드 내에서 직접적으로 리터럴 형태로 표현할 수 있어야 합니다. 예..