Backend
home
🈹

변하지 않는 코드 분리하기 - 메소드 추출 (템플릿의 탄생)

생성일
2025/01/24 05:52
태그
템플릿(Template)
템플릿은 어떤 목적을 위해 미리 만들어둔 모양이 있는 틀.
고정된 틀 안에 바꿀 수 있는 부분을 넣어서 사용하도록 만들어진 오브젝트.
템플릿 메소드 패턴도 템플릿을 사용.
템플릿 메소드 패턴?
템플릿 메소드 패턴은 고정된 틀의 로직을 가진 템플릿 메소드를 슈퍼클래스에 두고, 바뀌는 부분을 서브클래스의 메소드에 두는 구조로 이루어진다.
메소드 추출 후 코드
package tobyspring.hellospring.exrate; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import tobyspring.hellospring.payment.ExRateProvider; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.util.stream.Collectors; public class WebApiExRateProvider implements ExRateProvider { @Override public BigDecimal getExRate(String currency) { String url = "https://open.er-api.com/v6/latest/" + currency; return runApiForExRate(url); } private static BigDecimal runApiForExRate(String url) { URI uri; // URL -> URI 변경 try { uri = new URI(url); } catch (URISyntaxException e) { throw new RuntimeException(e); } String response; try { response = executeApi(uri); } catch (IOException e) { throw new RuntimeException(e); } // build gradle에서 의존성 추가 // 'com.fasterxml.jackson.core:jackson-databind:2.12.5' try { return extractExRate(response); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } private static BigDecimal extractExRate(String response) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); ExRateData data = mapper.readValue(response, ExRateData.class); return data.rates().get("KRW"); } private static String executeApi(URI uri) throws IOException { String response; HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection(); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { response = br.lines().collect(Collectors.joining()); } return response; } }
Java
복사