Go context에 사용자와 설정을 모두 넣으면 함수 인자를 줄일 수 있나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
context는 취소·deadline과 요청 범위 값을 전달하는 수단이지 모든 의존성을 숨기는 전역 저장소가 아닙니다. 함수 동작에 필수인 설정과 저장소는 명시적 인자나 객체 의존성으로 두는 편이 계약을 드러냅니다.
동작 원리와 전제
요청 ID 같은 메타데이터는 값으로 전달할 수 있지만 문자열 키가 충돌하거나 타입 단언이 실패하는 경로를 고려합니다. context는 복사된 불변 값 연결처럼 사용하고 가변 객체를 넣었다고 그 객체가 thread-safe해지지 않습니다.
선택과 실패 처리
상위 취소를 잃지 않게 하위 작업에 전달하고 context.Background로 무조건 바꾸지 않습니다. 요청 후에도 살아야 할 작업은 별도 내구 작업으로 소유권·기한을 정합니다. context 값에 토큰·큰 payload를 불필요하게 넣으면 누출·수명 연장이 생깁니다.
구체적인 사례와 검증
인증 미들웨어가 사용자 정보를 넣었다고 모든 호출자가 그 값의 존재를 보장받는 것은 아닙니다. 내부 배치나 테스트가 다른 진입 경로를 사용할 수 있어 필요한 값의 검사와 기본 동작을 정의합니다. 권한 검사는 context의 문자열 하나보다 검증된 주체와 대상 관계를 사용합니다. 요청이 끝난 뒤 저장한 context가 큰 객체를 계속 참조하면 메모리 수명이 늘 수 있습니다. 함수의 필수 의존성을 context에서 꺼내면 코드만 읽어 입력 계약을 알기 어려워지므로 명시적인 인자와 요청 메타데이터를 나눕니다. cancellation을 받는 하위 라이브러리가 실제로 중단을 지원하는지도 실행 결과로 확인합니다.
취소·값 누락·잘못된 타입·비동기 작업 수명을 시험합니다. context를 struct에 장기 보관하기보다 호출 범위에 맞춰 사용합니다. 편리한 인자 축소가 숨은 의존성과 테스트 비용을 키우지 않는지 확인하겠습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 핵심 구분: context는 취소·deadline과 요청 범위 값을 전달하는 수단이지 모든 의존성을 숨기는 전역 저장소가 아닙니다.
- 선택 조건: 상위 취소를 잃지 않게 하위 작업에 전달하고 context.Background로 무조건 바꾸지 않습니다.
- 검증 기준: 취소·값 누락·잘못된 타입·비동기 작업 수명을 시험합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- context에 넣은 가변 값이 자동으로 요청별 복사·동기화된다고 한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 상위 요청이 끝났는데 고루틴이 남으면 정상 대기와 누수를 어떻게 구분하나요?
- 시간·외부 API·저장소의 실패를 테스트에서 통제할 때 어떤 좁은 계약을 주입하나요?
- 상위 응답이 timeout된 뒤에도 하위 작업이 남는다면 취소 요청과 실제 종료를 어떻게 확인하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.