전체 글

전체 글

    (생성 패턴) 팩토리 메소드 패턴

    사용시점 및 이유 생성할 구상 클래스를 예상할 수 없을 때 어떤 구상 클래스를 사용하는지에 대해서 캡슐화 하고 싶을 때 패턴 구현 Creator에서는 실제 생성할 구상 Product에 대해 자식 클래스에게 위임한다.

    (생성패턴) 빌더패턴

    사용 시점 및 이유 복합 객체의 생성 방식을 캡슐화 하고 싶을 때 복합 객체의 생성 알고리즘과, 내부 각각 객체의 구성객체가 독립적일 때 복합 객체의 생성 부분을 단순화 시키고 싶을 때 패턴 구현 Director는 Builder가 제공해주는 메소드를 이용해 Product를 어느 일련의 과정으로 생성할지 정의한다. Builder를 구현한 ConcreteBuilder들은 각 스텝(혹은 부품) 마다 어떤 구현체를사용하고 어떻게 적용하는지에 대해 정의한다. 마지막으로 getProduct()를 통해 완성된 객체를 리턴한다.

    (생성 패턴)추상 팩토리 패턴

    사용 시점 및 이유 인스턴스를 생성하고 복합하는 부분과 인스턴스를 사용하는 부분을 분리할 때 제품군(일련의 관련 클래스)를 생성하는데 있어 다른 제품군으로 대체될 가능성이 있을 때 관련 클래스들이 함께 사용하도록 설계 되었을 때 패턴 구현 팩토리 인터페이스가 있고, 그것을 구현하는 실제 구현체가 있다. 구상 클래스 생성 일련의 과정은 팩토리 클래스 내부에 캡슐화 되어 있다. 클라이언트는 인터페이스를 통해 구상 클래스(집합)을 생성한다. 추가 적인 클래스가 필요하다면, 팩토리 인터페이스를 구현하여 생성하도록 한다. Context 는 AbstractFactory 구현체를 받는다. Context#create 메소드는 factory의 createProduct(), createItem()을 이용해 필요한 구상 클..

    Http keep alive 란

    Http1.0 이후 클라이언트와 서버 간 요청과 응답을 어떻게 하면 좀 더 빨리 할 수 있을지에 대한 연구가 이루어졌다. 기존에는 Http 요청때마다 TCP연결을 3-way handshake방식으로 맺어야 했다. 하지만 시대가 변함에 따라 클라이언트와 서버간 http요청의 수는 증가하여 handShaking의 오버헤드에 대한 고민이 있었고, 그에 따라 Persistent Connection이 등장하게 되었다. Persistent Connection Http에서 Persistent Connection이란 Http 어플리케이션이 TCP connection을 요청마다 close 하지 않고 유지하는 것을 Persistent Connection 이라 한다. Persistent Connection이 필요한 이유 P..

    SwiftUI onDelete 수정자 사용

    List 아이템 드래그해서 삭제 처리 List { ForEach(listItems, id: \.id) { item in Text(item.name) } .onDelete(perform: removeItems) } SwiftUI 의 List 아이템에 제거로직을 추가 하려면 ForEach에 onDelete 수정자를 추가하면 된다. onDelete에 perform파라미터로 받는 메소드는 IndexSet을 메소드로 넘겨준다. IndexSet 이용하여 리스트 핸들링 func removeItems(at offsets: IndexSet) { let removedItems = offsets.map {listItems[$0]} for item in removedItems { api.deleteItem(item.id) }..

    SwiftUI ViewBuilder란

    애플 문서를 보면 "뷰를 클로저로 구성할때 붙히는 커스텀 파라미터 애트리뷰트" 라고 정의 되어 있다. 전혀 이해가 가질 않는다.. view() 함수는 some View 로 opaque Type을 리턴한다. opaque type이므로 함수 내부에서 어떤 타입을 리턴하는지 결정 해야 하는데, Text와 VStack 은 공통타입이 아니다. AnyView 로 감싸 모든 케이스에 대해 AnyView를 리턴하도록 하면 오류는 사라진다. 더 좋은 방법은 ViewBuilder를 사용하는 것이다. ViewBuilder는 return statement 를 갖지 않는다.

    Swift some 키워드

    Generic Type & Opaque Type some 키워드는 opaque type에 대해 사용한다. opaque 타입은 역 제네릭 타입(reverse generic type) 이라고도 불린다. Generic 타입은 구체적인 타입이 무엇인지를 사용하는 호출자 측에서 결정한다. Opaque 타입은 구체적인 타입을 피호출자, 즉 함수 내부에서 결정하고, 함수를 사용하는 호출자는 어떤 타입인지 알 수 없다. class에는 Generic파라미터를 사용할 수 있지만, 프로토콜에서는 사용할 수 없다. protocol GiftBox { associatedtype giftType var gift: giftType { get } } protocol 에서는 associatedType으로 지정한다. associatedt..

    macos ventura 업데이트 후 ssh 오류

    ~~~~~~ no matching host key type found. Their offer: ssh-rsa,ssh-dss 위와 같은 메세지가 출력 된다. /etc/ssh/ssh_config 파일을 수정한다. sudo vi /etc/ssh/ssh_config 최 하단으로 가서 수정한다. ~~~~~~~~ Host * # 기존에 있는 부분 SendEnv LANG LC_* # 기존에 있는 부분 HostkeyAlgorithms ssh-dss,ssh-rsa # 추가 KexAlgorithms +diffie-hellman-group1-sha1 # 추가 저장 후, ssh 로 다시 접근 요청 시 ssh 키가 변경되었다는 메세지와 함께 접근이 안된다. ssh의 known_hosts 에 기존에 저장되어 있는 rsa key ..

    Swift GCD

    GCD: Grand Central Dispatch 멀티코어 시스템에서 concurrent 실행을 제공하는 프로그래밍 언어 요소 DispatchQueue 는 Swift 의 GCD 중 하나이다. Serial, Concurrent Serial 큐에 추가된 순서대로 한번에 하나의 task를 실행한다. DispatchQueue("myLabel") Concurrent 운영체제는 DispatchQueue에서 꺼낸 현재 작업이 끝나지 않더라도, 다음 작업을 다른 스레드에 할당시켜 실행한다. DispatchQueue(label: "", attributes: .concurrent) DispatchQueue (Main, Global, Custom) Main dispatch Queue(DispatchQueue.main) 앱의..

    ObservableObject 와 Codable 같이 사용하기

    ObservableObject 와 Codable을 같이 채택하면 오류가 발생 한다. Type 'TodoItem' does not conform to protocol 'Decodable' Type 'TodoItem' does not conform to protocol 'Encodable' @Published 프로퍼티 래퍼를 사용하면 Published 로 래핑되는데, 해당 래퍼는 Codable을 채택하고 있지 않다. 따라서 Codable을 채택하도록 extension을 적용한다. //PublishedWrapper라는 클래스를 선언 후, Published형 타입을 받아 @Published에 저장한다. private class PublishedWrapper { @Published private(set) var ..