[TIL - 0914] 갑자기 궁금해진 톰캣, 스프링MVC 테스트
톰캣은 어떻게 동작하나* 갑자기 궁금해져서 여러 자료를 통해서 알아보게 됨
- HTTP 메세지 추상화(자바의 abstract와 다른 뜻의 추상화) 객체 생성
- 요청 처리할 서블릿 찾기 - web.xml(Deployment Descriptor) 참고, 스프링MVC도 초기에 xml을 사용했지만 어노테이션 - 리플렉션 API로 xml 사용을 하지않아도 되도록 함
- 컨테이너에 요청 - 인스턴스 생성 or 리턴
- 처리 후 응답
서블릿 컨테이너
- 서블릿은 자바의 HTTP 처리 추상화 표준 : 서블릿을 구현하여 서버 개발자가 HTTP 요청에 대한 처리 응답을 만들 수 있음, JavaEE 마다 각 서블릿 버젼이 있음, 구현체 하나하나가 자바로 만들어진 웹어플리케이션
- Servlet : interface
- HttpServlet : abstract class
- 서블릿 없이도 당연 HTTP 요청에 대한 처리 가능(추상화 해놓은 것이기 때문에) : HTTP 메세지를 직접 처리해봤던 프로젝트
- 톰캣을 비롯한 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());
}
}