Spring
스프링이 사랑한 디자인 패턴
코딩 코딩 코오딩
2023. 12. 29. 12:16
어댑터 패턴
- 어댑터를 번역하면 변환기라고 할 수 있다.
- 변환기의 역할은 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다.
- 주변에서 가장 흔히 볼 수 있는 변환기로는 충전기가 있다.
- 휴대폰 충전기의 경우 휴대폰을 직접 전원 콘센트에 연결할 수 없기 때문에 충전기가 핸드폰과 전원 콘센트 사이에서 둘을 연결해주는 변환기의 역할을 수행한다.
- 데이터베이스 관련 프로그램을 작성해 본 독자라면 다양한 데이터베이스 시스템을 공통의 인터페이스 ODBC 또는 JDBC를 이용해 조작할 수 있다는 사실을 알고 있다.
즉, 어댑터 패턴은 합성, 즉 객체를 속성으로 만들어서 참조하는 디자인 패턴으로, 한 문장으로 정리하면 다음과 같다.
호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴이다.
프록시 패턴
프록시는 대리자, 대변인이라는 뜻을 가진 단어다.
대리자/ 대변인이라고 하면 다른 누군가를 대신해 그 역할을 수행하는 존재를 말한다.
프록시 패턴의 포인트
- 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
- 대리자는 실제 서비스에 대한 참조 변수를 갖는다.(합성)
- 대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
- 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.
제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴 이다
프록시 패턴은 개방 패쇄 원칙과 의존 역정 원칙이 적용된 설계 패턴이다.
- 데코레이터 패턴
- 데코레이터는 도장/도배업자를 의미한다.
- 데코레이터 패턴이 원본에 장식을 더하는 패턴이다.
- 데코레이터 패턴은 프록시 패턴과 구현 방법이 같다.
- 다만, 프록시 패턴은 클라이언트가 최종적으로 돌려 받는 반환값을 조작하지 않고 그대로 전달하는 반면, 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입한다.
프록시 패턴 : 제어의 흐름을 변경하거나 별도의 로직을 처리를 목적으로 한다. 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경하지 않는다.
데코레이터 패턴 : 클라이언트가 받는 반환값에 장식을 더한다.
1. 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
2. 장식자는 실제 서비스에 대한 참조 변수를 갖는다.
3. 장식자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고, 그 반환값에 장식을 더해 클라이언트에게 돌려준다.
4. 장식자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.
장식자라는 이름에서 느껴지듯 실제 서비스의 반환 값을 예쁘게 포장하는 패턴이 데코레이터 패턴이다.
메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴
데코레이터 패턴이 프록시 패턴과 동일한 구조를 갖기에 데코레이터 패턴도 개방 패쇄 원칙과 의존 역전 원칙이 적용된 설계 패턴임을 알 수 있다.
- 싱글톤 패턴
- 싱글톤 패턴이란 인스턴스를 하나만 만들어서 사용하기 위한 패턴이다.
- 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러개 만들게 되며 불필요한 자원을 사용하게 되고, 또 프로그램이 예상치 못한 결과를 낳을 수 있다.
- 싱글톤 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.
- 싱글톤 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다.
- 구현 방법
- new 를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.
- 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
- 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.
아래와 같은 예제 코드로 실행을 할 수 있다.
`public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance() {
if (instance == null){
instance = new Singleton();
}
return instance;
}
}`
이렇게 만들어진 싱글톤 객체는 한번 생성이 되게 되었을 때 다시 사용되면서 불필요한 자원의 사용을 막을 수 있다.
- 주의점
다만, 싱글톤 패턴의 경우 공유 객체로 사용이 되기 때문에 참조 변수가 변경한 단일 객체의 속성이 다른 참조 변수에 영향을 미친다.
따라서, 이는 전역/공유 변수를 가능한 사용하지 말라는 지침과 일맥상통하다.
정리를 해보자면,
1. private 생성자를 갖는다.
2. 단일 객체 참조 변수를 정적 속성으로 갖는다.
3. 단일 객체 참조 변수가 참조하는 단일 객체를 반환하는 getInstance() 정적 메서드를 갖는다.
4. 단일 객체는 쓰기 가능한 속성을 갖지 않는 것이 정석이다.
싱글톤 패턴을 한 문장으로 정리하면,
"클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴이다."
- 템플릿 메서드 패턴
- 탬플릿 매서드 패턴은 중복되는 코드에 대한 고민이 생기게 되었을 때 이것을 해결하기 위해 나온 디자인 패턴이다.
- 이런한 탬플릿 매서드 패턴은 동일한 부분이 있는 중복은 상위 클래스에 구현을 하고 달라지는 부분만 하위 클래스로 분할을 하는 방법으로 구현이 가능하다.
- 상위 클래스에 공통 로직을 수행하는 템플릿 매서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩이 가능한 메서드를 두는 패턴을 탬플릿 메서드 패턴이라한다.
"상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴"
템플릿 매서드 패턴은 의존 역전 원칙(DIP) 을 활용하고 있다.
반응형