본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024 Spring Boot 스터디] 정호용 #2 주차 - 스프링부트 구조 이해 및 테스트

반응형

3장 스프링 부트 구조 이해하기

스프링부트에는 3가지 계층이 있다.

1. 프레젠테이션 계층

HTTP 요청을 받고, 이 요청을 비즈니스 계층으로 전송하는 역할

컨트롤러가 바로 프레젠테이션 계층 역할을 한다. 

 

2. 비즈니스 계층

모든 비즈니스 로직을 처리한다. 비즈니스 로직은 서비스를 만들기 위한 로직을 말한다.

웹사이트에서 벌어지는 모든 작업을 처리한다.

 

3. 퍼시스턴스 계층

모든 데이터베이스 관련 로직을 처리한다.

 

 

스프링부트의 디렉터리

1. main

실제 코드를 작성하는 공간이다.

프로젝트 실행에 필효한 소스코드, 리소스 파일이 모두 여기 들어있다.

 

2. test

프로젝트의 소스 코드를 테스트할 목적의 코드, 리소스 파일이 들어있다.

 

3. build.gradle

빌드를 설정하는 파일. 의존성이나 플러그인 설정 등

 

4. settings.gradle

빌드할 프로젝트의 정보를 설정하는 파일

 

main 디렉터리 구성하기

1단계. templates 디렉터리 만들기

 

2단계. static 디렉터리

이 디렉터리는 JS, CSS 같은 정적 파일을 넣는 용도로 사용됨.

 

3단계. application.yml파일 생성

이 파일은 스프링 부트 설정을 할 수 있다. 이 파일은 스프링 부트 서버가 실행되면 자동으로 로딩되는 파일이다.

 

스프링 부트 프로젝트 발전시키기

1단계. build.gradle에 의존성 추가하기

 

의존성 구성

- implementation : 프로젝트 코드가 컴파일 시점, 런타임 시점에 모두 해당 라이브러리를 필요로 할때 사용

- testImplementation : 프로젝트의 테스트 코드를 컴파일하고 실행할 때만 필요한 의존성 설정

- runtimeOnly : 런타임(실행)에만 필요하고 컴파일에 필요하지 않은 의존성 설정

- compileOnly : 컴파일에만 필요함

- annotationProcessor : 컴파일 시 애너테이션 처리할 때 사용

 

2단계. gradle탭에서 새로고침

 

프레젠테이션, 서비스, 퍼시스턴스 계층 만들기

1단계. TestController.java에서 test()메서드 삭제하고 새 코드 추가

 

2단계. TestService.java 파일 생성

 

3단계. Member.java 파일 생성

 

4단계. MemberRepository.java 인터페이스 생성

 

임포트 오류 해결

alt+enter 를 눌러 해결

혹은

https://github.com/shinsunyoung/springboot-developer-2rd/

 

GitHub - shinsunyoung/springboot-developer-2rd: 📚 <스프링부트 3 백엔드 개발자 되기 2판> 예제코드

📚 <스프링부트 3 백엔드 개발자 되기 2판> 예제코드. Contribute to shinsunyoung/springboot-developer-2rd development by creating an account on GitHub.

github.com

여기서 코드 보며 해결

 

작동 확인하기

1단계. data.sql 파일 생성

 

2단계. application.yml 변경 및 재실행

 

3단계. CREATE TABLE 실행 잘 되는지 확인

 

4단계. 포스트맨으로 HTTP 요청 시도

데이터 확인 성공

 

 

4장. 스프링 부트 3와 테스트

테스트 코드란?

작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드

테스트 코드는 test 디렉터리에서 작업

 

테스트 코드의 다양한 패턴 중 given-when-then 패턴 사용

이 패턴은 테스트코드를 세 단계로 구분해 작성하는 방식이다.

1. given : 테스트 실행 준비 단계

2. when : 테스트 진행 단계

3. then : 테스트 결과 검증 단계

 

스프링 부트3와 테스트

JUnit이란?

자바 언어를 위한 단위 테스트 프레임워크이다.

단위 테스트를 작성하고 테스트하는 데 도움을 준다.

 

JUnit로 테스트 코드 만들기

1단계. JUnitTest 파일 생성

 

2단계. 동작 확인

 

3단계. 테스트 케이스 추가

테스트 실패 케이스 추가 시 기댓값과 실제로 받은 값을 비교해서 알려줌

 

 

4단계. JUnitCycleTest.java 파일 생성

 

애너테이션 모음

@BeforeAll

전체 테스트 시작 전 처음으로 한 번만 실행. 메서드 static으로 선언

 

@BeforeEach

테스트 케이스 시작 전 매번 실행. static이 아니어야 함

 

@AfterAll

전체 테스트 마치고 종료 전에 한 번만 실행

 

@AfterEach

각 테스트 케이스 종료 전 매번 실행. static이 아니어야 함

 

5단계. 실행

실행 완료

 

AssertJ로 검증문 가독성 높이기

Assertions.assertEquals(sum, a+b);

가독성이 나쁜 예시

 

assertThat(a+b).isEqualTo(sum);

AssertJ를 이용하여 가독성을 향상시킨 예시

 

AssertJ에서는 다양한 메서드를 제공한다.

메서드 이름 설명
isEqualTo(A) A와 같은지
isNotEqualTo(A) A와 다른지
contains(A) A값을 포함하는지
doesNotContain(A) A값을 포함하지 않는지
startsWith(A) 접두사가 A인지
endsWith(A) 접미사가 A인지
isEmpty() 비어있는 값인지
isNotEmpty() 비어있지 않은 값인지
isPositive() 양수인지
isNegative() 음수인지
isGreaterThan(1) 1보다 큰지
isLessThan(1) 1보다 작은지

 

제대로 테스트 코드 작성해보기

1단계. TestController.java 열어서 Create Test 누르기

Create Test 를 누르고

 

확인을 누르면 자동으로 테스트 파일이 생긴다.

 

 

2단계. 파일 작성

위와 같이 코드를 작성해 준다.

 

@SpringBootTest -> 위 애너테이션은 메인 애플리케이션 클래스에 추가하는 애너테이션인

@SpringBootApplication이 있는 클래스를 찾고,

그 클래스에 포함되어 있는 빈을 찾은 다음,

테스트용 애플리케이션 컨텍스트 라는 것을 만든다.

 

@AutoConfigureMockMvc -> MockMvc를 생성하고 자동으로 구성하는 애너테이션이다.

MockMvc는 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC환경을 만들어 요청, 전송, 응답 기능을 제공한다.

 

@BeforeEach -> 테스트를 실행하기 전에 실행하는 메서드에 적용하는 애너테이션이다.

여기서는 MockMvcSetUp() 메서드를 실행해 MockMvc를 설정해 준다.

 

@AfterEach -> 테스트를 실행한 이후실행하는 메서드에 적용하는 애너테이션이다.

여기서는 CleanUp() 메서드를 실행해 member테이블에 있는 데이터를 모두 삭제해 준다.

 

 

3단계. 코드 추가

 

위와 같이 추가코드를 작성해 준다. 필요한 라이브러리도 임포트 해 준다.

 

1. perform() -> 요청을 전송하는 역할

결과로 ResultActions 객체를 받으며, ResultActions 객체는 반환값을 검증하고 확인하는 andExpect() 메서드를 제공함

 

2. accept() -> 요청을 보낼 때 무슨 타입으로 응답을 받을 지 결정

JSON, XML 등 다양함.

 

3. andExpect() -> 응답을 검증

TestController 에서 만든 API 는 응답으로 OK(200) 을 반환하므로 

메서드 isOK()를 사용해 응답 코드가 OK(200)인지 확인한다.

 

4. jsonPath("$[0].${필드명}") -> JSON응답값의 값을 가져오는 역할을 함.

0번째 배열에 들어있는 객체의 id, name값을 가져오고, 저장된 값과 같은지 확인

 

HTTP 주요 응답 코드

코드 매핑 메서드 설명
200 OK isOk() HTTP 응답 코드가 200 OK 인지 검증
201 Created isCreated() HTTP 응답 코드가 201 Created 인지 검증
400 Bad Request isBadRequest() HTTP 응답 코드가 400 Bad Request 인지 검증
403 Forbidden isForbidden() HTTP 응답 코드가 403 Forbidden 인지 검증
404 Not Found isNotFound() HTTP 응답 코드가 404 Not Found 인지 검증
400번대 응답코드 is4xxClientError() HTTP 응답 코드가 400번대 응답코드 인지 검증
500 Internal Server Error isInternalServerError() HTTP 응답 코드가 500 Internal Server Error 인지 검증
500번대 응답코드 is5xxClientError() HTTP 응답 코드가 500번대 응답코드 인지 검증

 

 

lombok이 없다면 설치해 준다. lombok은 getter, setter, 생성자와 같이 클래스를 만들 때 반복하는 코드들을 줄여주기 위한 라이브러리이다.

Settings -> Plugins -> Marketplace 에서 설치해 주도록 하자.

 

 

이 테스트에도 Given - When - Then 패턴이 적용되었다.

Given 멤버 저장함
When 멤버 리스트 조회하는 API 호출
Then 응답 코드가 200 OK이고, 반환값중에 0번째 요소의 id와 name이 저장된 값과 같은지 확인함.

 

4단계. 테스트 실행

실행한다.

 

성공

반응형