Back-End/SpringBoot

스프링부트와 AWS로 혼자 구현하는 웹 서비스 (chap.2) - 테스트코드, 롬복

Young-Cow 2021. 1. 18. 22:33

*이해를 위해 메모장처럼 활용한 포스트로, 신뢰하지 말고 참고용으로 활용

 

1. 테스트 코드 작성

단위 테스트 코드 작성 장점(위키)

  • 문제점 발견
    유닛 테스트의 목적은 프로그램의 각 부분을 고립시켜서 각각의 부분이 정확하게 동작하는지 확인하는 것이다. 즉, 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해 준다. 따라서 프로그램의 안정성이 높아진다. 유닛 테스트는 일견 개발 시간을 증가시키는 것처럼 보이지만 개발 기간 중 대부분을 차지하는 디버깅 시간을 단축시킴으로써 여유로운 프로그래밍을 가능케 한다.

  • 변경이 쉽다
    프로그래머는 언제라도 유닛 테스트를 믿고 리팩토링을 할 수 있다. 리팩토링 후에도 해당 모듈이 의도대로 작동하고 있음을 유닛 테스트를 통해서 확신할 수 있다. 이를 회귀 테스트(Regression testing)라 한다. 어떻게 코드를 고치더라도 문제점을 금방 파악할 수 있고 수정된 코드가 정확하게 동작하는지 쉽게 알 수 있게 되므로 프로그래머들은 더욱더 의욕적으로 코드를 변경할 수 있게 된다. 좋은 유닛 테스트 디자인은 그 유닛이 사용되는 모든 경로를 커버할 수 있는 테스트 케이스를 만들어 준다.

    지속적인 유닛 테스트 환경을 구축하면 어떠한 변화가 있더라도 코드와 그 실행이 의도대로 인지를 확인하고 검증 할 수 있게 된다. 확립된 개발 방법과 유닛 테스트의 범위에 따라서 프로그램의 정확성이 좌우된다.

  • 통합이 간단하다
    유닛 테스트는 유닛 자체의 불확실성을 제거해주므로 상향식(bottom-up) 테스트 방식에서 유용하다. 먼저 프로그램의 각 부분을 검증하고 그 부분들은 합쳐서 다시 검증하는 통합 테스트에서 더욱더 빛을 발한다.

 

테스트 코드는 매번 패키지를 적용할 때마다 하는 회귀시험을 한 번에 해결하는 방법인 것 같다.

프로젝트의 시작부터 차근차근 테스트 코드를 만들어나가지 않는다면 나중엔 걷잡을 수 없이 많아져버려서

기능을 추가 or 보완 할 때마다 테스트 코드의 작성은 필수라고 생각한다.

 

테스트 프레임워크 중 대표적으로 xUnit 이 있음

JUnit / DBUnit / CppUnit / NUnit ..

 

 

2. Hello Controller 테스트 코드 작성

인텔리제이는 인텔리센스(자동완성)이 VSCode처럼 단축키 입력 없이 바로 보였는데
이클립스는 [ Ctrl + Space ] 단축키를 눌러야 자동완성을 위한 리스트가 아래 나온다.(귀찮)
  • Application 메인 클래스 작성
    • @SpringBootApplication 어노테이션
      • 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 해줌
      • 스프링부트는 이 어노테이션이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치해야 한다.
    • SpringApplication.run()
      • 내장 WAS (Web Application Server)를 실행함.

 

 내장 WAS를 쓰면 언제 어디서든 동일한 환경에서 스프링 부트를 배포할 수 있고, 성능적 이슈는 무시해도 될 정도로 차이가 크지 않음

 

어노테이션 지옥

  • @RestController
  • @GetMapping
    • Get 요청을 받을 수 있는 API를 만들어줌
  • @RunWith(SpringRunner.class)
  • @WebMvcTest
  • @Autowired

너무 많다. 헷갈리지 않게 정리해놓기로..

 

STS에서는 인텔리제이처럼 줄 번호 옆에 실행 버튼이 안 보인다.
Run As -> JUnit Test (단축키 : cmd + opt + x 이후 오른쪽 구석탱이에 창이 뜨면 t ... 그냥 마우스를 쓰자)
누르면
오른쪽 구석에 테스트 결과가 뜬다(실패..)

오른쪽 구석탱이
오른쪽 구석

 

 

 

 

이클립스에서 코드를 동일하게 작성하면

 이런 에러가 발생하게 된다.

그래서 하라는 대로 하면 테스트에서 에러가 발생한다.

왜일까 자세히 보니

content() 가 ContentRequestMatchers / ContentResultMatchers 두 군데 있다..

1회독 하면서 이렇게 이름이 같아서 잘못 사용한 경우가 매우 많았는데 문제 원인을 찾기가 힘들었다.

잘 생각하면서 인텔리센스를 사용하자..

치사하다 정말

 

잘 된다.

 

 

 

 

3. 롬복 (Lombok)

자바 기반에서 자주 사용하는 Getter, Setter, ToString, hashCode 등 을 어노테이션으로 자동 생성해준다! (사실 잘 모름)

보기엔 좋지만 단점은 소스 분석이 난해해질 수 있다는 것 등이 있겠다.

 

인텔리제이에서는 플러그인 설치로 한방에 끝나지만 STS 에서는 좀 복잡하다.

projectlombok.org/setup/eclipse

 

Eclipse, Spring Tool Suite, (Red Hat) JBoss Developer Studio, MyEclipse

 

projectlombok.org

duzi077.tistory.com/142

 

STS 에 Lombok 설치 및 사용하기 ( Windows / Mac )

Windows 또는 Mac 에서  STS에 Lombok을 설치하여 사용하는 방법을 알아보겠습니다. 보일러플레이트 코드 많은 부분에서 거의 변경되지 않고 반복되는 코드 Lombok Annotation을 사용해 보일러플레이트

duzi077.tistory.com

countryxide.tistory.com/16

 

[lombok] eclipse(STS)에 lombok(롬복) 설치

구글링을 해봐도 속시원하게 내 문제를 해결해준 글이 없어서 직접 정리 0. 내 환경 - eclipse : STS 3.8.3 - lombok : 1.16.10 1. 프로젝트의 pom.xml에 lombok 의존성 추가 (필요한 버전이 있다면 버전을 표시)..

countryxide.tistory.com

롬복 홈페이지 및 여러 블로그를 참고하자. 

참고로 맥(Mac)에서 STS의 기본 설치 경로는 아래와 같다 (Application-STS4-Contents-Eclipse-SpringToolSuite4.ini)

 

 

롬복에 대해선 추가로 작성해야 할 것 같다.

우선 책에 있는 어노테이션 정리

  • @Getter
    • 선언된 모든 필드의 get 메소드 생성해줌
  • @RequiredArgsConstructor
    • 선언된 모든 final 필드가 포함된 생성자를 자동 생성
    • final이 없는 필드는 생성자에 포함되지 않음
728x90
반응형