본문 바로가기

전체 글

여을심은 그동안 어디서 뭘 했을까 백문이 불여일타 입사 후 5개월 쯔음인가. CTO님과 페어를 하다가 엄청 혼났다. Optional 로 구현된 로직의 테스트 케이스를 성공시켜보라고 하셨는데, 내가 거기서 아둥바둥대며 아무것도 하지 못했다. 그동안 공부를 나름 한다고 해왔는데, 조금의 압박감으로 아예 머릿속이 하얘지는 게 바보같았다. 이 날을 계기로 그동안의 공부방식을 되돌아봤었다. 나는 머리만 커지는 공부를 하고 있었다. 이런 저런 지식만 쌓고 막상 구현하려면 손이 느리고 내 것으로 만든 적이 없으니까 응용도 하지 못하고, 좀만 코드가 달라져도 이해하는데 많은 시간이 걸렸다. 머리보다 손이 빠른 공부를 해야겠다 다짐했다. 학学보다는 습习에 많은 시간을 투자하기로 한거다. 블로그를 잠시 중단한 이유다. 블로그 포스팅은 생각보다 많은 시간이.. 더보기
[Spring Test] Test LifeCycle Today’s Study Topic Test LifeCycle Junit의 생명주기? 일반적으로 테스트 생명주기는 Method 를 기준으로 한다. TestInstance 생명주기가 어떻게 유지되는지 살펴보고 싶었다. 우선, TestInstance의 생명주기를 Intercept하는 Extension을 작성해보았다. Intercepting Invocations를 대충 번역한 바로는 "호출 가로채기" 였다. InvocationInterceptor는 테스트 코드에 대한 호출을 가로채기 위한 API를 정의한다. package kr.co.yeoeulsim.eatgo.domain; import javax.transaction.Transactional; import lombok.extern.slf4j.Slf4j; im.. 더보기
[Spring Test] Spring TestContext Framework Prolog 스프링 4독을 앞두고 있다. 3독까지 해보니까 레퍼런스 전체적으로 자주 나오는 몇가지 키워드가 있다는 걸 알게되었다. 그래서 많이 등장하는 키워드를 한번 다 적어보았다. 그리고 실제 테스트를 돌려보았다. 많이 보았던 키워드들이 정말 많이 등장했다. 뭔진 모르겠지만 내가 앞으로 레퍼런스를 읽을 때 도움이 되겠구나. All above listeners have a specific responsibility in Spring integration tests execution. For example, DependencyInjectionTestExecutionListener provides support for dependency injection and initialization of test in.. 더보기
[Spring Test] private로 선언된 메소드를 어떻게 테스트 할 수 있을까 Today’s Study Topic private로 선언된 메소드를 어떻게 테스트 할 수 있을까. 업무를 하다가 private으로 되어있는 필드에 직접 접근해야하는 상황이 있었다. 당시에는 어쩔 수 없이 바로 public으로 변경했지만,, 찝찝했다. private로 선언된 메소드 또는 필드를 테스트하기 위해 public 으로 변경하는 것이 과연 맞을까? 일반적으로 테스트를 위해서 production 코드의 접근 범위를 넓히는 것이 허용되는 걸까? 클래스의 노출 범위가 커지게 되는 건데,, 그럼 private로 선언된 메소드나 필드를 어떻게 테스트 하지? 그로부터 한달이 지났나. 잊을 듯 말 듯한 시기에 관련 팁을 하나 얻었다. Spring Test Reference를 읽다가 private 필드, 메소드에.. 더보기
스프링 HTTP Message Body 와 Message Converter 2 - RequestMappingHandlerAdapter 📌 RequestMappingHandlerAdapter 동작 방식 ArgumentResolver 애노테이션 기반의 컨트롤러는 엄청나게 다양한 파라미터를 사용할 수 있었다. HttpServletRequest , Model 은 물론이고 @RequestBody HttpEntity 같은 HTTP 메세지를 처리하는 부분까지 큰 유연함을 보장한다. 이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다. 애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter 가 ArgumentResolver를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 파라미터 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다. 스프.. 더보기
스프링 HTTP Message Body 와 Message Converter 1 @Controller에서 String return 하면 ViewResolver로 인해 view로 가고 @RestController에서는 String return 하면 HttpMessageConverter로 인해 body 내용이 전달된다. 기본 문자 처리는 String HttpMessageConverter 기본 객체처리는 MappingJackson2HttpMessageConverter이 기여한다. 이렇게 똑똑하게 움직일 수 있는 이유가 뭘까. 📌 Message Converter 우선, 스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다. HTTP 요청 @RequestBody , HttpEntity(RequestEntity) HTTP 응답 @ResponseBody , HttpEntity(Resp.. 더보기