[TIL]09.03

rbw·2022년 9월 4일
0

TIL

목록 보기
41/97
post-thumbnail

트랜잭션 ?

스냅샷이라는 용어를 잘 몰라 찾아보다가 여기까지 흘러 들어와 버림.,,

이는 하나의 쪼갤 수 없는 작업단위이다.

예를 들어, A 계좌에서 B 계좌로 돈을 입금한다고 할 때, 해당 A,B 계좌의 총합은 같아야하고, 이 작업이 중간에 다른 작업과 겹치거나 하면 오류가 일어날 가능성도 존재한다. 따라서 이 작업을 하나의 단위로 묶고, 다른 스레드에서는 접근을 못하게 막는다.

요약하자면, 하나의 작업 이라고 보면 된다. 쪼갤수도 없고 중간에 개입도 x

정확하지는 않을 수 있슴니다... 그리고 트랜잭션이 블록단위로 묶인게 블록체인 이라는 것도 이번에 처음 알았다 싱기

코드 작성 전에 하면 좋을 것들 - 정하민(뱅크샐러드 ios 개발자)

코드로 표현할 대상(또는 목표)을 몇 줄의 문장으로 표현 해보기

예를 들어, "소비내역중 카페 소비내역을 뽑아내고 소비한 총 금액을 찾아야 겠어"라는 문장일 때

  • 좀 더 명확해 진다. 소비내역을 뽑아내는것, 총 금액을 찾는 것
  • 테스트코드 작성하기가 쉬워짐. 나눠 놓은 2개의 문장을 대변하는 함수를 작성하고 첫번째 함수는 정말 카페 소비내역만 뽑아내는지, 두번째 함수는 총 금액을 잘 계산 하는지에 대한 코드를 작성, 검증이 가능하다

만약 Static 함수만을 필요로 하는 객체를 구현한다면 enum/struct 중 어떤 것이, 달느 엔지니어의 시간을 아껴줄 수 있을까 ?

먼저 결론은 enum 이다. 구조체가 아닌 이유로는 구조체 내부에 static func만 있는 경우, 자동으로 init 함수가 구현되고 자동완성 리스트 상단에 노출된다. 이는 사용하지 않는 대상이 노출되니 번거로움이 늘어난다는 의미이다.

반면 enumstatic func을 선언할 수 있으면서도, init이 없기에, 의도한 static 함수들만 자동완성 리스트에 노출되고, 추가적인 동작없이 바로 함수를 이용할 수 있다.

Escaping Closure 1/2

이를 이해하기에 앞서, 알아두면 좋을것들에 대해 먼저 살펴보겠습니다.

비동기 코드를 쓰는 이유

탈출 클로저가 가장 많이 활용되는 곳은 네트워클를 통해 데이터를 받는 경우입니다. 이때 주로 비동기적으로 작성을 하는데 이는 네트워크에서 데이터를 받아오는 동안 일어날 수 있는 Freezing을 방지하기 위해서입니다.

Scope

전역범위, 지역범위를 생각하면 됩니다. 지역변수가 Scope를 무시하고, 클로저에서 계속 참조되는 것처럼 보이는 경우가 있습니다. 아래 Capturing Values 참고

Capturing Values

클로저는 주변에 있는 변수를 참조할 수 있으며, original scope를 무시한다.

캡처한 변수가 공유되는 경우로는 클래스의 예시가 있다.

class ClosureTest {
    var runningTotal = 0 
    func add(amount: Int) -> () -> Int {
        return {
            self.runningTotal += amount
            return self.runningTotal
        }
    }
}

클래스 하나의 인스턴스에서 함수로 각각 따로 실행해도 값은 공유가 된다. 이유로는 참조타입인 클래스의 변수를 캡처를 헀기 때문이다.

이제 탈출 클로저에 대해서 알아보겠습니다.

Escaping Closure 2/2

"인자로 전달받은 함수 중 함수의 리턴이후에 실행할 수 있는 함수가 탈출 클로저이다. 간단히, 함수의 리턴 이후 실행할 수 있는 함수"

바깥의 변수에 의해서 클로저가 저장되는 경우에 클로저는 탈출할 수 있다. 대표적으로, 비동기 작업을 하는 경우, completion handler로 탈출 클로저를 사용하는 경우가 있다.

작업이 시작되면 함수가 리턴되지만, 클로저는 작업이 끝날때까지 호출 x 그리고 이 클로저를 나중에 호출하기 위해서 escape가 필요하다.

탈출의 의미는, 이제 접근이 불가한 범위에서 탈출을 해서 작업이 끝나면 실행을 하게끔 만들어 준다. 라고 이해를 하면 되지 싶다.

func testEscaping(_ esClosure: @escaping (Int) -> Void) { 
  let urlRequest = URLRequest(url: URL(string: "hello world")!)
  var testCount = 3
	session.dataTask(with: urlRequest) { data, response, error in 
    print("world")
    esClosure(testCount)
  }.resume() 

  print("hello")
} 

위의 예제에서 비동기 함수인 dataTask의 컴플리션 핸들러에서 탈출 클로저를 사용하는 것을 확인할 수 있습니다. 위 함수를 실행하면 hello가 로그에 찍히고 내부 스코프에는 접근이 불가하지만, 비동기 작업인 dataTask가 끝나고 completion handler가 실행되면 내부 로직들이 실행 되는 것을 볼 수 있습니다.


참조

https://onemoonstudio.tistory.com/13

http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98

https://careerly.co.kr/profiles/482375?from=comment

profile
hi there 👋

0개의 댓글