Spring & SpringBoot 9

@SpringBootTest, @AutoConfigureMockMvc 사용하여 API Flow 테스트 케이스 작성하기

앞서 주로 비즈니스 클래스의 메서드들이 기능에 맞게 잘 동작하는지 확인하는 테스트인 단위 테스트를 위주로 공부했다. 하지만 API를 개발할 때 주로 Controller, Service, repository로 계층을 나누어 각각의 역할을 수행하도록 구현하기 때문에 각 계층별로 흐름이 잘 연결이 되는지 검증이 필요하다. 이번에는 전체적인 API의 흐름을 테스트하는 테스트 케이스를 작성해보자. 위의 코드는 이메일과 이름, 핸드폰 번호를 입력받아서 회원가입을 진행하는 API에 대한 Controller를 테스트하는 코드이다. 아래에서 하나하나 살펴보자. 먼저 위 코드처럼 테스트를 하기 위해서는 Cson이라는 객체를 Json으로 변환해주는 라이브러리를 추가해주어야 한다. implementation 'com.goog..

JUnit Assertion 대신 Hamcrest를 이용하여 테스트 코드 작성하기

Hamcrest Hamcrest는 JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다. Assertion을 위한 Matcher가 자연스러운 문장으로 이어지므로 가독성이 향상된다. 테스트 실패 메시지를 이해하기 쉽다. 다양한 Matcher를 제공한다. 이러한 이유로 JUnit에서 지원하는 Assertion 메서드보다 많이 사용된다. Hamcrest의 Matcher 이용하기 assertionTest1()은 JUnit의 Assertion을 이용하여 작성한 테스트 코드이다. assertionTest2()는 Hamcrest의 Matchers를 이용하여 작성한 테스트 코드이다. 두 코드 모두 같은 테스트를 하고 있는 테스트이다. 하지만 Assertion을 사용하는 부분에서 차이..

JUnit Assertion 메서드, 테스트 케이스 작성 애너테이션

테스트 케이스 작성에 실제 사용되는 메서드들을 간략하게 정리해본다. JUnit을 사용하지 않고도 테스트 케이스를 작성할 수는 있지만 JUnit을 사용하면 테스트 케이스를 돌리기 위한 main 메서드를 따로 작성하지 않아도 되고, 편리한 검증 api들을 제공해 빠른 테스트 케이스 작성을 가능하게 해준다. JUnit JUnit은 Java로 만들어진 애플리케이션을 테스트하기 위한 오픈 소스 테스트 프레임워크로 가장 많이 사용되고 있는 테스트 프레임워크이다. 스프링부트 또한 JUnit을 디폴트 프레임워크로 채택하고 있다. 스프링부트 프로젝트를 생성하면 아래 dependency가 기본으로 포함되어 있는데, 여기에 JUnit도 포함되기에 별다른 설정 없이 사용할 수 있다. testImplementation 'org..

여러 테스트 방식, 단위테스트의 FIRST 원칙, GWT(given-when-then)

그동안 프로젝트를 하는 동안 따로 테스트 코드를 작성하지 않고 하나의 기능이 완료된 후에 postman을 통해서 api를 실행해보는 방식으로 테스트를 진행해왔다. 이렇게 할 경우, 하나의 기능이 모두 완성된 상태에서 테스트가 진행되기 때문에 만약 에러가 발생한다면 에러가 발생하는 부분을 찾는데 시간이 오래 걸릴 뿐만 아니라 정밀하게 테스트를 하는 데 있어서 한계가 있었다. 그래서 실제 서버를 배포한 후에 에러를 발견해서 고친 적도 여러 번이다. 점점 테스트 케이스를 만들고 테스트 코드를 작성하는 습관을 들여야겠다는 생각을 하게 되어 이번에 테스트 코드를 작성하는 데 있어서 필요한 내용을 간략하게 정리하고 가려고 한다. 여러 테스트 방식 기능 테스트 기능 테스트는 주로 애플리케이션을 사용하는 사용자 입장에..

JDBC, ORM 개념

JDBC(Java Database Connectivity) JDBC는 Java 기반 애플리케이션에서 데이터베이스를 사용할 수 있도록 해주는 표준 사양/명세이다. JDBC API를 사용해 다양한 데이터베이스와 연동할 수 있다. 비록 데이터 액세스 기술의 기본이 되는 저수준 API이기 때문에 직접적으로 사용할 일은 매우 드물다. 스프링은 Spring Data JDBC나 Spring Data JPA 같은 기술을 제공해 더욱 편리하게 데이터 엑세스 로직을 구현할 수 있기 때문이다. 하지만 이러한 기술들도 내부적으로는 JDBC를 이용하기 때문에 알아두면 도움이 된다. JDBC 동작 흐름 Java 애플리케이션에서 JDBC API를 사용하면 JDBC 드라이버를 로딩한 후 데이터베이스와 연결하고 엑세스하는 단순한 구조..

스프링 컨테이너(Spring Container)

스프링 컨테이너(Spring Container) 스프링에서는 스프링 컨테이너를 통해 객체를 관리한다. 그리고 스프링 컨테이너를 통해 관리되는 객체를 빈(Bean)이라고 한다.스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트로 애플리케이션 빈의 생명주기(생성, 관리, 제거)를 담당한다. 스프링 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다. 그리고 스프링 컨테이너를 통해 원하는 만큼의 객체를 가질 수 있다.ApplicationContext를 스프링 컨테이너라고 하며, 다형성을 적용해 인터페이스로 구현되어 있다. 스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다. 스프링 컨테이너가 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한..

Spring & SpringBoot 2022.10.19

IoC(Inversion of Control) / DI(Dependency Injection)

IoC (Inversion of Control) 애플리케이션의 흐름의 주도권이 뒤바뀐 것을 말한다. 기존에는 개발자가 애플리케이션의 흐름을 제어했다면, 흐름의 주도권을 개발자가 아닌 Spring과 같은 프레임워크에게 넘기는 것이다. 그렇다면 제어의 흐름이란 무엇일까? 쉽게 말해서 개발자가 작성한 코드를 순차적으로 실행하는 것을 말한다. 그럼 흐름의 주도권이 바뀌었다는 말은 개발자가 작성한 코드를 순차적으로 실행하는 것이 아니라 개발자가 아닌 외부에서 코드를 주입해준다고 이해할 수 있다. 다른 예시로 보면 Library의 경우는 애플리케이션의 흐름의 주도권이 개발자에게 있고, Framework는 애플리케이션의 흐름의 주도권이 Framework에 존재한다. 이때 프레임워크에 IoC원칙이 적용된 것이라 이해할..

Spring & SpringBoot 2022.10.19

[Error] SpringBoot에서 JWT 사용 시 에러 (java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter)

SpringBoot 프로젝트를 진행하던 중 그동안 잘 써왔던 JWT에서 에러가 발생했다. 받아온 JWT에서 정보를 파싱하는 과정에서 유효하지 않은 JWT이면 에러 메시지를 띄워주도록 만들었는데 그냥 서버가 죽어버렸다. Error 내용 java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter Error 원인 JDK 11에서 해당 모듈이 자동 참조되지 않아서 발생하는 문제라고 한다. 해결 방법 'build.gradle' 파일에 아래 코드를 추가해 주었다. implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' https://mvnrepository.com/artifac..

Spring & SpringBoot 2022.09.23

[Error] SpringBoot -Swagger 연결 에러(org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException)

API를 개발하고 나면 해야하는 일은 바로 API 명세서 작성이다. API 명세서를 작성하는데 있어서 미루고 미루다보면 나중에 산더미처럼 쌓이기 마련이다,, 그래서 swagger를 이용해서 자동 API 명세서 작성을 도전해보려고 했는데! 아래와 같은 문제가 발생했다. Error 내용 org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 아래는 에러 내역의 일부이다. org.springframework.context.ApplicationContextException: ..

Spring & SpringBoot 2022.04.04