Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

[스프링 부트3 백엔드 개발자 되기] - 2일차 본문

공부/백엔드

[스프링 부트3 백엔드 개발자 되기] - 2일차

Hannah0226 2024. 2. 2. 21:31

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()));
    }
}
  1. perform() 메서드: 요청을 전송하는 역할을 함. 결과로 ResultActions 객체를 받으며, ResultActions 객체는 반환값을 검증하고 확인하는 andExpect() 메서드를 제공함.
  2. accept() 메서드: 요청을 보낼 때 무슨 타입으로 응답을 받을지 결정하는 메서드
  3. andExpect() 메서드: 응답을 검증. TestController에서 만든 API는 응답으로 OK(200)을 반환하므로 이에 해당하는 메서드인 isOK를 사용해 응답코드가 OK(200)인지 확인함.
  4. jsonPath("$[0].${필드명}): JSON 응답값의 값을 가져오는 역할을 하는 메서드. 0번째 배열에 들어있는 객체의 id, name값을 가져오고, 저장된 값과 같은지 확인함.