단위테스트

  • 단위테스트 vs TDD

    • TDD: 테스트가 주도하는 개발 (레드 그린 사이클)

      1. 항상 실패하는 테스트 먼저 작성 (Red)
      2. 테스트가 통과하는 프로덕션 코드 작성 (Green)
      3. 테스트가 통과하면 프로덕션 코드를 리펙토링 (Refactor)
    • 단위테스트: 기능 단위의 테스트 코드를 작성하는 것 (순수하게 테스트 코드를 작성하는 것)

  • 단위 테스트의 장점

    • 단위 테스트는 개발 단계 초기에 문제를 발견하게 도와준다.
    • 단위 테스트는 개발자가 나중에 코드를 리펙토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.
    • 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있다.
    • 단위 테스트는 시스템에 대한 실제 문서를 제공한다.
      (즉, 단위 테스트 자체가 문서로 사용할 수 있다.)

스프링 부트 실행 Application 클래스 작성

  • @SpringBootApplication

    • 프로젝트 최상단에 위치하는 클래스
    • 스프링 부트는 @SpringBootApplication이 있는 위치부터 설정을 읽어간다.
    • 스프링 부트의 자동설정, 스프링 Bean 읽기와 생성을 자동으로 설정
  • SpringApplication.run

    • 내장 WAS (Web Application Server, 웹 어플리케이션 서버) 실행
    • 스프링 부트로 만들어진 Jar 파일(실행 사능한 Java 패키징 파일)로 실행 가능
  • 내장 WAS를 사용하는 이유

    • 항상 서버에 톰캣을 설치할 필요가 없다.
    • 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있다.
    • 외부 WAS를 쓸 경우 모든 서버는 WAS의 종류와 버전, 설정을 일치시켜야 한다.
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

컨트롤러 관련 클래스를 저장할 패키지 생성

  • 패키지 및 컨트롤러 생성
    • web
    • HelloController
      • @RestController
        • 컨트롤러를 JSON 데이터 타입을 반환하는 컨트롤러로 설정
        • 기존 Spring Framework의 경우 @ResponseBody를 각 메서드에 선언
      • @GetMapping
        • Http Method인 Get의 요청을 받을 수 있는 API 설정
        • 기존 Spring Framework의 경우 @RequestMapping(method= RequestMethod.GET)으로 사용
        • "/hello"로 요청이 오는 경우 문자열 hello을 반환
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

Test API 작성

  • HelloController를 테스트 할 HelloControllerTest 클래스 작성
    1. @RunWith(SpringRunner.class)
      • 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행
      • SpringRunner는 스프링 실행자
      • 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.
    2. @WebMvcTest
      • 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션
      • @Controller, @ControllerAdvice 등을 사용할 수 있다.
      • @Service, @Component, @Repository 등은 사용할 수 없다.
    3. @Autowired
      • 스프링이 관리하는 빈(Bean)을 주입
    4. MockMvc mvc
      • 웹 API 테스트 시 사용
      • 스프링 MVC 테스트의 시작점
      • HTTP GET, POST 등에 대한 API를 테스트 할 수 있다.
    5. mvc.perform(get("/hello"))
      • MockMvc를 통해 /hello 주소로 Http GET 요청 가능
      • 체이닝을 지원하여 여러 검증 기능을 이어서 선언할 수 있다.
    6. .andExcept(status().isOk())
      • mvc.perform의 결과를 검증
      • HTTP Header의 Status를 검증
    7. .andExcept(content().string(hello))
      • mvc.perform의 결과를 검증
      • 응답 본문의 내용을 검증
    8. .andDo(print())
      • MockHttpServletRequest
      • Handler
      • Async
      • Resolved Exception
      • ModelAndView
      • FlashMap
      • MockHttpServletResponse 등의 내용의 결과 값을 확인 할 수 있다.
@RunWith(SpringRunner.class)
@WebMvcTest
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc ;

    @Test
    public void return_hello() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}

테스트 코드 검증

  • 테스트 코드 결과 값 확인

수동 실행으로 검증 (이슈)

  • 오라클 설치로 인한 포트 중복 이슈

  • SpringBoot 실행 시 Apache Tomcat의 기본 포트는 8080이기 때문에 포트를 변경하여 실행

application.properties 파일 생성

  • application.properties 파일 내에 apache tomcat port 수정을 위한 설정
# server setting
server.port=8085

port 중복으로 인한 이슈 처리완료 및 /hello URL에 접근하여 "hello" 확인

SpringBoot 실행 로그 확인
URL 접근하여 페이지 확인

+ Recent posts