분류 전체보기

(구조패턴) 어댑터패턴
사용 시점 및 이유 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때 새로운 클래스를 기존 인터페이스에 맞추고 싶을 때 패턴 구현 Target Interface에 Adaptee 를 맞추기 위해 Adapter에서 멤버 필드로 Adaptee를 가진다. targetMethod() 실행시 Adaptee클래스에서 해야 할 행동을 구현해 준다.

(생성패턴) 프로토타입 패턴
사용 시점 및 이유 인스턴스의 생성과 값 초기화가 복잡할때 반복되는 생성과 초기화 코드가 많아질 때 패턴 구현 clone()을 지원할 클래스는 Prototype인터페이스를 구현한다. 구상 클래스에서는 clone() 을 오버라이딩 하며 return new ConcreteProtoType1(this) 와 같이 구현한다. 필요한 경우 프로토타입 사용할 구상 인스턴스들을 미리 저장소에 저장해둔 후, 클론하며 사용하는 방식으로도 구현이 가능하다. 자바의 경우 이미 Cloneable인터페이스와, Object.clone() 메소드가 존재한다.

(생성 패턴) 팩토리 메소드 패턴
사용시점 및 이유 생성할 구상 클래스를 예상할 수 없을 때 어떤 구상 클래스를 사용하는지에 대해서 캡슐화 하고 싶을 때 패턴 구현 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 ..