반응형

전체 글 199

[JUnit] 회원가입 API 컨트롤러, 서비스, 리포지토리 테스트 예제

[JUnit] 회원가입 API 컨트롤러, 서비스, 리포지토리 테스트 예제 인프런에서 박우빈님의 [Practical Testing: 실용적인 테스트 가이드] 강좌를 들으면서 강의 내용을 복습할 겸 테스팅하는 방법에 대하여 공유하고자 합니다. 좋은 강의 만들어주신 우빈님 감사합니다.^^ 들어가기에 앞서 여러분은 테스트 하면 어떤 생각이 떠오르나요? 라는 질문을 받았습니다. 저의 머리속에는 “귀찮다.” 라는 생각이 떠올랐습니다. 그런데 강의에서도 귀찮다. 라고 소개했습니다. 😲 (독심술이 있으신건가…?) 그렇습니다. 테스트는 매우 귀찮은 작업입니다. 기능 구현하는데 시간이 모자른데 테스트 코드까지 작성해야 한다? 에바지~ 라는 생각이 먼저 듭니다. 그리고 무엇보다 테스트는 귀찮습니다. (일반적으로 개발자는 귀..

테스트/0+ JUnit 2023.06.09

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy)

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy) 우리는 스프링 빈을 등록하고 초기화 해야하는 작업을 해야할 때가 있습니다. 객체를 생성할 때 초기화하면 되지 않나? 🤔 라고 생각할 수 있습니다. 하지만, 객체를 생성하는 생성자와 초기화 작업은 분리하는 것이 좋습니다. 그렇다면 어떻게 스프링 빈을 초기화할 수 있을까요? 참고 생성자 안에서 상대적으로 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누어 관리하는 것이 유지보수에도 좋습니다. 스프링 빈 생명주기 🌱 먼저 스프링 빈의 생명주기에 대해서 알아야 합니다. 스프링 빈은 아래와 같은 생명주기를 갖고 있습니다. 객체 생성 -> 의존관계 주입 -> (데이터 사용 가능)..

[JPA] 조건절을 포함한 일대다 페이징 최적화

[JPA] 조건절을 포함한 일대다 페이징 최적화 방법 일대다 조인에서 페치조인을 사용하면 페이징을 할 수 없습니다. 우리는 일대다에서 일(1)을 기준으로 페이징하는 것이 목적입니다. 그런데 데이터는 다(N)를 기준으로 row를 생성합니다. 그렇다면 페이징을 하기 위해서는 지연로딩으로 1+N 문제가 발생하는 것을 모르는척 해야할까요? 🤔 일대다 페치조인의 문제 일대다 페치조인을 하면 다(N)를 기준으로 데이터가 생성됩니다. Order OrderItem라고 할 때 다음과 같습니다. 우리는 Order를 기준으로 페이징을 하고 싶습니다….! 😭 조건절을 포함한 일대다 페이징 최적화 방법 목표 Item의 상품명을 조건으로 Order를 Delivery, OrderItem, Item 데이터를 함께 조회하여 페이징 되..

[스프링 + 포트원] 스프링으로 포트원 사용해서 결제 구현 하는 방법(Spring Boot, JPA, PortOne)

[스프링 + 포트원] 스프링으로 포트원 사용해서 결제 구현 하는 방법(Java, Spring Boot, JPA, PortOne)  깃허브 링크https://github.com/ssosee/portone-sample-onedollar-shop   포스팅 동기쇼핑몰을 개발하면 결제 부분에서 어떻게 해야할지 막막한 개발자들이 있을 것 입니다.저 또한 그랬습니다. 😭 결제를 구현하기 위해서는 각 PG사에서 제공하는 API를 사용하여 개발을 진행해야하는데,만만한 작업이 아니라고 생각합니다… 이러한 문제를 해결하고자 포트원이라는 업체가 등장했습니다.그런데…. 이마저도 막상 개발하다보면 어려움을 느낍니다… 그리고 구글링을 하다보면 대부분 javascript를 사용하여 구현한 예제들만 있고,Spring을 사용한 예제..

0+ 스프링 2023.06.03

[스프링 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
반응형