Weekly I Learned (5월 2주차)

YEON·2022년 5월 9일
0

Weekly I Learned (2022)

목록 보기
4/15
그 주의 화요일, 금요일을 지정 날짜로 업데이트 합니다

1. wrapper class/일급 컬렉션 네이밍

일급 컬렉션이 아닌 임베디드 객체를 생성하면서 네이밍을 복수로 두었던 것에 대하여 일급 컬렉션을 연상 시킬 수 있다는 피드백을 받게 되었다. wrapper class 로 구현한다면, 일급 컬렉션이 아닐 때에는 복수가 아닌 단수로 네이밍을 지칭하는게 좋다.

JPA&서비스 레이어 리팩터링 피드백




2. @ControllerAdvice, @ExceptionHandler 를 이용한 예외처리

예외 처리를 하는 방법은 다양하다.
하지만 계속해서 반복적인 if문, try-catch, 상위 메서드로 예외처리를 위임하게 된다면 코드는 복잡해질 수 있고, 이로 인해 비즈니스 로직에 집중하거나 유지보수하기가 어려워질 수 있다.

이런 문제를 개선하기 위해 스프링이 예외 처리를 위해 제공하는 @ExceptionHandler@ControllerAdvice 어노테이션를 활용하여 예외 처리를 할 수 있다.

@ExceptionHandler
@ExceptionHandler@Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능이다.

@ControllerAdvice
@ControllerAdvice는 모든 @Controller@RestController 에서 발생한 예외를 한 곳에서 관리하고 처리할 수 있게 도와준다. (이를 통해 직접 예외 처리를 하지 않고도 예외가 발생하면 그냥 던져버리는 패턴으로 일관성 있게 개발할 수 있다.)

@RestControllerAdvice
@ControllerAdvice + @ResponseBody 의 의미로 @RestControllerAdvice 도 @ControllerAdvice와 동일한 역할을 한다. 다만 추가적으로 응답의 body에 객체를 넣어서 반환이 가능하다.

서비스 레이어 리팩터링 피드백




3. Mokito 를 이용한 테스트

JUnit 이 테스트 코드 작성을 도와주는 JVM 기반 프레임워크라면,
Mockito 란 단위 테스트를 위한 Java Mocking 프레임워크로 JUnit에서 가짜 객체인 Mock을 생성해주고 관리하고 검증할 수 있도록 지원해준다. 한마디로, 동적으로 mock 객체를 만들어 주는 Mock 프레임워크 중 하나이다. (ex. EasyMock, jMock, Mockito)
Mokito는 Mock 만드는 방법을 단일화하였는데 테스트 스텁을 만드는 것과 검증을 분리할 수 있고, 작성이 어렵지 않아 테스트 자체에 집중할 수 있다는 장점이 있다.

Mokito의 4단계 진행
CreateMock : 인터페이스에 해당되는 Mock 객체를 만든다.
Stub : 테스트에 필요한 Mock 객체의 동작을 지정한다.
Excercise : 테스트 메소드 내에서 Mock 객체를 사용한다.
Verify : 메서드가 예상되로 호출되었는지 검증한다.

Mock Object를 생성, 검증, 스터빙(Stubbing)

class MockitoTest {
   @Test
   void test() throws Exception{
      //given (mock을 통해 Mock Object 생성)
      List<String> mockedList = mock(ArrayList.class);
      //when (when을 이용하여 stubbing)
      when(mockedList.get(0)).thenReturn("First");
      //then (verify를 이용하여 Mock Object 사용 확인)
      assertThat(mockedList.get(0)).isEqualTo("First");
      verify(mockedList).get(0);
    }
}

Mock 객체란?
Mock 객체란 개발한 프로그램을 테스트할 때 테스트를 수행할 모듈과 연결되는 외부의 다른 모듈을 흉내 내는 가짜 모듈을 생성하여 테스트의 효율성을 높이는 데 사용하는 객체이다.

  • 실무에서는 실제 객체를 만들기에 시간과 비용이 많이 들 수 있고 의존성이 크게 걸쳐져 있어서 테스트 시 제대로 구현하기 어려울 수 있으므로 가짜 객체를 만들어서 사용할 수 있도록 도와준다.
    때문에, 테스트 작성을 위한 환경 구축이 어려운 경우 혹은 테스트 시간이 오래 걸리는 경우 필요할 수 있다.

  • Mock 객체를 사용하는 이점
    1) 가짜 모듈을 생성하므로써 협업하는 클래스의 완성 여부에 상관없이 내가 만든 클래스를 테스트 할 수 있고,
    2) 테스트하려는 클래스가 연관된 클래스와 올바르게 협업하는 지 확인할 수 있다

  • Mock 사용시 유의사항
    1) Mock 프레임워크가 정말 필요한지 확인한다.
    2) Mock을 사용하는 경우 테스트 케이스 유지에 복잡성이 더해지기 때문에 Mock이 없는 의존성 적은 구조로 프로그래밍 한다.

Unnecessary Stubbing Exception 예외 발생
Mockito 사용중 발생되는 Unnecessary Stubbing Exception 예외는 사용되지 않은 Stubbing이 있음을 나타내는 것이므로, 코드베이스를 깨끗하게 유지하기 위해 사용하지 않는 Stubbing을 제거하는 것이 좋다.

해결방법 3가지
1. Mockito-core 버전을 1.x나 2.x로 내리기 (비추천)
2. doReturn, when 등의 앞에 lenient() 메서드를 추가해서 해당 stubbing이 미사용될 수 있음을 표시
3. 필요없는 stubbing(when, doReturn, doThrow 등)을 제거하기




4. REST Assured를 사용한 REST API 테스트

REST Assured는 REST 웹 서비스를 검증하기 위한 Java 라이브러리이다.
REST 어플리케이션의 HTTP Endpoint에 초첨을 맞춰 REST API 테스트를 진행하므로 컨트롤러, 서비스 등 여러 계층의 로직을 한번에 테스트 할 수 있다.

Rest Assured를 사용한 REST API 테스트는 Black box 테스트로
어플리케이션에 Request를 보내고, Response를 받고 미리 결정된 결과와 비교한다. (반환된 status code에 따라 자동으로 pass 또는 fail을 판단한다.)

REST Assured의 given-when-them 패턴을 이용한 코드 작성
given : 테스트시 필요한 데이터, 및 파라미터를 셋팅
when : Method type을 정의
then : Response Data를 검증

REST Assured는 HTTP method에 기반하여 parameter type을 자동으로 결정하는데,
GET type인 경우에는, query parameters로 POST type인 경우에는 form parameters로 인식한다. 하지만, PUT, POST type에서 query parameter와 form parameter를 함께 사용할 때는 정확하게 명시해주어야 한다.

import org.junit.Test;
import io.restassured.RestAssured;
public class Test {
    @Test
    public void test() {
        RestAssured.given()
                   .when().get("http://www.test.com")
                   .then().statusCode(200);
    }
}

추가적으로 공부할 사항

  • MockMVC 와의 비교






[참조]
https://cheese10yun.github.io/spring-guide-exception/
https://tecoble.techcourse.co.kr/post/2021-05-10-controller_advice_exception_handler/
https://jeong-pro.tistory.com/195
https://it-mesung.tistory.com/205
https://widian.github.io/java/2021/08/15/mockito-%EC%82%AC%EC%9A%A9-%EC%A4%91-Unnecessary-Stubbing-Exception-%ED%95%B4%EC%86%8C%ED%95%98%EA%B8%B0.html
https://minkwon4.tistory.com/181
https://www.crocus.co.kr/1555
https://beststar-1.tistory.com/30
https://beenlife.tistory.com/34
https://velog.io/@jjy5349/RestAssured%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0
https://tecoble.techcourse.co.kr/post/2020-08-19-rest-assured-vs-mock-mvc/

profile
- 👩🏻‍💻

0개의 댓글