
백엔드
Fiber
웹 애플리케이션을 쉽게 구축할 수 있는 간결하고 직관적인 API를 제공하는 것을 중점으로 설계된 Go 기반 웹프레임워크
StackOverflow 질문 수: 208
Github Stars : ★ 3273
사용 기업

식스샵

지바이크

야놀자
현대자동차그룹
[디지털 트윈 기술 #5] Go Fiber Framework 를 활용한 동시성, 고성능 실시간 데이터 처리 back-end 서비스 개발 사례
인사말안녕하세요!! 현재 현대오토에버에서 디지털 트윈을 위한 Back-End Service 개발을 담당하고 있는 김중희 책임이라고 합니다. 이번에 소개해드릴 기술은 디지털트윈 에서 실제로 3D환경에서 오브젝트들을 움직이고 신호를 주기 위한 원천 데이터를 처리하는 Back-end서비스에 대한 내용입니다. 강력한 성능과 동시성을 확보하기 위해 Go언어를 차용하였고, goroutine을 적극적으로 사용하여 CPU 집약적인 작업을 동시에 처리 할 수 있었습니다. 언어에 대한 소개와 기술적인 아키텍처를 중심으로 소개 드리겠습니다.프로젝트 소개1. 개발 배경다양한 설비 및 이동체의 실시간(low-latency) 데이터 처리를 확보 하면서 확장 가능한 백엔드 서비스 개발이 필요2. 주요 목표백엔드 서비스 개요자동 창고 및 이동체 등 다양한 Raw 데이터를 IoT platform 을 통해 실시간 수집 및 처리할 수 있는 서비스 개발을 고려하였습니다.서비스 구축시 해결해야 할 주요 문제IoT 플랫폼 혹은 다양한 데이터를 제공하는 sender가 계속 확장 될 수 있는 구조 고려 하였습니다.Websocket 통신 종료 시 해당 context를 기반으로 연결 종료 처리 및 자원 해제될 수 있는 구조를 고려하였습니다.모든 Websocket 통신이 서로 독립적으로 동시성을 가지면서 연결되도록 개발하였습니다.실시간 데이터의 손실이 최대한 없는 고가용성 확보하였습니다.기대 효과Low-Latency 실시간 데이터 처리 서비스를 제공할 수 있습니다.실시간 데이터를 활용하여 3D엔진 (Unreal Engine)에서 객체의 다양한 이동 및 모션을 실시간 동기화 할 수 있습니다.기술 스택1. 기술 스택 및 버전기술버전선정 이유Golang1.22.6고성능, 동시성 처리 (goroutine)Fiber Framework2.52 (v2)fasthttp 기반 고성능 프레임워크Redis7.2.5고성능 Key-value In-memory cache2. Go 언어 선택 이유동시성을 유지하면서 가볍고 고 성능 서비스를 계속 유지해야 했습니다. go의 goroutine을 활용하면 이 문제를 보다 쉽게 해결할 수 있습니다.강력한 정적 타입 : 런타임 안에서 강력한 타입 체크 및 미 사용 변수를 체크하여, 메모리 관리 및 오류 발생을 최소화 및 안정성이 향상되어 오랜 시간 서비스를 하여도 문제 없이 안정적으로 운영할 수 있습니다.3. 컴파일 시 발생하는 오류 및 올바른 사용법 컴파일 에러 발생 케이스func unusedVariables() { x := 10 // 컴파일 에러: x declared but not used} 올바른 사용법func unusedVariables() { x := 10 fmt.Println(x) // 변수 사용 // 또는 _ := 10 // 블랭크 식별자 사용}타입 불일치 연산 컴파일 에러 케이스func typeMismatch() { intNum := 42 // int floatNum := 3.14 // float64 // 컴파일 에러: invalid operation: mismatched types int and float64 result := intNum + floatNum // 컴파일 에러: cannot use floatNum (type float64) as type int var sum int = intNum + floatNum // 컴파일 에러: cannot use intNum (type int) as type float64 var total float64 = floatNum * intNum} 올바른 사용법func correctTypeCasting() { intNum := 42 // int floatNum := 3.14 // float64 // int를 float64로 변환하여 계산 result1 := float64(intNum) + floatNum // 45.14 // float64를 int로 변환하여 계산 (소수점 버림 주의) result2 := intNum + int(floatNum) // 45 // 모든 숫자를 float64로 통일 var total float64 = float64(intNum) * floatNum // 131.88}함수 호출 타입 체크함수 호출 예시// 함수 정의func calculateArea(width float64, height float64) float64 { return width * height}// 잘못된 호출area := calculateArea(42, 10) // int를 float64에 바로 전달 불가// 올바른 호출area := calculateArea(float64(42), float64(10))슬라이스 타입 체크타입이 다른 슬라이스 간 연산numbers := []int{1, 2, 3}texts := []string{"a", "b", "c"}// 컴파일 에러 케이스numbers = texts // 다른 타입의 슬라이스는 할당 불가numbers = append(numbers, "d") // string을 int 슬라이스에 추가 불가구조체 필드 타입 체크구조체 정의type User struct { ID int Name string Age int} 컴파일 에러 케이스user := User{ ID: "123", // string을 int에 할당 불가 Email: "john@example.com", // 존재하지 않는 필드} 올바른 사용법user := User{ ID: 123, Name: "John", Age: 25,}인터페이스 구현 체크인터페이스 정의와 구현type Writer interface { Write([]byte) (int, error)}// 잘못된 구현type MyWriter struct{} // Write 메서드 없음// 올바른 구현type MyWriter struct{}func (w MyWriter) Write(data []byte) (int, error) { return len(data), nil}4. 가비지 컬렉션C, C++ 계열에서 많이 발생하는 메모리 누수 문제를 해결할 수 있는 가비지 컬렉션 기능이 강력하며, 메모리 오버 플로우 문제
fiber
github
go
nodejs
redis
연관 기술 스택

Go