[TIL - 0914] 갑자기 궁금해진 톰캣, 스프링MVC 테스트

톰캣은 어떻게 동작하나* 갑자기 궁금해져서 여러 자료를 통해서 알아보게 됨

  1. HTTP 메세지 추상화(자바의 abstract와 다른 뜻의 추상화) 객체 생성
  2. 요청 처리할 서블릿 찾기 - web.xml(Deployment Descriptor) 참고, 스프링MVC도 초기에 xml을 사용했지만 어노테이션 - 리플렉션 API로 xml 사용을 하지않아도 되도록 함
  3. 컨테이너에 요청 - 인스턴스 생성 or 리턴
  4. 처리 후 응답

서블릿 컨테이너

  • 서블릿은 자바의 HTTP 처리 추상화 표준 : 서블릿을 구현하여 서버 개발자가 HTTP 요청에 대한 처리 응답을 만들 수 있음, JavaEE 마다 각 서블릿 버젼이 있음, 구현체 하나하나가 자바로 만들어진 웹어플리케이션
  • 톰캣을 비롯한 Jetty 등 서블릿 컨테이너 기능을 가지고 있음
  • 서블릿 컨테이너 필요성 : 스프링빈 컨테이너에서 싱글톤 스코프(다른 스코도 있지만)로 빈을 관리하는 이유와 같다고 이해하고 있음 - 개발자가 HTTP 처리를 담당하는 서블릿(타입)의 객체를 생성, 사용, 제거 등 관리하지않아도 대신해줌
    • HTTP 처리 전반에 대한 추상화 라고 생각이 됨
    • 톰캣만 써보았기 때문에 톰캣만 말하자면 톰캣은 HTTP 요청이 오면 쓰레드 생성해서(무한정 생성 x - 풀에서 관리하고 있으면서 빼서 쓰는 형태) 서블릿 처리 : 즉, 공유 객체 개념(불필요한 상태값을 서블릿 구현 시 넣으면 안된다는 것)

스프링MVC 테스트

  • 기존에는 TestRestTemplate로만 테스트를 했었는데, 백기선님 영상을 보다보니 MockMvc를 통해서 테스트 하는 방법을 보고 한번 따라해봄 : 간단하게 HTTP 메세지를 빌드할 수 있는 장점
    • 단순히 이런게 있다 차원에서 리뷰!
@GetMapping("/{id}")
public Book getABook(@PathVariable Long id) {
    return new Book(id, "ㅎㅇ");
}

@RunWith(SpringRunner.class)
@WebMvcTest(BookController.class)
public class BookControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void getABook() throws Exception {
        mockMvc.perform(get("/books/1"))
                .andExpect(status().isOk());
    }
}