공hannah부
[스프링 부트3 백엔드 개발자 되기] - 2일차 본문
2장 - 스프링부트3 시작하기
2.1 @SpringBootAllication 이해하기
@SpringBootApplication
public class SpringBootStudyApplication {
public static void main(String[] args){
SpringApplication.run(SpringBootStudyApplication.class, args);
}
}
이 클래스는 자바의 main() 메서드와 같은 역할을 한다.
@SpringBootAllication 애너테이션: 스프링 부트 사용에 필요한 기본 설정을 해줌
- 해당 애너테이션의 구성을 보면 @SpringBootConfiguragion, @CompoenetScan, @EnableAutoConfiguration이 있다.
- @SpringBootConfiguragion: 스프링부트 관련 설정을 나타내는 애너테이션
- @CompoenetScan: 사용자가 등록한 빈을 읽고 등록하는 애너테이션
- @EnableAutoConfiguration: 스프링부트 자동 구성을 활성화하는 애너테이션
SpringApplication.run() 메서드: 애플리케이션 실행
2.2 테스트 컨트롤러 살펴보기
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "Hello world";
}
}
@RestController: 라우터 역할을 하는 애너테이션으로, 라우터란 HTTP 요청과 메서드를 연결하는 장치를 말함. 이 애너테이션이 있어야 클라이언트의 요청에 맞는 메서드 실행 가능
→ 지금의 경우 TestController를 라우터로 지정해 /test라는 GET요청이 왔을 때 test() 메서드를 실행하도록 구성한 것임
3장 - 스프링부트3 구조 이해하기
스프링부트는 프레젠테이션, 비즈니스, 퍼시스턴스 계층으로 구성됨
프레젠테이션 계층: HTTP 요청을 받고 이 요청을 비즈니스 계층으로 전송하는 역할 → "컨트롤러"
비즈니스 계층: 모든 비즈니스 로직(서비스를 만들기위한 로직)을 처리. ex. 데이터를 처리하기 위한 로직, 예외처리 로직, 프로세스를 구현하기 위한 로직 등 → "서비스"
퍼시스턴스 계층: 모든 데이터베이스 관련 로직을 처리 → "레포지토리"
4장 - 스프링부트3와 테스트
단위테스트: 작성한 코드가 의도대로 작동되는지 작은 단위로 검증하는 것 (단위는 보통 메서드)
given-when-then: 테스트 코드를 3단계로 구분해 작성하는 방식
- given: 테스트 실행을 준비하는 단계
- when: 테스트를 진행하는 단계
- then: 테스트 결과를 검증하는 단계
4.1 JUnit으로 단위 테스트 코드 만들기
@Test
테스트 메서드
@DisplayName("테스트 이름")
테스트 이름 지정
@BeforAll
전체 테스트를 시작하기 전에 처음으로 한 번만 실행. 전체 테스트 실행 주기에서 한 번만 호출되어야 하기 때문에 메서드를 static으로 선언해야 함
ex) 데이터베이스를 연결해야 하거나 테스트 환경을 초기화할 때 사용
@BeforEach
테스트 케이스를 시작하기 전에 매번 실행. 각 인스턴스에 대해 메서드를 호출해야 하므로 메서드는 static이 아니어야 함
ex) 테스트 메서드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을 때 사용
@AfterAll
전체 테스트를 마치고 종료하기 전에 한 번만 실행. 전체 테스트 실행 주기에서 한 번만 호출되어야 하기 때문에 메서드를 static으로 선언해야 함
ex) 데이터베이스 연결을 종료할 때나 공통적으로 사용하는 자원을 해제할 때 사용
@AfterEach
각 테스트 케이스를 종료하기 전 매번 실행. 각 인스턴스에 대해 메서드를 호출해야 하므로 메서드는 static이 아니어야 함
ex) 테스트 이후에 특정 데이터를 삭제해야 하는 경우 사용
4.2 AssertJ로 검증문 가독성 높이기
AssertJ: JUnit과 함께 사용해 검증문의 가독성을 높여주는 라이브러리
예시 코드
Assertions.assertEquals(sum, a+b);
→ 기댓값과 비교값이 잘 구분되지 않는 Assertion 예
assertThat(a+b).isEqualTo(sum);
→ 가독성이 좋은 AssertJ 예
자주 사용하는 메서드

4.3 테스트코드 작성해보기
클래스 이름 위에 마우스 커서 놓고 Alt + Enter 누르면 테스트 메소드 생성 가능
@SpringBootTest
@AutoConfigureMockMvc
class TestControllerTest {
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private MemberRepository memberRepository;
@BeforeEach
public void mockMvcSetUp(){
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@AfterEach
public void cleanUp(){
memberRepository.deleteAll();
}
}
- @SpringBootTest: 메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpringBootApplication이 있는 클래스를 찾고, 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트를 만든다.
- @AutoConfigureMockMvc: MockMvc를 생성하고 자동으로 구성하는 애너테이션. MockMvc는 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC 환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스이다.
- @BeforeEach: 테스트를 실행하기 전에 실행하는 메서드에 적용하는 애너테이션으로, 여기서는 MockMvcSetUp() 메서드를 실행해 MockMvc를 설정한다.
- @AfterEach: 테스트 실행 이후 실행하는 메서드에 적용하는 애너테이션으로, 여기서는 cleanUp() 메서드를 실행해 member 테이블에 있는 데이터들을 모두 삭제한다.
//생략
@DisplayName("getAllMembers: 아티클 조회에 성공한다.")
@Test
public void getAllMembers() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
// when
final ResultActions result = mockMvc.perform(get(url) // 1
.accept(MediaType.APPLICATION_JSON)); // 2
// then
result
.andExpect(status().isOk()) // 3
//4
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
}
- perform() 메서드: 요청을 전송하는 역할을 함. 결과로 ResultActions 객체를 받으며, ResultActions 객체는 반환값을 검증하고 확인하는 andExpect() 메서드를 제공함.
- accept() 메서드: 요청을 보낼 때 무슨 타입으로 응답을 받을지 결정하는 메서드
- andExpect() 메서드: 응답을 검증. TestController에서 만든 API는 응답으로 OK(200)을 반환하므로 이에 해당하는 메서드인 isOK를 사용해 응답코드가 OK(200)인지 확인함.
- jsonPath("$[0].${필드명}): JSON 응답값의 값을 가져오는 역할을 하는 메서드. 0번째 배열에 들어있는 객체의 id, name값을 가져오고, 저장된 값과 같은지 확인함.
'공부 > 백엔드' 카테고리의 다른 글
[도메인 주도 개발 시작하기] - 1장 도메인 모델 시작하기 (0) | 2024.03.10 |
---|---|
[스프링 부트3 백엔드 개발자 되기] - 3일차 (0) | 2024.03.03 |
[스프링 부트3 백엔드 개발자 되기] - 1일차 (0) | 2024.02.02 |
DDD (1) | 2023.11.21 |
인증 방식의 종류 & JWT (0) | 2023.11.02 |