728x90
반응형

분류 전체보기 185

[스프링 Core] @Configuration를 사용하면 싱글톤을 유지할 수 있는 이유(CGLIB)

[스프링 Core] @Configuration를 사용하면 싱글톤을 유지할 수 있는 이유(CGLIB) 미리 보는 결론 @Configuration은 싱글톤을 위해서 존재합니다. @Bean만 사용해도 스프링 빈으로 등록이 가능 @Configuration을 사용하면 바이트 코드를 조작하는 CGLIB를 사용하여 클래스를 상속받는 프록시 객체를 만들어서 스프링 빈을 싱글톤으로 관리할 수 있게 해준다. 스프링 설정 정보는 반드시 @Configuration을 사용하자! @Configuration 예시 스프링 컨테이너는 기본값으로 모든 인스턴스를 싱글톤으로 관리합니다. 그런데 아래와 같은 코드를 보면 좀 이상하지 않나요? ApplicationConfig @Configuration public class Applicati..

[스프링 MVC] 어떻게 컨트롤러는 다양한 종류의 파라미터를 받아서 처리할 수 있을까? 🤔

[스프링 MVC] 어떻게 컨트롤러는 다양한 종류의 파라미터를 받아서 처리할 수 있을까? 스프링을 이용해서 개발하다보면 컨트롤러에 알맞은 어노테이션면 설정하면 알아서 요청, 응답 파라미터가 변환되는 것을 알수 있습니다. 그런데 어떻게 스프링은 알아서 척척 요청, 응답 파라미터를 변환하는 걸까요? 🤔 미리 보는 결론 RequestMappingHandlerAdapter 동작 방식 요청의 경우 @RequestBody를 처리하는 RequestResponseBodyMethodProcessor(ArgumentResolver)가 존재하고, HttpEntity를 처리하는 HttpEntityMethodProcessor(ArgumentResolver)가 있습니다. 이러한 ArgumentResolver들이 HTTP 메시지 컨..

[스프링 MVC] 서블릿 필터가 있는데 인터셉터는 왜 나온거지?

[스프링 MVC] 서블릿 필터가 있는데 인터셉터는 왜 나온거지? 먼저 보는 결론 필터와 스프링 인터셉터는 웹과 관련된 👀 공통 관심사를 해결하기 위한 기술입니다. 인터셉터와 필터는 관리되는 영역이 다릅니다. 필터는 서블릿 컨테이너에서 관리되지만, 인터셉터는 스프링 컨테이너에서 관리됩니다. 따라서 인터셉터는 스프링이 처리해주는 내용을 적용받을 수 있지만, 필터는 적용받을 수 없습니다. 가장 대표적으로 필터 기술은 스프링에 의한 예외처리가 되지 않는다는 것 입니다. 그런데 현재는 필터를 스프링 빈으로 등록할 수 있습니다. 그 이유는 여기를 참고하시면 됩니다.^^ 서블릿 필터를 어떻게 스프링 빈으로 관리할 수 있을까? [스프링 MVC] 서블릿 필터를 어떻게 스프링 빈으로 관리할 수 있을까? [스프링 MVC] ..

[스프링 MVC] 서블릿 필터 예외처리 방법

[스프링 MVC] 서블릿 필터 예외처리 방법 RestControllerAdvice로 서블릿 필터 예외처리가 안되는 이유 🥲 일반적으로 스프링을 사용하면 ControllerAdvice와 ExceptionHandler를 이용하여 예외처리를 기능을 사용합니다. (이를 통해 예외가 서블릿으로 전달되지 않고 처리됩니다.^^) @RestControllerAdvice public class BasicExceptionHandler { @ExceptionHandler(BasicException.class) public ResponseEntity basicExceptionHandle(BasicException e) { return new ResponseEntity(e.getMessage(), HttpStatus.BAD_R..

[스프링 MVC] 서블릿 필터를 어떻게 스프링 빈으로 관리할 수 있을까?

[스프링 MVC] 서블릿 필터를 어떻게 스프링 빈으로 관리할 수 있을까? 서블릿 필터는 서블릿 컨테이너 영역입니다. 그런데 우리는 서블릿 필터 구현체를 작성하고 빈으로 등록할 수 있습니다. 필터 인터페이스 public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(ServletRequest request, ServletRpesponse response, FilterChain chain) throws IOException, SevletException; public default void destory() {} } 필터 인터페이스를 구현하고 ..

[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법

[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법 인스턴스 테스트 🎲 독립 시행 JUnit의 기본전략은 테스트 메소드 마다 테스트 인스턴스를 새로 생성합니다. 코드로 보면 바로 이해가 되실것 입니다. public class InstanceTest { int value = 1; @Test @DisplayName("value를 1증가 했기 때문에 2가 된다.") void test1() { System.out.println(this); // 메소드 해시 value++; // 1증가 Assertions.assertEquals(2, value); } @Test @DisplayName("value를 1증가 했기 때문에 3 된다.") void test2() { System.out.println(this..

테스트/0+ JUnit 2023.05.17

[JUnit5] 테스트 인자 값 타입 변환하는 방법

[JUnit5] 테스트 인자 값 타입 변환하는 방법 인자 값 타입 변환 JUnit에서는 인자값을 타입 변환하여 테스트를 할 수 있습니다. 종류로는 암묵적인 타입 변환이 있고, 명시적인 타입 변환이 있습니다. 명시적인 타입변환은 우리가 커스텀하게 사용하여 타입변환을 한다는 의미 입니다. 먼저 테스트에 사용할 Study 클래스 입니다. @Data public class Study { private StudyStatus status; private int limit; private String name; public Study(int limit) { this.status = StudyStatus.DRAFT; if(limit < 0) { throw new IllegalArgumentException("limit..

테스트/0+ JUnit 2023.05.17

[스프링 MVC] XML 데이터 파싱(RestTemplate)

[스프링 MVC] XML 데이터 파싱(RestTemplate) 요즘 대부분의 HTTP API는 JSON 형식을 지원합니다. 하지만, 프로젝트를 진행하다보면 XML 형식의 데이터를 파싱해야하는 경우가 생깁니다. 😭 XML 데이터를 파싱하는 방법에 대해서 소개하겠습니다. MessageConverter 먼저 MessageConverter에 대해서 알아야 합니다.^^ HTTP API처럼 (JSON, XML 등등…)데이터를 HTTP 메시지 body에서 직접 읽거나 사용하는 경우HTTP 메시지 컨버터가 기능을 제공하여 편리합니다.^^ MessageConverter가 뭘까요? 🤔 스프링 MVC 내부에서 HTTP 메시지 바디를 읽어 문자나 객체로 변환해서 전달해줍니다. 이때, HttpMessageConverter 라는..

[JUnit5] 환경변수 조건에 따라 테스트 실행하는 방법

[JUnit5] 환경변수 조건에 따라 테스트 실행하는 방법 환경변수 조건을 만족하는 경우에 테스트 실행 환경변수에 따라 테스트를 실행하는 코드를 작성해보겠습니다. 환경변수 설정 저는 macOS를 사용하고 있고 zsh를 사용하고 있습니다. $ vi ~/.zshrc 파일을 열고 export TEST_ENV=LOCAL 를 입력합니다. # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/local/bin:$PATH # Path to your oh-my-zsh installation. export ZSH="/Users/jangsea-ung/.oh-my-zsh" export PATH=/opt/homebrew..

테스트/0+ JUnit 2023.05.05

[JUnit5] Assertions 기본 사용법

[JUnit5] Assertions 기본 사용법 Jupiter에서 제공하는 Assertions에 대해서 알아보자. 자주 사용하는 Assertions assertEqulas(expected, actual) 실제 값이 기대한 값과 같은지 확인 assertNotNull(actual) actual이 null이 아닌지 assertTrue(boolean) 조건이 참(true)인지 확인 assertAll(executables…) 모든 확인 구문 확인 assertThrows(expectedType, executable) 예외 발생 확인 assertTimeout(duration, executable) 특정 시간 안에 로직이 완료되는지 확인 로직이 완료될 때 까지 기다림 assertTimeoutPreemptively(ex..

테스트/0+ JUnit 2023.05.05
728x90
반응형