티스토리 뷰
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다.
통합 검색 기능을 정의하기 위해 SearchService 인터페이스를 작성하고
DB를 이용한 DBSearchService 클래스를 구현하였다.
게시글의 개수가 빠르게 증가하면서 SQL의 검색 속도 성능에 문제가 발생했다고 해보자.
검색 속도의 문제를 해결하기 위해 Tolr라는 오픈 소스 검색 서버를 도입하기로 결정했다.
TolrClient가 제공하는 인터페이스와 SearchService 인터페이스가 맞지 않는다는 게 문제다.
WebSearchRequestHandler 클래스를 비롯해서 여러 클래스가 SearchService를 사용하도록 만들어졌기 때문에, SearchService 대신 TolrClient를 사용하도록 변경하려면 많은 수고를 요구한다.
어댑터 패턴은 이렇게 클라이언트가 요구하는 인터페이스와 재사용하려는 모듈의 인터페이스가 일치하지 않을 때 사용할 수 있는 패턴이다.
인터페이스가 맞지 않는 문제를 해결하기 위해 어댑터 패턴을 적용하면 다음과 같은 구조를 갖는다.
어댑터에 해당하는 SearchServiceTolrAdapter 클래스는 TolrClient를 SearchService 인터페이스에 맞춰주는 책임을 갖는다.
SearchServiceTolrAdapter의 search() 메서드는 아래 코드와 같이 TolrClient 객체를 실행하고 그 결과를 SearchService 인터페이스에 맞는 리턴 타입으로 변환해 준다.
public class SearchServiceTolrAdapter implements SearchService {
private TolrClient tolrClient = new TolrClient();
public SearchResult search(String keyword) {
// keyword를 tolrClient가 요구하는 형식으로 변환
TolrQuery tolrQuery = new TolrQuery(keyword);
// TolrClient 기능 실행
QueryResponse response = tolrClient.query(tolrQuery);
// TolrClient의 결과를 SearchResult로 변환
SearchResult result = convertToResult(response);
return result;
}
private SearchResult convertToResult(QueryResponse response) {
List<TolrDocument> tolrDocs =
response.getDocumentList().getDocuments();
List<SearchDocument> docs = new ArrayList<>();
for(TolrDocument tolrDoc : tolrDocs) {
docs.add(new SearchDocument(tolrDoc.getId(), ...));
}
return new SearchResult(docs);
}
}
SearchServiceTolrAdapter 클래스는 SearchService 인터페이스를 구현하고 있으므로, 클라이언트 코드는 수정 없이 DB 기반 통합 검색에서 TolrClient를 이용한 통합 검색으로 구현을 변경할 수 있게 된다.
어댑터 패턴이 적용된 예는 slf4j라는 로깅 API이다.
어댑터 패턴은 개방 폐쇄 원칙을 따를 수 있도록 도와준다.
상속을 이용해서 어댑터를 구현하는 경우, 어댑터 클래스의 메서드는 상위 클래스에 정의된 메서드를 호출하는 방식으로 코드를 작성하게 된다.
클라이언트가 사용하는 SearchService가 인터페이스가 아닌 일부 구현이 포함된 추상 클래스라면, 자바와 같이 클래스 단일 상속만을 지원하는 언어에서는 클래스 상속을 이용한 어댑터 구현에 제약을 받게 된다.
'JAVA > 디자인 패턴' 카테고리의 다른 글
파사드(Facade) 패턴 (0) | 2022.03.05 |
---|---|
옵저버(Observer) 패턴 (0) | 2022.03.03 |
프록시(proxy) 패턴 (0) | 2022.03.01 |
데코레이터(Decorator) 패턴 (0) | 2022.03.01 |
상태(State) 패턴 (0) | 2022.03.01 |
- Total
- Today
- Yesterday
- node.js
- 프로그래머스
- Olympiad
- Java
- 클린 아키텍처
- 클린 코드
- Spring Boot
- 이펙티브 자바
- 디자인패턴
- 알고리즘
- kotest
- 코테
- MSA
- C++
- 백준
- Effective Java
- BOJ
- Algorithm
- 정규표현식
- BAEKJOON
- Kotlin
- Spring
- 테라폼
- 이팩티브 자바
- JPA
- kkoon9
- programmers
- 디자인 패턴
- AWS
- 객체지향
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |