SwiftUI

TCA(3) : _printChanges

Phililip
728x90

안녕하세요.

 

이번에는 TCA로 디버깅하는 방법에 대해 알아볼게요.

(TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!)

 


 

__printChanges() 함수를 사용하면 콘솔 로그에서 State 값이 어떻게 바뀌고 있는지 한눈에 볼 수 있으며, 어떤 Action이 발생했는지와 내부에서 어떤 Action이 전달되고 있는지를 확인할 수 있습니다.

 

참고로 __printChanges는 Debug Configuration 일 때만 로그를 남기므로, #if DEBUG로 분기처리를 할 필요가 없습니다 :)

 

 

 

__printChanges는 크게 2군데에서 사용할 수 있으며, 기능에 약간의 차이점이 있습니다.

  • Reducer
  • WithViewStore

 

Reducer에서 __printChanges 함수를 사용할 경우, Reducer로 전달된 Action과 그로 인해 변경된 State에 대한 로그를 남깁니다.

 

WithViewStore에서 __printChanges 함수를 사용할 경우, 변경된 State로 인해 뷰가 다시 그려질 때 로그를 남깁니다.

 

 

 

뭔 말인지 잘 모르겠죠..? 간단한 예시를 만들어볼게요.

 

'Increase Count' 버튼을 누르면 화면의 Count가 1 증가하고 'Inner Action' 버튼을 누르면 State에는 영향을 주지 않으며 Reducer로 Action만 전달할 뿐인 View와 Reducer를 만들었어요.

 

 

Reducer에 __printChanges 함수를 추가하고 'Increase Count', 'Inner Action' 버튼을 순서대로 눌러봤어요.

 

 

 

Reducer가 어떤 Action을 받았고, 그로 인해 State가 어떻게 바뀌었는지(아님 바뀌지 않았는지)를 한눈에 알 수 있어요.

 

 

반대로, WithViewStore에 __printChanges 함수를 추가하면

 

 

 

View가 그려질(computed) 때만 로그를 남기며, View에 영향을 주지 않는(정확하게는 State에 변경이 없는) 동작에 대해서는 로그를 남기지 않습니다.

(첫 화면이 그려질 때와 'Increase Action' 버튼을 누를 때만 로그를 남기며, 'Inner Action' 버튼을 눌렀을 때에는 로그를 남기지 않는 것을 확인할 수 있습니다.)

 

 

이 둘의 차이점을 확실히 알고 사용하면 좋겠죠??

 

 

# 요약

- Reducer의 __printChanges는 Action 변경사항 기반으로 로그를 남긴다.
- WithViewStore의 __printChanges는 State 변경사항 기반으로 로그를 남긴다.
- __printChanges는 Debug Configuration 일 때만 로그를 남긴다.

 

 

# 참고

- https://github.com/pointfreeco/swift-composable-architecture

 


이번 글은 여기서 마무리.

 

 

 

반응형