---
id: 149c0672eec2caba57477612564e9368
author: Lemon Mint
title: 'Go 1.24 릴리스 개요: Swiss Table 맵, ML-KEM, os.Root, 그리고 testing/synctest'
description: 'Go 1.24의 기술 개요: Swiss Table 기반 내장 맵, crypto/mlkem (FIPS 203), TLS Encrypted Client Hello, runtime.AddCleanup, os.Root, 그리고 testing/synctest.'
language: ko
date: 2024-12-20T00:23:21.60729Z
path: /blog/posts/whats-new-in-go-1-24-z83ff24d2
category: release
---

Go 1.24는 성능, 보안, 그리고 개발자 경험에 초점을 맞춘 다양한 개선 사항을 도입하며 중요한 릴리스가 될 것으로 보입니다. 이러한 변경 사항은 Go를 현대 애플리케이션 구축에 있어 더욱 강력하고 효율적으로 만드는 것을 목표로 합니다.

## 성능 향상

대표적인 벤치마크 모음 전반에서 CPU 오버헤드가 2~3% 감소하는 일반적인 성능 개선이 이루어졌습니다. 이러한 개선에는 새로운 내장 맵 구현, 작은 객체의 더 효율적인 메모리 할당, 그리고 새로운 런타임 내부 뮤텍스 구현이 포함됩니다. 결과는 애플리케이션에 따라 다를 수 있습니다.

## 포스트 양자 암호

`crypto/mlkem` 패키지가 도입되어 ML-KEM-768과 ML-KEM-1024를 구현합니다. ML-KEM은 이전에 Kyber로 알려졌으며 FIPS 203에 명시된 포스트 양자 키 교환 메커니즘입니다. 이 추가 기능은 암호 보안의 미래에 대비하기 위한 Go의 준비를 의미합니다.

## TLS 개선

TLS에서 Encrypted Client Hello(ECH)를 지원합니다. 이 기능은 `Config.EncryptedClientHelloKeys` 필드를 채워서 활성화할 수 있으며, TLS 연결의 프라이버시와 보안을 강화합니다.

## 새로운 Swiss Table 맵

더 나은 성능을 위한 향상된 맵 구현입니다. 이 새로운 구현은 Swiss Table을 기반으로 하며, `GOEXPERIMENT=noswissmap` 빌드 플래그로 비활성화할 수 있습니다.

## Sync Map 업데이트

`sync.Map`의 맵 수정 성능이 향상되었습니다. 더 큰 맵에서 서로 겹치지 않는 키 집합을 수정할 때 경합이 발생할 가능성이 크게 줄어들었으며, 맵에서 낮은 경합 로드를 달성하기 위해 더 이상 점진적 준비 시간(ramp-up time)이 필요하지 않습니다. 문제가 발생하면 `GOEXPERIMENT=nosynchashtriemap`을 사용하여 이전 구현으로 되돌릴 수 있습니다.

## 향상된 JSON 마샬링

JSON 마샬링 시 더 스마트한 구조체 필드 생략을 위한 새로운 `omitempty` 태그 옵션이 추가되었습니다. 마샬링할 때 `omitempty` 옵션이 지정된 구조체 필드는 해당 값이 제로 값인 경우 생략됩니다. 필드 타입에 `IsZero() bool` 메서드가 있으면, 값이 제로 값인지 판단하는 데 해당 메서드가 사용됩니다.

## 런타임 정리

리소스 관리를 개선하기 위해 `SetFinalizer`를 대체하는 `AddCleanup` 함수가 도입되었습니다. `SetFinalizer`와 달리, 연결된 객체를 파이널라이제이션을 위해 되살리지 않으며, 하나의 객체에 여러 개의 cleanup을 연결할 수 있습니다. 새로운 코드에서는 `SetFinalizer`보다 `AddCleanup`을 사용하는 것이 좋습니다.

## go.mod의 도구 지시자

`go.mod`의 tool 지시자를 사용하여 실행 파일 의존성 추적이 개선되었습니다. 이로써 이전에 “tools.go”라는 관례적 이름의 파일에 도구를 blank import로 추가하던 우회 방법이 더 이상 필요하지 않습니다.

## 디렉터리 제한 접근

제어된 파일 시스템 작업을 위한 새로운 `os.Root` 타입이 추가되었습니다. `os.Root` 타입은 특정 디렉터리 내에서 파일 시스템 작업을 수행할 수 있게 하며, 지정된 경로 외부로의 접근을 방지합니다.

## 테스트 개선

동시성 코드 테스트를 위한 새로운 `testing/synctest` 패키지가 추가되었습니다. `synctest.Run` 함수는 격리된 “bubble” 안에서 고루틴 그룹을 시작하고, `synctest.Wait` 함수는 현재 bubble의 모든 고루틴이 블록될 때까지 기다립니다. 이 패키지는 실험적이며, 빌드 시 `GOEXPERIMENT=synctest`를 설정하여 활성화해야 합니다.

## 빌드 캐시

`go run` 실행 파일이 이제 더 빠른 실행을 위해 캐시됩니다. 이로써 반복 실행 속도가 빨라지는 대신 캐시 크기가 커집니다.

## Cgo 성능

Cgo 성능 향상을 위한 새로운 `#cgo noescape` 및 `#cgo nocallback` 주석이 추가되었습니다. `#cgo noescape cFunctionName`은 C 함수에 전달된 메모리가 이스케이프되지 않음을 컴파일러에 알립니다. `#cgo nocallback cFunctionName`은 C 함수가 어떠한 Go 함수도 다시 호출하지 않음을 컴파일러에 알립니다.

## 약한 포인터

메모리 회수를 방해하지 않으면서 메모리를 안전하게 참조할 수 있도록 약한 포인터(weak pointer)를 지원합니다. 약한 포인터는 값을 연결하기 위한 약한 맵, 정규화 맵, 다양한 종류의 캐시와 같은 메모리 효율적인 구조의 생성을 가능하게 하기 위해 제공되는 저수준 기본 요소입니다.

## 벤치마크 개선

더 빠르고 오류 가능성이 적은 벤치마크를 위한 새로운 `testing.B.Loop` 메서드가 추가되었습니다. 벤치마크 함수는 `-count`마다 정확히 한 번 실행되므로, 비용이 많이 드는 설정 및 정리 단계가 한 번만 실행됩니다. 함수 호출 매개변수와 결과는 계속 유지되어, 컴파일러가 루프 본문을 완전히 최적화하여 제거하는 것을 방지합니다.

Go 1.24는 언어와 생태계의 다양한 측면에서 상당한 개선을 제공하는 중요한 릴리스가 될 것으로 보입니다.

![Overview of Go 1.24](/assets/images/whats-new-in-go1.24/overview.webp)
