🐾   [golang] context 역할 및 종류

배경

API를 만들다 보면 처음부터 끝까지 ctx echo.Context를 사용한다. 그래서 context가 궁금했다. 그리고 PT 실무에서도 설명을 해주셨다.

Context

  • 애플리케이션 전체 => 코드 전체
  • request에서 response의 맥락을 가지고 있다.

Context의 역할

  • 정보를 담는다 => service에서 사용 , 로그에 남길 애플리케이션 전반에 공통적인 정보(Ex) 서버 정보, Request ID
  • 종료 사인을 보낸다 => context가 취소될 경우 디비 세션이 만료되어 디비처리가 중단된다.

종류

  1. context.Background() , context.TODO()
  • 특별한 기능이 없이 초기화 용로로 사용
  • 내부적으로 둘은 똑같다
  • 두가지만 혼자 context 생성 가능
  1. context.WithValue()
  • 값을 저장
  • 혼자 생성 X => parent context가 있어야 한다.
  • Context를 랩핑 해서 생성할 수 있다
  • key, value는 interface 타입이다.
context.WithValue(ctx, "키", "값")
  1. context.Value()
  • 값을 가져온다
  • 키의 값이 있으면 값을 가져온다
  • 없는 키를 부르면 nil이 온다
  • application scoped value 사용 => ex) request ID : request 하나에 request ID 하나
  • 비즈니스 로직에 영향을 주지 않는 값 ex) 로그
  • 값을 넣을 수 있다고 모든 값을 넣어주면 가독성이 떨어지고 유지보수가 어렵다.
ctx.Value()

좋지 않은 예시

func create(ctx context.Conext) err {
request := ctx.Value("request")
}

create 할 때마다 바디 정보를 안 넣어주고 그냥 contex만 한 다음에 context value로 리퀘스트 값을 넣으면 리퀘스트 값도 불분명하고 key값이 먼지 모른다.

  1. context.WithCancel()
  • 취소 함수를 호출하면 종료 사인을 보낸다.
  1. context.WithTimeout()
  • 특정 시간이 되면 종료된다.
  • 특정 시간이 지나면 종료
  1. context.WithDeadline()
  • 특정 시간이 되면 종료된다.
  • 특정 시간 도달하면 종료

종류 4,5,6번은 따라 다시 한번 정리 하기! 슝~

​ ​ ​