본문 바로가기
가치관 쌓기/개발 돌아보기

스프링에서 제공하는 XXTemplate 은 무엇일까? (RestTemplate, JdbcTemplate, TransactionTemplate, HibernateTemplate, SqlSessionTemplate...)

by simplify-len 2024. 11. 8.

인프런의 토비 스프링 강의 일부 내용을 좀더 딥다이브한 내용입니다.

Template 이란 무엇일까?

 템플릿이란 어떤 목적을 위해 미리 만들어둔 모양이 있는 틀. 고정된 틀 안에 바꿀 수 있는 부분을 넣어서 사용하도록 만들어진 오브젝트입니다. 우리가 아는 템플릿 메소드 패턴또한 템플릿을 사용합니다.

템플릿 메소드 패턴이란?
템플릿 메소드 패턴은 고정된 틀의 로직을 가진 템플릿 메소드를 슈퍼클래스에 두고, 바뀌는 부분을 서브클래스의 메소드에 두는 구조로 이뤄진다.

 스프링에서 제공하는 `XXTemplate`은 특정 프로세스의 공통 부분을 재사용하면서, 세부적으로 다른 로직을 쉽게 확장할 수 있도록 지원하는 클래스입니다. 이 클래스는 Template 메서드 패턴을 활용하여 변경되는 부분과 고정된 부분을 분리해 줍니다.

대표적으로 자주 만날 수 있는 Template 중 하나는 RestTemplate 가 있습니다.

RestTemplate 이란? HTTP API 요청을 처리하는 템플릿으로 2가지 핵심 기능을 가지고 있습니다.
- HTTP Client 라이브러리를 확장하는 ClientHttpRequestFactory
- Message Body 를 변환하는 전략을 가진 HttpMessageConverter

 

RestTemplate 은 API 통신시 변하는 부분과 변하지 않는 부분을 분리하여 HTTP Client 라이브러리를 확장, Message Body 를 변환하는 전략을 활용할 수 있습니다.

그래서 HTTP Client 라이브러리와 응답으로 돌아오는 것을 손쉽게 변경할 수 있습니다.

RestTemplate이 제공하는 HttpClient 기술은 ClientHttpRequestFactory 를 상속받습니다. 그래서, JdkClientHttpRequestFactory, 

RestTemplate template = new RestTemplate();

Default Http 라이브러리를 코드속에서 찾아보면

RestTemplate > InterceptingHttpAccessor > HttpAccessor > requestFactory

Default 는 SimpleClienthttpRequest 라는 사실을 알 수 있다.  SimpleClienthttpRequest은 우리가 흔하게 사용하는 Connection 을 생성하여 연결하는 방법입니다.

public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
    HttpURLConnection connection = this.openConnection(uri.toURL(), this.proxy);
    this.prepareConnection(connection, httpMethod.name());
    return new SimpleClientHttpRequest(connection, this.chunkSize);
}

만약 SimpleClienthttpRequest 가 아닌 다른 HTTP 라이브러리를 사용하고 싶다면?

아래와 같이 사용할 수 있습니다.

new RestTemplate(new JdkClientHttpRequestFactory());

 

다시 제목으로 돌아와서 '스프링에서 제공하는 XXTemplate 은 무엇일까?'

RestTemplate 에서 생성자에 제공하는 ClientHttpRequestFactory, HttpMessageConverter 은 변할 수 있는 부분이고, 변하지 않는 부분은 RestTemplate 안에 감춰지게 됩니다. 

 

 

댓글