본문 바로가기

컨퍼런스 정리

GopherCon Korea 2024 Day 1 정리

728x90

 

이 포스트는 2024년에 진행된 GopherCon Korea 2024의 Day 1을 정리한다.

 

텍스트의 추출은 Voice2Text를 사용했으며, 내용 정리는 LLM의 도움을 받았다.

 

https://www.youtube.com/live/zdMuLvK0pNg?si=4m-Ox2pDcwikgGij

 

전체적인 진행 순서는 다음과 같다.

✅ 진행 순서 안내

  1. 변규현 – “고언어 프로젝트 가이드 A to Z”
  2. 백경준 – “고랭으로 4일 만에 이미지 서버 성능 72% 개선”
  3. 이오민 – “차량 업데이트 파일의 안전한 관리”
  4. 정겨울 – “디터미니스틱 테스팅”
  5. 최정민 – “Gin 프레임워크 모니터링 APM 만들기”
  6. 김정민 – “쿠버네티스 LMA 벤티스택 개발기 Part2”

 

🎤 변규현 (당근, 채팅 조직 리드)

주제: 고언어 프로젝트 가이드 A to Z

🧩 핵심 요약

1. 작은 프로젝트 vs 큰 프로젝트

  • 작은 프로젝트는 빠른 릴리즈, 단순한 기능, 불확실성 있는 요구사항을 가진 MVP나 실험적인 서비스가 많음.
  • 이런 프로젝트에선 과한 구조보다는 단순하고 빠르게 구현하는 것이 핵심.

2. 작은 프로젝트 개발 전략

  • CLI는 외부 라이브러리 없이 hello.go 같이 단순하게 시작.
  • API 서버도 기본 패키지로 작성하여 필요 최소한만 구성.
  • 의존성이 적은 구조를 선호하며, 변경에 유연한 코드 설계를 강조.

3. 핸들러 패턴 비교

  • Handler Struct 방식: 복잡한 상태 관리에 좋음. 구조가 명확함.
  • Handler Func 방식: 간단하고 빠르게 구현 가능. 의존성 주입이 쉬움, 함수형 개발에 적합.

 

비교 항목 Handler Struct Handler Func
구조 관리 명확함 유연함
테스트 용이성 보통 쉬움
확장성 좋음 제한적
사용 추천 복잡한 로직 단순한 로직

4. 코드 유지 보수 관점

  • 의존성은 최소화하는 것이 좋고,
  • 메서드별로 필요한 의존성만 주입하여 코드의 명료성과 테스트 용이성 확보.
  • 기능 단위 분리와 코드 독립성을 강조.

5. 결론

  • 무조건 복잡한 설계보다, **"단순함에서 시작해서 필요에 따라 확장"**하는 것이 중요.
  • 고언어의 구조적 유연성과 명확한 의존성 모델은 이를 잘 지원함.
  • “핸들러 방식 vs 핸들러 펑크 방식”은 목적과 상황에 맞게 선택할 것.

 

🎤 백경준 (백패커 / 데브옵스 & 데이터 엔지니어)

주제: 고랭으로 4일 만에 이미지 서버 성능 72% 개선한 이야기

🧠 발표 요약

1. 문제 배경

  • 기존 이미지 서버는 PHP 기반, CDN 캐시 만료 시 리사이즈 요청 폭주 → CPU 스로틀링, OOM 문제 발생.
  • 오토스케일링도 제대로 동작 안 함. 리소스는 낭비되고 요청은 처리 못 하는 구조.

2. 개선 목표

  • 성능 2배 이상 개선
  • 다른 개발자 리소스 없이 본인의 리소스만으로 해결
  • 유지보수 가능한 기술 스택 → Go + Gin 선택

3. 첫 번째 실패

  • nfnt/resize 사용 → PHP보다 성능 나쁨
  • CPU 사용률↑, 레이턴시↑, 메모리 효율 비슷
  • 원인: nfnt/resize는 성능 최적화 X

4. 해결 방법

  • bimg (libvips 기반) 라이브러리로 교체
  • 이후 성능 대폭 개선:
    • 레이턴시 50% ↓
    • CPU 사용량 절반
    • 메모리 사용량 80% 절감

5. 부하 테스트 & 배포

  • Locust로 스루풋/응답시간 테스트
  • Istio 기반 Canary 배포 전략 → 실시간 트래픽으로 실험
  • 장애 발생 시 빠른 롤백 가능

6. 기술 스택

  • 프레임워크: Go + Gin
  • 이미지 처리: bimg (libvips)
  • 운영: Kubernetes + Istio, DataDog, Prometheus

7. 메시지

  • 문제 정의 → 빠른 범위 설정 → 가벼운 솔루션으로 효과적 해결
  • Go는 실무에서 매우 유효한 선택지
    (특히 빠르게 성능 개선이 필요한 시스템에서)

🔐 차량 OTA 업데이트 파일의 안전한 관리 (이오민, 42dot)

1. 발표 개요

  • 주제: 차량용 소프트웨어 OTA 업데이트 파일의 보안 관리 및 이를 위한 Go 언어 활용 사례 소개.
  • 목표: 기밀성, 무결성, 가용성(CIA)을 충족하는 OTA 업데이트 시스템 설계와 구현 방법을 공유.
  • 대상: IoT/자동차 시스템, 보안, Go 기반 서버 개발에 관심 있는 개발자.

2. 42dot과 SDV 소개

  • 회사: 42dot – 현대차 자회사로 자율주행 및 모빌리티 플랫폼 개발.
  • SDV(Software Defined Vehicle):
    • 자동차 기능이 소프트웨어로 정의되는 시스템.
    • 예: 테슬라 사이버트럭 핸들도 기계적 연결 없이 소프트웨어 제어.
  • OTA(Over-The-Air):
    • SD카드 등을 통한 수동 업데이트의 단점 극복.
    • 무선 네트워크를 통한 소프트웨어 자동 업데이트 방식.
    • 보안 결함 수정, 리콜 비용 절감에 핵심적인 역할.

3. CIA 트라이어드: 보안의 3요소

요소 의미 차량 OTA 업데이트에 적용
Confidentiality (기밀성) 정보 접근 제어 업데이트 파일 암호화 (AES 등)
Integrity (무결성) 데이터 변조 방지 메타데이터 서명 및 검증
Availability (가용성) 시스템 지속 동작 앱 개발 통한 내부 테스트
 

4. 기밀성 – 파일 암호화 방식

🔒 대칭키 암호화 (AES)

  • 사용 이유: 빠르고 대용량 처리에 적합.
  • 구현 방식:
    • crypto/aes, cipher 등 Go 기본 패키지 활용.
    • io.Reader, io.Writer 사용 → 스트리밍 처리 가능, 메모리 절약.
  • 실제 코드:
    • 암호화된 파일은 .enc 확장자.
    • 메모리 전체를 올리는 방식 대신 스트림 암호화 사용.

🔐 비대칭키와 Invelop Encryption

  • 문제점: 비대칭키(RSA 등)는 속도 느림, 온디맨드 암호화 어려움.
  • 해결책: 인벨롭 암호화
    • 파일은 **대칭키(AES)**로 암호화.
    • 대칭키는 클라이언트의 공개키로 한 번 더 암호화.
    • 클라이언트(차량)는 자신의 개인키로 대칭키를 복호화 후 파일 복호화.
  • 이점:
    • 서버는 평문 데이터 노출 없음.
    • 키 유출 위험 분산 및 관리 효율성 ↑

5. 무결성 – 메타데이터 검증

📦 TUF / Uptane 보안 프레임워크

항목 설명
TUF (The Update Framework) 소프트웨어 업데이트 보안 설계도
Uptane TUF 기반 차량용 확장 버전 (CNCF 소속)
구성 요소:
    • 이미지 저장소: 업데이트 바이너리 및 정적 메타데이터 저장.
    • 디렉터 저장소: DB 기반 동적 메타데이터 생성.
  • 검증 방식:
    • 차량은 이미지 서버와 디렉터 서버 모두의 메타데이터를 비교.
    • 하나라도 다르면 공격 감지 가능.
  • 메타데이터 구조:
    • 해시, 사이즈 등 포함된 target.yaml 파일로 관리.
    • Go에서 YAML 처리도 서드파티 라이브러리로 손쉽게 구현.

6. 가용성 – 내부 앱 구축

  • 실제 차량 OTA 클라이언트는 Rust로 작성.
  • 그러나 사내 테스트 및 디버깅을 위해 Go로 된 앱 클라이언트 작성.
  • 내부 앱 기능:
    • 암호화 파일 다운로드
    • 메타데이터 파싱 및 검증
    • 키 체인 연동 확인

7. 구현 시 유의사항 및 팁

  • 키 분리 설계: 파일마다 다른 데이터 키 사용 → 유출 피해 최소화.
  • 키 저장소 분리:
    • 암호화된 데이터키는 스토리지에 저장.
    • 원본 키는 KMS (Key Management Service) 또는 클라우드 키 매니저에 보관.
  • 자동차 공개키 전달:
    • 클라이언트(차량)가 자신의 공개키를 서버에 전달 → 서버가 데이터 키를 암호화해서 응답.

8. 결론 및 교훈

  • 보안은 개발의 후순위가 아니라 시작점이 되어야 함.
  • OTA 시스템의 신뢰성을 위해서는 암호화 + 메타데이터 검증 + 안전한 키 관리가 필수.
  • Go 언어는 다음의 이유로 시스템 구현에 매우 적합:
    • crypto, io, yaml, 클라우드 SDK 등 내장 패키지 풍부.
    • 간결하고 명확한 코드 스타일.
    • 스트리밍 기반 처리에 용이.

9. 추가 리소스

 

✅ 디터미니스틱 테스팅: 테스트를 더 예측 가능하게 만드는 방법 (정겨울, 당근)

1. 발표 개요

  • 주제: 테스트의 안정성과 신뢰성을 높이기 위한 디터미니스틱(Deterministic) 테스트 기법 소개.
  • 목표: 테스트가 랜덤하게 실패하는 상황을 줄이고, 예측 가능한 테스트 코드를 작성하는 방법을 공유.
  • 대상: Go뿐 아니라 테스트 품질에 관심 있는 모든 개발자.

2. 디터미니스틱 테스팅이란?

  • 디터미니스틱(Deterministic): 실행할 때마다 결과가 동일한 테스트.
  • 반대는 논디터미니스틱(Nondeterministic) → 간헐적으로 실패(Flaky Test).
  • 테스트가 실패하는 이유:
    • 랜덤값 사용
    • time.Now() 같은 시간 의존성
    • 네트워크 요청, 파일 시스템
    • 고루틴 등 비동기 처리
    • 맵 순회 순서 (비결정적)
    • 외부 시스템 (서버, DB 등)

3. 왜 디터미니스틱해야 하는가?

  • Flaky Test의 문제점
    • 신규 개발자가 코드를 신뢰하지 못함
    • 실패한 테스트를 무시하거나 반복 실행
    • 릴리즈 속도 및 품질 저하
    • 예측 불가한 장애로 이어질 수 있음

4. 문제 상황과 해결 전략

(1) 랜덤값 문제

  • 문제: ID 생성, 샘플링 등에서 랜덤을 사용 → 테스트 시 예측 불가.
  • 해결:
    • rand.New(rand.NewSource(seed))로 고정된 랜덤 인스턴스를 주입.
    • Sampler 인터페이스를 정의해 AlwaysSampler, NeverSampler 같은 구현체로 테스트 유연성 확보.

(2) 시간 관련 문제

  • 문제: time.Now()를 테스트 시점마다 호출 → 값 예측 어려움.
  • 해결: 시간 생성 함수 (nowFunc()) 또는 Clock 인터페이스를 의존성 주입.

(3) UID / Nonce 생성

  • 문제: UID는 매 실행마다 바뀜.
  • 해결:
    • 고정된 UID를 반환하는 제너레이터 주입.
    • 테스트 전용 UID 제너레이터를 만들어 사용 (AtomicInt, FixedUIDFunc 등).

(4) 고루틴과 타이밍 문제

  • 문제: 비동기 퍼블리셔, time.Sleep()으로 동기화.
  • 해결:
    • 고루틴 완료 신호를 채널로 대체.
    • 채널에서 값을 읽고 동기화하는 구조 사용.

5. 테크닉 요약

문제 요소 해결 방법
랜덤 값 고정된 랜덤 인스턴스 주입 (rand.New)
시간 (time.Now()) 시간 생성 함수 또는 인터페이스 주입
UID / Nonce 생성 고정값 반환 함수 또는 제너레이터 주입
고루틴 / Sleep 채널 동기화로 대체
맵 순회 슬라이스에 저장 후 sort → 순서 보장
JSON 인코딩 문자열 비교 대신 구조체 필드 값 비교

6. 부가 사례 및 고려사항

  • 몽키 패칭은 비추천: 고에서는 지원이 미비하거나 불안정.
  • 인터페이스 설계 장점:
    • 테스트 목적에 맞는 구성요소를 주입 가능.
    • Mock 객체 없이 명확한 역할 기반 테스트 가능.

7. 결론 및 교훈

  • 결론: 테스트의 예측 가능성과 재현성을 높이기 위해 디터미니스틱하게 작성하라.
  • 핵심 팁 요약:
    • 비결정적 요소를 식별하고, 외부로부터 주입받는 구조로 리팩토링.
    • 테스트는 결과를 예측 가능하게 만들어야 한다.
  • 적용 대상: 특히 유닛 테스트 단계에서 효과가 크며, 통합 테스트와 E2E 테스트에도 부분 적용 가능.

8. 참고 자료

📊 Gin 프레임워크 기반 APM 모니터링 개발기 (최정민, 한화비전)

1. 발표 개요

  • 주제: Go의 인기 웹 프레임워크인 Gin을 대상으로 한 APM(Application Performance Monitoring) 시스템 자체 개발기.
  • 목표: 오픈소스 APM이 있음에도 직접 만들면서 배운 아키텍처와 구현 방식 공유.
  • 대상: 웹 프레임워크 성능 모니터링, MSA 환경에서 추적/분석을 하고 싶은 개발자.

2. 발표 배경 및 동기

  • 발표자는 DevOps 엔지니어로, 서비스가 잘 돌아가게 만드는 일에 집중.
  • 기존에도 서버 모니터링 프로젝트를 수행했으나, 이번에는 더 직관적인 APM 개발에 도전.
  • Gin은 Go에서 가장 널리 사용되는 웹 프레임워크 → 모니터링 대상 1순위.
  • 목표: 오픈소스 없이 순수 Go로 만든 경량 APM 시스템!

3. Gin 프레임워크란?

  • Go 언어의 고성능 웹 프레임워크.
  • 장점:
    • 사용자 수, GitHub 스타 수 기준 가장 인기 많음.
    • 경량 + 미들웨어 지원 + 퍼포먼스 최적화에 집중.
  • 최근 업그레이드에서 20% 성능 향상 발표.
  • 실제 현업에서도 다양한 REST API, MSA 환경에서 폭넓게 사용됨.

4. 왜 APM 모니터링이 중요한가?

  • MSA 구조에서는 서비스 간 호출이 복잡하게 얽혀 있음.
  • 하나의 지연이 어디서 발생했는지 식별이 어려움.
  • 따라서:
    • 매트릭(Metrics): 요청 횟수, 응답 시간 등 수치 정보
    • 트레이싱(Tracing): 서비스 간 호출 흐름 추적
    • (참고) **로그(Log)**는 회사별 규격이 다르므로 이번 발표에서는 제외

5. 매트릭 수집 구조

구성 요소

  • 미들웨어: Gin의 요청 전/후 흐름에 개입 → 리퀘스트 타이밍 측정
  • 공유 메모리 리소스: 수집된 매트릭을 저장
  • 익스포터(Exporter): HTTP API(/metrics)로 매트릭을 외부에 제공

측정 항목

  • 요청 경로 (Path)
  • 상태 코드 (200, 400, 500 등)
  • 요청 응답 시간 (Duration)

처리 흐름

  1. 요청 도착 → 미들웨어가 startTime 기록
  2. 요청 처리 → 핸들러 수행
  3. 응답 전 → duration 계산 + 상태 코드 수집
  4. recordMetrics() 함수 호출 → 결과 저장

동시성 처리

  • 여러 요청이 동시에 들어올 수 있으므로 mutex를 사용하여 데이터 보호

6. 트레이싱 수집 구조

트레이스 vs 스팬

  • Trace: 하나의 요청 흐름 전체 (예: A → B → C)
  • Span: 개별 서비스 또는 구간의 단위 작업

목표

  • Trace ID, Span ID, Parent Span ID를 요청 컨텍스트에 삽입
  • 요청이 다른 서비스로 전파될 때도 트레이스 정보 유지

구현 방법

  1. 미들웨어 초기화:
    • 요청 헤더에 트레이스 정보 없을 경우 생성
    • 새 Trace ID, Span ID 생성 → context.Context에 삽입
  2. 로깅에 활용:
    • 요청별 Trace 정보 포함 → 로그와 연계
  3. 다른 서비스로 전파:
    • HTTP 요청을 날릴 때 RoundTripper 인터페이스를 활용
    • 직접 구현한 커스텀 트랜스포트를 사용해 요청 헤더에 Trace 정보를 주입

7. 핵심 구현 포인트

기능 구현 방법
Gin 미들웨어 c.Next() 전후로 실행 시간 측정
요청 식별 Path + StatusCode 조합
매트릭 저장 map[string]MetricData + Mutex
트레이스 생성 UUID 생성기 or Atomic Integer
전파 (Outbound) Custom http.RoundTripper 사용
상태 코드 수집 c.Writer.Status() 호출로 응답 상태 확인

8. APM 시스템 구조 요약

[Client]
   ↓
[Gin 미들웨어] ← Trace 생성 및 매트릭 측정
   ↓
[핸들러 함수] ← 실제 비즈니스 로직 처리
   ↓
[미들웨어 후처리] ← Duration 측정 완료, 상태 코드 파악
   ↓
[메모리 기록] → [익스포터] → /metrics 엔드포인트 제공

9. 실전 적용 팁

  • 미들웨어는 핵심 로직 앞뒤에 꼭 개입해야 함
  • Trace 정보는 context.Context에 직접 삽입/추출 설계
  • 전파 시 RoundTripper는 꼭 인터페이스 구현해서 교체
  • Mutex, atomic 등의 동시성 관리 필수
  • 관측 데이터를 Prometheus 등 외부 툴과 연동도 고려 가능

10. 결론 및 교훈

  • 핵심 메시지: APM은 선택이 아닌 필수, 직접 구현도 충분히 가능!
  • 오픈소스 없이도 Go의 기본 기능만으로 APM 구성 가능
  • Gin + Middleware + Trace/Metric 관리 → 최소한의 구조로 효과적인 추적 실현
  • 향후:
    • 로그 연동, Prometheus 연계, Zipkin/OpenTelemetry 연계도 확장 가능

11. 참고 자료


☁️ 쿠버네티스 LMA 벤티 스택 개발기 (김정민, 삼성 SDS)

1. 발표 개요

  • 주제: 쿠버네티스 기반 로깅/모니터링/알림(LMA) 시스템 “벤티 스택”의 개발 배경과 구조, 구현기.
  • 목표: OSS 라이선스 문제로 자체 개발하게 된 로그 DB 및 비주얼라이저의 설계 과정을 공유.
  • 대상: 쿠버네티스 운영자, DevOps, 관측성 도구에 관심 있는 Go 개발자.

2. 벤티 스택(Venty Stack) 소개

  • LMA: Logging, Monitoring, Alerting
  • 벤티 스택 구성:
    • 렛데(LETDE): 로그 수집 및 저장(DB)
    • 벤티(Venty): 로그/메트릭 비주얼라이저
    • Fluent Bit: 로그 수집기
    • Prometheus: 메트릭 수집기
  • 설치 방식: Helm Chart로 통합 설치 가능 (values.yaml 설정만으로 구성 가능)

3. 기존 시스템과 전환 배경

🔁 로그 시스템의 진화

시기 구성 문제점
2018 ElasticSearch + Kibana + Fluentd 메모리 과다 사용, 기동 느림, 라이선스 문제
2019 Open Distro for ES (Elastic OSS 버전) 안정성은 개선되었으나 제한적
2020 Grafana Loki 도입 경량화, 메트릭·로그 통합 조회 가능
2021~ 자체 개발: 렛데 + 벤티 완전한 오픈소스 기반, 경량화, 사용성 향상

 

 
  • 전환 이유:
    • Elastic의 라이선스 변경 (X-Pack → SSPL/Elastic License)
    • Grafana Loki의 라이선스도 변경됨 → AGPL 우려
    • 지속 가능하고 자유로운 OSS 스택 필요

4. AGPL과 오픈소스 라이선스 고려

  • AGPL: 서버 소프트웨어도 소스코드 공개 요구 → 기업 입장에서 리스크.
  • 벤티 스택: Apache 2.0 라이선스 사용 → 자유로운 사용 및 배포.
  • 라이선스 검증 도구: golicense 사용, GitHub Actions에 연동.

5. 렛데(LETDE) – 경량 로그 DB

구조 개요

  • 저장 방식: 플랫 파일
    • 로그는 시간 단위로 파일화하여 저장
    • 디렉터리 구조: /node/<node>/..., /pod/<namespace>/<pod>/...
  • 읽기/쓰기 분리: 사이드카 구조
    • LETDE Reader: 쿼리 처리 전담
    • LETDE Writer: 로그 수집 및 저장 전담

주요 특징

  • 경량화: Fluent Bit 사용 (메모리 사용량 1MB대)
  • 시스템 의존성 없음: 단순 파일 기반 저장
  • LETDE QL:
    • PromQL 기반의 로그 쿼리 언어
    • 필터/정규식 연산자 제공 (|, !, =~, !~)
    • 예: pod{namespace="foo", pod=~"nginx.*"} |~ "GET"

6. 벤티(Venty) – 로그/메트릭 통합 뷰어

  • 역할: 메트릭 (Prometheus) + 로그 (렛데) 통합 UI 제공
  • 특징:
    • 한 곳에서 로그와 매트릭을 함께 조회 가능 (Loki의 장점 계승)
    • 가볍고 빠름, 고유 쿼리 엔진 사용
  • 구현 시 고려사항:
    • 쿼리 실행 속도
    • 리텐션 설정 (시간, 용량 단위)
    • 사용자 정의 뷰 지원 예정

7. 개발 및 배포

MVP 개발 일정

  • 총 4주 개발
    • 렛데: 2주
    • 벤티: 2주
  • Helm Chart 작성 후 오픈소스 배포

Helm 설치 예시

helm repo add kooss https://ko-oss.github.io/helm-charts
helm install my-lma kooss/ventystack -f values.yaml

8. 기술적 구현 요소

로그 수집 파이프라인 (Fluent Bit)

  • 로그 입력:
    • Pod 로그: /var/log/containers
    • Node 로그: journald 플러그인
  • 가공/정제:
    • 태그, 필드 정리
    • 필터링 로직 삽입
  • 출력:
    • LETDE Writer로 전달 → 파일로 저장

Go 코드 구조 예시

  • Main 구조: main → app.Run() → config, router, rotator
  • 핵심 모듈:
    • config: 리텐션 설정, 경로
    • router: HTTP 쿼리 엔드포인트
    • rotator: 오래된 로그 정리

9. 명명 규칙 및 상징

컴포넌트 의미 상징
Prometheus 메트릭 수집 🔥 불 (불의 신)
렛데(LETDE) 로그 저장소 💧 물 (망각의 강)
벤티(Venty) 비주얼라이저 🌬️ 바람 (바람의 신)
 
  • 명명 기준:
    • 신화적 이름 사용
    • 직관적인 알파벳 약자 (L: 로그, V: 비주얼라이저)
    • 짧고 기억하기 쉬운 이름

10. 결론 및 교훈

  • OSS 라이선스는 선택이 아닌 필수 고려 사항
  • 경량화된 로그 시스템도 충분히 자체 개발 가능
  • Go 언어는 시스템 구현에 매우 적합:
    • 파일 기반 처리
    • 고성능 HTTP 라우팅
    • OSS 생태계 연동성

11. 추가 자료

🚀 GopherCon Korea 2024 Day 1 총정리


📌 1. Go는 “단순함과 실용성”의 언어다

📍 대표 발표:

  • 변규현 – Go 프로젝트 가이드 A to Z
  • 정겨울 – 디터미니스틱 테스팅

Go는 더 이상 단순히 빠른 언어가 아니라, 작고 명확한 구조를 통해 빠르게 실용적인 서비스를 만들 수 있는 언어로 자리 잡고 있음.

  • 불필요한 복잡도보다는 "작은 유니콘 만들기" 철학이 강조됨.
  • 테스트, 프로젝트 설계, 아키텍처 선택 모두 “적절한 만큼”만 적용.
  • 핸들러 vs 핸들러펑크 등 실용적인 선택지 제공.

✅ 시사점: "Go는 엔터프라이즈급 설계도 할 수 있지만, 본질은 빠른 실험과 명확성에 있음"


📌 2. 직접 만드는 모니터링/관측 도구의 부상

📍 대표 발표:

  • 김정민 – 쿠버네티스 LMA 벤티 스택 개발기
  • 최정민 – Gin 기반 APM 직접 구현기

기존의 APM/관측 툴(Elastic, Grafana 등)은 라이선스 제한 혹은 복잡도 증가로 인해 직접 구축하는 사례 증가.

  • 오픈소스 도구에 대한 라이선스 회피 필요
  • Go의 성능과 간단한 구조를 활용해 LETDE (로그 DB), 벤티 (시각화 도구), APM 미들웨어 등을 자체 구현

✅ 시사점: "고성능+라이선스 자유로움 → Go로 나만의 운영툴을 만들 수 있는 시대"


📌 3. 성능 최적화는 추상보다 실험이다

📍 대표 발표:

  • 백경준 – 이미지 서버 성능 72% 개선기
  • 이오민 – 차량 OTA 암호화 및 무결성 검증 시스템

기존 시스템을 Go로 마이그레이션하며 단순히 “Go가 빠를 것”이라는 가설보단, 실측, 벤치마킹, 리소스 측정을 통한 개선 사례가 주를 이룸.

  • PHP보다 Go가 느렸던 케이스 → 이미지 리사이즈 라이브러리 교체로 극복
  • 비즈니스 임팩트를 고려한 빠른 개선 범위 설정 → 카나리 배포, 가시적인 수치 개선 (74.7%)

✅ 시사점: "가설 → 실험 → 측정 → 반복의 정석적인 엔지니어링 마인드가 Go 생태계에서 매우 강조됨"


📌 4. Go에서의 설계는 목적 중심의 유연함이 핵심

📍 대표 발표:

  • 변규현 – 서비스 규모별 설계 전략
  • 이오민 – OTA 보안 구현 사례

Go로 대규모 서비스도 충분히 가능한데, 중요한 건 아키텍처를 '상황에 맞게' 설계하는 능력.

  • 작은 기능 → 함수형 스타일, 간단한 패턴으로 빠르게
  • 커지는 구조 → 도메인 주도 설계(Domain-Driven Design), 프레젠터-유즈케이스-도메인-레코더 분리
  • 의존성 분리, 테스트 유연성 확보, 실제 운영에서 적용 가능한 레이어 기반 설계

✅ 시사점: "Go는 단순하되 얕지 않다 – 작을 땐 빠르게, 클 땐 구조적으로 대응 가능"


📌 5. Day 1 발표에서 공통적으로 나타난 가치

키워드 의미 등장 발표
작은 프로젝트의 효율성 빠른 개발, 빠른 배포, 작은 단위 설계 변규현, 백경준
직접 구현의 용기 APM, 로그 DB, 보안 등 시스템을 직접 Go로 개발 김정민, 최정민, 이오민
테스트와 품질 Flaky Test 제거, 의존성 분리, 레이어드 테스트 전략 정겨울, 변규현
정량적 지표 기반 개선 CPU, 메모리, 레이턴시 수치 기반 판단 백경준, 최정민
 

🧠 마무리 한 줄 요약

"Go는 단순하지만 강력하다 – 빠르게 만들고, 명확하게 나누고, 측정하면서 키운다."

2024년의 Go는 단순한 언어가 아니라, 모던 인프라와 운영, MSA, 성능 개선까지 아우르는 실전 개발 언어다.

 

728x90

'컨퍼런스 정리' 카테고리의 다른 글