괴발개발 성장기

Study/Go 언어

[golang] context 역할 및 종류

지니유 2022. 10. 12. 21:08
반응형

 

# 배경

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

# Context

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

# Context의 역할

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

# 종류

1) context.Background() , context.TODO()

  • 특별한 기능이 없이 초기화 용로로 사용
  • 내부적으로 둘은 똑같다
  • 두가지만 혼자 context 생성 가능

2) context.WithValue()

  • 값을 저장
  • 혼자 생성 X => parent context가 있어야 한다.
  • Context를 랩핑 해서 생성할 수 있다
  • key, value는 interface 타입이다.
context.WithValue(ctx, "키", "값")

예시

ctx := context.Background()
ctx = context.WithValue(ctx, "key", "value")
fmt.Println(ctx.Value("key")) //value
fmt.Println(ctx.Value("no"))  // <nil>

3) 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값이 먼지 모른다.

4) context.WithCancel()

  • 취소 함수를 호출하면 종료 사인을 보낸다.

5) context.WithTimeout()

  • 특정 시간이 되면 종료된다.
  • 특정 시간이 지나면 종료

6) context.WithDeadline()

  • 특정 시간이 되면 종료된다.
  • 특정 시간 도달하면 종료

 

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

 

 

반응형