반응형
스프링 프레임워크에서 익명 클래스를 활용하는 사례를 알아보자
📌 서론
스프링은 Java 기반의 엔터프라이즈 애플리케이션 개발을 위한 강력한 도구로, 다양한 방식으로 익명 클래스를 활용하여 애플리케이션의 유연성과 재사용성을 높일 수 있다.
익명 클래스에 대한 기본적인 이해는 아래의 글을 보는것을 추천한다.👇🏻👇🏻
1. 익명 클래스 사용예시
RestTemplate과 커스텀 ResponseErrorHandler구현
- 스프링 부트 애플리케이션에서 RestTemplate의 에러 핸들링을 커스터마이징하기 위해 익명 클래스를 사용할 수 있다.
- 이 구성에서 RestTemplate에 대한 ResponseErrorHandler는 익명 클래스를 사용하여 정의된다. 이 방법을 통해 HTTP 응답에 대한 커스텀 에러 처리 로직을 구현할 수 있다.
@Configuration
public class RestClientConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
// 여기에 커스텀 에러 조건 로직을 구현
return response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR
|| response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 여기에 에러 처리 로직을 구현
if (response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
// 서버 에러 처리
} else if (response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
// 클라이언트 에러 처리
if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
throw new NotFoundException();
}
}
}
});
return restTemplate;
}
}
익명 클래스는 여기서 new ResponseErrorHandler() 부분에 구현되어 있다.
- 이 익명 클래스는 new ResponseErrorHandler()를 통해 직접 선언되고 인스턴스화된다. 클래스 내에서는 ResponseErrorHandler 인터페이스의 hasError와 handleError 메서드를 오버라이드하여 커스텀 에러 처리 로직을 구현한다.
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
// 여기에 커스텀 에러 조건 로직을 구현
return response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR
|| response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 여기에 에러 처리 로직을 구현
if (response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
// 서버 에러 처리
} else if (response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
// 클라이언트 에러 처리
if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
throw new NotFoundException();
}
}
}
});
익명 클래스의 역할과 특징
역할
- 이 코드에서 익명 클래스는 ResponseErrorHandler 인터페이스의 구현체로 사용된다. ResponseErrorHandler는 RestTemplate에서 HTTP 응답의 오류를 처리하는 방법을 정의하는 인터페이스다.
메서드 구현
- 익명 클래스는 ResponseErrorHandler 인터페이스의 hasError와 handleError 두 메서드를 구현한다. hasError 메서드는 HTTP 응답에 에러가 있는지를 확인하고, handleError 메서드는 에러가 있는 경우 해당 에러를 처리한다.
익명 클래스의 특징
- 익명 클래스는 이름이 없으며, 주로 단일 사용 목적으로, 여기서는 RestTemplate의 오류 처리 방식을 커스터마이징하기 위해 사용된다. 이 클래스는 RestTemplate의 설정 내에서 직접 선언되고 인스턴스화되며, ResponseErrorHandler의 구현을 제공하는 데 집중된다.
📌 결론
이 익명 클래스를 사용함으로써, RestTemplate의 표준 오류 처리 방식을 덮어쓰고, 애플리케이션에 특화된 커스텀 오류 처리 로직을 적용할 수 있다. 이렇게 익명 함수를 사용하면 스프링 애플리케이션에서 RESTful API 호출 시 발생할 수 있는 다양한 HTTP 오류 상황들을 유연하게 처리할 수 있다.
2. Bean Configuration에서 익명 클래스 활용
스프링에서 Bean을 설정할 때, 익명 클래스를 사용하면 특정 구현을 제공할 수 있으며, 이는 코드의 유연성을 높여준다.
Bean 설정에서 익명 클래스 사용
- 익명 클래스를 사용하여 Bean의 구체적인 구현을 제공할 수 있다. 이 방법은 다양한 환경에서 동일한 인터페이스나 추상 클래스에 대해 다른 동작을 수행하도록 할 때 매우 유용하다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService() {
@Override
public void performAction() {
// 커스텀 로직
}
};
}
}
3. 테스트 케이스 작성에 익명 클래스 활용
익명 클래스는 단위 테스트를 작성할 때도 유용하다. 특정 인터페이스나 클래스의 일부 메서드만을 재정의하여 테스트 케이스를 간결하고 명확하게 작성할 수 있다.
테스트 케이스에서 익명 클래스 사용
- 다음은 익명 클래스를 사용하여 MyService의 getMessage 메서드를 테스트하는 예시다.
@SpringBootTest
public class MyServiceTest {
@Test
public void testGetMessage() {
MyService service = new MyService() {
@Override
public String getMessage() {
return "테스트 메시지";
}
};
assertEquals("테스트 메시지", service.getMessage());
}
}
📌 결론
스프링 프레임워크에서 익명 클래스의 사용은 코드의 유연성을 높이고, 다양한 상황에서 코드 재사용성을 향상시켜 준다. 람다 표현식과의 연계, Bean 설정의 유연성 제공, 그리고 테스트 케이스 작성의 편의성 측면에서 익명 클래스는 스프링 애플리케이션 개발의 중요한 부분이다.
반응형
'Spring + Java' 카테고리의 다른 글
[Spring] 자바 리플렉션과 생성자 주입의 관계 (1) | 2023.11.19 |
---|---|
[Spring] 스프링은 추상화를 어떻게 적용했을까? (0) | 2023.11.02 |
[Spring] 스프링 빈(Bean)을 함수형으로 등록하기 (0) | 2023.08.09 |
[Spring] 함수형 프로그래밍이란? (0) | 2023.08.09 |
[스프링, 스프링부트] Spring, Java - static class, static method 사용 (0) | 2023.08.09 |