반응형
# 배경
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번은 따라 다시 한번 정리 하기! 슝~
반응형
'Study > Go 언어' 카테고리의 다른 글
[Golang] context.WithTimeout과 context.WithDeadline (0) | 2022.11.03 |
---|---|
[golang] context.WithCancel() 사용법 (0) | 2022.10.13 |
[golang] 고루틴 주의 사항 (2) | 2022.10.11 |
[golang] 고루틴이 끝나기 전에 main이 끝나는 문제 해결 방법 (0) | 2022.10.10 |
[golang] 고루틴(goroutine) 기본 문법 (0) | 2022.10.09 |