인프런 커뮤니티 질문&답변

대영님의 프로필 이미지
대영

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

Hello 서블릿

service() 메서드 질문있습니다.

작성

·

39

0

protected service()를 오버라이딩 해주는 이유가

서블릿 컨테이너가 Servlet 인터페이스와 의존관계에 있기 때문에, Http 요청이 오면 Servlet.service()와 같이 service를 호출하면

HttpServlet 클래스에 오버라이딩된 public service()가 실행되고

public service()에서 protected service()를 호출하니까

protected service()를 저희가 원하는 동작을 하도록 오버라이딩 해서 사용하는 거 맞을까요?

답변 2

1

안녕하세요. 대영님, 공식 서포터즈 y2gcoder입니다.

네 이해하신 내용이 맞습니다!

서블릿 컨테이너는 HelloServlet 에서 오버라이딩한 protected public service()를 실행하게 됩니다!

image.png

 

 

감사합니다.

대영님의 프로필 이미지
대영
질문자

감사합니다!!

 

대영님의 프로필 이미지
대영
질문자

저 헷갈리는게 한 가지 있습니다.

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 클래스는 이 메서드를 오버라이딩하여, HttpServletRequestHttpServletResponse 객체를 인자로 받는 protected service() 메서드를 호출합니다. 따라서, protected service()를 오버라이드 함으로써 개발자가 원하는 HTTP 요청에 대한 처리를 구현할 수 있습니다.

이와 관련하여 더 자세한 설명은 다음 링크에서 확인하실 수 있습니다:
- service 메소드를 public으로 가져오면 안되는 이유가 있나요?
- service 오버라이드 할때 protected

위 답변들은 서블릿 동작 원리에 대해 보다 깊이 있는 설명을 제공하여, 대영님께서 궁금해하시는 부분에 대한 이해를 돕고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

대영님의 프로필 이미지
대영

작성한 질문수

질문하기