Java/spring

    [Spring] WireMock 을 사용한 HTTP Client 유닛테스트

    개인 깃허브에서 Riot API를 사용하여 리그오브레전드 게임 관련 어플리케이션을 만들고 있었다. 하지만 API가 어떻게 만들어졌는지 모르겠지만.. 정상적인 API 요청을 보내도 실패할때가 있고 몇 초 뒤에 아무렇지 않게 성공 응답을 반환한다. 😱 뼈져리게 Retry의 필요성을 느꼈다. 해당 기능을 개발하면서 비정상적인 응답이 왔을때 Retry, 예외 처리에 대한 테스트 코드를 작성하기 위해 응답 값 모킹이 필요했고, 이를 위해 WireMock을 사용하게 되었다. 작성한 테스트 및 고려한 사항들에 대해 공유하고자 한다. 본 글은 spring boot, gradle, java를 사용하고 http client는 feign, 테스트 프레임워크는 spock(groovy)를 사용한다. spring, spock 환..

    [Spring] Spring Batch에 Hexagonal Architecture를 적용해보자

    팀에서 클린 아키텍처와 유지보수를 위해 전반적으로 헥사고날 아키텍처를 적용하기로 했다. 이는 Spring Batch가 포함된 프로젝트도 포함이 되었는데, 헥사고날 아키텍처가 제대로 적용된 것 같지 않아서 내가 다시 설계해보자는 의미로 구현했다. 구글에 검색해도 Spring MVC 예시는 많이 나오는데, Spring Batch에 헥사고날 아키텍처를 적용한 예시는 잘 찾아볼 수 없는 것 같다. 마침 "직접 구현하며 배우는 클린 아키텍처"를 읽어서 바로 적용할 수 있었다. 책에 대한 후기는 다른 게시글에 남길 것 이다. 그래서 이번 포스팅은 batch 자체의 성능 개선, 기능 구현, 인프라 구성보다는 아키텍처 구성에 초점을 맞출 것이다. 또한 헥사고날 아키텍처의 기본적인 개념은 다루지 않으므로 기본 개념은 다..

    [Spring] Log4j2를 이용해 로깅해보자

    시스템이 실행되면서 필연적으로 에러가 발생하게 되는데, 시스템이 동작하는 과정을 하루종일 모니터링하고 있을 순 없다. 그렇기 때문에 로깅을 통해 시스템의 상태와 정보를 기록해두어야 한다. 너무 세세한 정보를 기록하면 방대한 양의 로그가 쌓여 원하는 정보를 얻기 힘들기 때문에 적절한 포맷과 정보를 로깅하는 것이 중요하다. Log4j? Logback? Log4j2? Spring에 로깅 구현체를 검색하다보면 해당 3가지의 구현체가 가장 많이 나온다. Log4j는 2015년에 지원이 중단된 오래된 프레임워크이고, Logback은 Spring의 spring-boot-starter-logging에서 지원해주는 디폴트 구현체이다. Logback 이후 Log4j2가 나오게 되었는데, 다른 로깅 프레임워크보다 많은 처리..

    [Spring Security] FormLogin에서 Custom Filter 처리 이슈

    @Override protected void configure(final HttpSecurity http) throws Exception { http .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) //.failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) } Spring Security를 보다보면 위처럼 FormLogin을 통해서 Login 로직을 구성하는 경우가 굉장히 많다. @Override protected void configure(f..

    [Spring Security] LoginSuccessHandler와 FailureHandler 호출 원리

    기본적인 인증 책임 구조 SpringSecurity에서 인증은 보통 AuthenticationFilter → AuthenticationManager → AuthenticationProvider 순으로 인증 책임을 위임한다. (UserDetailsService 는 User 정보를 load하는 역할만 수행) Authentication Success 로직 기본적인 Authentication Filter인 UsernamePasswordAuthenticationFilter 를 보면 AbstractAuthenticationProcessingFilter 를 extends 하는 걸 볼 수 있다. private void doFilter(HttpServletRequest request, HttpServletResponse..

    [Spring Cloud] FeignClient Logging 방법 정리

    Feign Client 를 사용하던 중 구현해야 할 사항 중 하나가 모든 요청, 응답에 대한 로깅이었다. 그러면서 알게된 Feign Client Logging 방법 정리 간단하게 interceptor를 사용할까! 하다가 feign의 Logger를 커스터마이징 할 수 있길래 오! 더 간단하지 않을까 해서 사용해보았다. %s %s HTTP/1.1 (%s-byte body) ", request.httpMethod().name(), request.url(), bodyLength); } } @Override protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) thr..