작성
·
75
답변 2
1
저 헷갈리는게 한 가지 있습니다.
HelloServlet이 HttpServlet을 상속받고 있고, HelloServlet에서 HttpServlet의 protected service()를 오버라이딩 하고 있는데
Http 요청이 오면 서블릿 컨테이너는 HelloServlet 인스턴스를 만들고, service()를 호출할텐데
이 때, HttpServlet의 public service() 오버라이딩 된 protected service() 중 어떤 service가 호출되는건가요?
저는 HttpServlet의 public service()에서 protected service()를 호출하기 때문에 protected service()를 오버라이딩 하고, 서블릿 컨테이너는 HttpServlet의 service()를 호출한다고 이해했습니다.
근데 HelloServlet은 public service()와 protected service()를 둘 다 가지고 있으니까 서블릿 컨테이너가 service를 호출하면 어떻게 public service()가 호출되는건지 잘 이해가 되지 않네요..
제가 답변을 모호하게 드린 것 같습니다! 죄송합니다ㅜ
이 부분은 상속 관계에 대해서 생각해보시면 더 좋을 것 같습니다!
HelloServlet 기준으로 public void service()는 오버라이드를 하지 않았기 때문에 HttpServlet 의 public void service()를 호출할 것입니다. 이 때 내부에서는 this.service(request, response) 를 호출하는데요.
이 this.service()는 해당 인스턴스의 protected void service()를 호출하기 때문에, 오버라이딩 된 HelloServlet 의 protected void service()를 호출할 거라고 이해해주시면 감사하겠습니다!
친절한 답변 감사합니다!!
마지막으로 한 가지 질문이 있는데
서블릿 컨테이너가 객체들을 생성할 때, 해당 객체의 최상위 타입으로 객체를 생성한다고 생각해도 될까요?
예를 들어 서블릿 컨테이너가 HttpServletRequest 객체를 생성하는데 출력을 찍어보니 실제 객체는 RequestFacade인 것 같더라고요
그래서 RequestFacade의 최상위 타입인 ServletRequest request = new RequestFacade() 이런식으로 컨테이너가 객체를 생성한다고 생각해도 될까요??
1
안녕하세요, 인프런 AI 인턴입니다. 대영님.
서블릿의 service()
메서드를 오버라이딩하는 이유에 대해 설명드리겠습니다.
클라이언트로부터 HTTP 요청이 들어오면 서블릿 컨테이너는 Servlet
인터페이스에 정의된 service()
메서드를 호출합니다. HttpServlet
클래스는 이 메서드를 오버라이딩하여, HttpServletRequest
와 HttpServletResponse
객체를 인자로 받는 protected
service()
메서드를 호출합니다. 따라서, protected service()
를 오버라이드 함으로써 개발자가 원하는 HTTP 요청에 대한 처리를 구현할 수 있습니다.
이와 관련하여 더 자세한 설명은 다음 링크에서 확인하실 수 있습니다:
- service 메소드를 public으로 가져오면 안되는 이유가 있나요?
- service 오버라이드 할때 protected
위 답변들은 서블릿 동작 원리에 대해 보다 깊이 있는 설명을 제공하여, 대영님께서 궁금해하시는 부분에 대한 이해를 돕고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다!!