inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Hello 서블릿

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

182

eoyeong

작성한 질문수 57

0

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

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

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

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

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

spring mvc

답변 2

1

y2gcoder

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

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

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

image.png

 

 

감사합니다.

1

eoyeong

감사합니다!!

 

1

eoyeong

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

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()가 호출되는건지 잘 이해가 되지 않네요..

1

y2gcoder

제가 답변을 모호하게 드린 것 같습니다! 죄송합니다ㅜ
이 부분은 상속 관계에 대해서 생각해보시면 더 좋을 것 같습니다!

HelloServlet 기준으로 public void service()는 오버라이드를 하지 않았기 때문에 HttpServlet 의 public void service()를 호출할 것입니다. 이 때 내부에서는 this.service(request, response) 를 호출하는데요.

이 this.service()는 해당 인스턴스의 protected void service()를 호출하기 때문에, 오버라이딩 된 HelloServlet 의 protected void service()를 호출할 거라고 이해해주시면 감사하겠습니다!

1

eoyeong

친절한 답변 감사합니다!!

마지막으로 한 가지 질문이 있는데

서블릿 컨테이너가 객체들을 생성할 때, 해당 객체의 최상위 타입으로 객체를 생성한다고 생각해도 될까요?

예를 들어 서블릿 컨테이너가 HttpServletRequest 객체를 생성하는데 출력을 찍어보니 실제 객체는 RequestFacade인 것 같더라고요
그래서 RequestFacade의 최상위 타입인 ServletRequest request = new RequestFacade() 이런식으로 컨테이너가 객체를 생성한다고 생각해도 될까요??

1

y2gcoder

넵, 저도 아래와 같이 이해하고 사용하고 있습니다!

서블릿 컨테이너는 실제 구현체의 인스턴스를 생성하되 해당 객체를 인터페이스나 상위 타입으로 참조해서 사용한다.

1

eoyeong

정말 감사합니다!!

 

이렇게 생각하니 이해가 안되던 것들이 이해가 됐습니다!!

 

감사합니다 :)

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 대영님.

서블릿의 service() 메서드를 오버라이딩하는 이유에 대해 설명드리겠습니다.
클라이언트로부터 HTTP 요청이 들어오면 서블릿 컨테이너는 Servlet 인터페이스에 정의된 service() 메서드를 호출합니다. HttpServlet 클래스는 이 메서드를 오버라이딩하여, HttpServletRequestHttpServletResponse 객체를 인자로 받는 protected service() 메서드를 호출합니다. 따라서, protected service()를 오버라이드 함으로써 개발자가 원하는 HTTP 요청에 대한 처리를 구현할 수 있습니다.

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

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

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

servlet과 container에 대한 질문입니다

0

24

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

62

1

jsp 의존성 수정 요청

0

77

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

143

1

save() 메서드 문의

0

66

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

100

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

95

1

RequestMapping을 이용한 핸들러, 어댑터

0

118

2

save 후 결과화면

0

88

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

177

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

99

3

파일 오픈 시

0

69

1

스프링 배치 관련

0

77

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

94

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

78

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

74

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

139

1

html 변경하는 부분 적용 문제

0

103

1

한글 깨짐

0

76

2