인프런/스프링 MVC 1편

2)서블릿,서블릿컨테이너

backend dev 2023. 1. 13.

일반적으로 Jar지만 JSP공부를 하기위해 이 프로젝트는 War를 선택한다.

generate해서 프로젝트 파일받아서 인텔리제이로 열어주고

plugin에서 롬복이 깔려있는지 체크하고 , build시 실행이 gradle로 되는것을 인텔리제이로 바꿔주고, 어노테이션 처리가 잘되게끔 체크해줘야한다. 

맨처음에 체크가 안되어있다. 반드시 체크!


서블릿을 등록하고 사용해보자.

 

스프링 부트 서블릿 환경 구성

@ServletComponentScan //서블릿 자동등록 어노테이션, 자동빈등록에 쓰는 @ComponentScan과 같이 , 현재 패키지이하를 모두 뒤져서 서블릿을 찾아, 등록시켜준다.
@SpringBootApplication
public class ServletApplication {

   public static void main(String[] args) {
      SpringApplication.run(ServletApplication.class, args);
   }

}

자동서블릿등록을 위해 @ServletComponentScan 어노테이션 추가.

 

 

HelloServlet.java

@WebServlet(name = "helloServlet",urlPatterns = "/hello") //서블릿이름과 url를 설정해준다.
public class HelloServlet extends HttpServlet { //서블릿은 HttpServlet이라는걸 상속받아야한다.


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //이 서블릿이 호출되면 이 service 메소드가 실행된다, 오버라이드 해준다.
        System.out.println("HelloServlet.service");//soutm하면 메소드명을 출력해줌
    }
}

@WebServlet을 이용하여 서블릿 이름과 url설정을 해준다.

HttpServlet상속도 꼭해준다.

서블릿이 호출되면 실행될 service메소드도 오버라이드 해준다 

 

Ctrl + O 를 이용하여 상속받은 클래스안의 메소드를 골라 오버라이드할 수 있다.

열쇠모양이 protected이다.검색해보니 자바에서는 protected가 오버라이드해서 사용하는 메소드 느낌일때 붙이는 접근제어자인거 같다.

 

스프링부트를 실행해서 서블릿이 잘 동작하는지 체크해보자.

아무것도 응답한게 없어서 빈화면이 보인다.
출력이 잘되어있는걸 확인가능-> 서블릿이 잘 실행되었다.

 

방금 http://localhost:8080/hello로 url호출하면  웹브라우저가 http요청메시지를 서버에 전달한다.

그 http요청이 오면 WAS가 HttpServletRequest , HttpServletResponse 객체를 만들어서 service의 매개변수로 전달해준다.

System.out.println("request = " + request);
System.out.println("response = " + response);

해당 코드로 어떤 객체들이 들어왔나 찍어보면 아래와 같은 결과가 나타난다.

HttpServletRequest , HttpServletResponse는 인터페이스인데 해당 인터페이싀 구현체 객체가 들어가있는 모습이다.

 

@WebServlet(name = "helloServlet",urlPatterns = "/hello") //서블릿이름과 url를 설정해준다.
public class HelloServlet extends HttpServlet { //서블릿은 HttpServlet이라는걸 상속받아야한다.

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //이 서블릿이 호출되면 이 service 메소드가 실행된다, 오버라이드 해준다.
        System.out.println("HelloServlet.service");//soutm하면 메소드명을 출력해줌
        System.out.println("request = " + request);
        System.out.println("response = " + response);

        String username = request.getParameter("username"); // 서블릿 request의 getParameter("파라미터이름")으로 파라미터값을 꺼내올수있다.
        System.out.println("username = " + username);
    }
}

http://localhost:8080/hello?username=kim에서 ?는 쿼리 파라미터이다. 

URL의 쿼리 파라미터란 ? 뒤에 지정하는 파라미터를 뜻합니다.

여러 개를 연결할 때는 & 를 씁니다. 쿼리 스트링(query string)이라고도 합니다.

 

http://localhost:8080/hello?username=kim으로 url을 호출했을때

서블릿request를 이용해서 파라미터값을 가져올수있는걸 확인했다.

 

응답메시지에 값 채워보기

@WebServlet(name = "helloServlet",urlPatterns = "/hello") //서블릿이름과 url를 설정해준다.
public class HelloServlet extends HttpServlet { //서블릿은 HttpServlet이라는걸 상속받아야한다.


    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //이 서블릿이 호출되면 이 service 메소드가 실행된다, 오버라이드 해준다.
        System.out.println("HelloServlet.service");//soutm하면 메소드명을 출력해줌
        System.out.println("request = " + request);
        System.out.println("response = " + response);

        String username = request.getParameter("username"); // 서블릿 request의 getParameter("파라미터이름")으로 파라미터값을 꺼내올수있다.
        System.out.println("username = " + username);

        response.setContentType("text/plain"); //contentType설정 , 헤더에 들어간다.
        response.setCharacterEncoding("utf-8"); //보낼 문자정보를 알려줘야한다. , 헤더에 들어간다.
        response.getWriter().write("hello "+username);//http메시지 바디에 메시지를 넣는다.

    }
}

서블릿response객체를 이용해서 헤더와 바디를 채워줬다. 그리고 다시 url를 호출해보았다.

바디에 넣은값이 잘 보인다.

F12(개발자도구)를 이용해서 자세히 확인가능하다.

f12로 개발자도구를 킨후 새로고침을 해보면 확인가능하다. contentLength나 date는 다 톰캣(== WAS == 웹서버 + 서블릿컨테이너 == 웹 어플리케이션 서버))이 만들어줘서 보낸다.

 

개발할때 편하게 http요청메시지를 보고싶을때 (HTTP 요청 메시지 로그로 확인하기)

application.properties에 다음과 같은 코드 추가

logging.level.org.apache.coyote.http11=debug

서버 재시작후 url호출 해보면.

자세한 정보가 로그에 뜨게 된다.
볼 필요가 없다면 사용하지말자.

서블릿 컨테이너 동작 방식

내장 톰캣 서버 생성

스프링부트가 내장 톰캣 서버를 띄워준다.

톰캣서버는 내부에 서블릿 컨테이너를 가지고있다. (톰캣 == was) was는 webserver + 서블릿 컨테이너

 

서블릿 컨테이너, was가 헷갈립니다. - 인프런 | 질문 & 답변

안녕하세요 강의 잘 듣고 있습니다. 그런데 WAS,서블릿 컨테이너, 서블릿 객체가 헷갈려서 질문드립니다. 강의 중, 서블릿 컨테이너는 톰캣처럼 서블릿을 지원하는 WAS라고 하셨습니다.  더불어,

www.inflearn.com

 

 

서블릿 컨테이너(Servlet Container) 란?

서블릿들을 위한 상자(Container) 입니다.

velog.io

 

 

 

Apache와 Tomcat 혹은 웹 서버와 WAS는 어떻게 다를까?

웹개발을 하며 꼭 사용하게 되는 Apache와 Tomcat. 사실 그냥 강의에서 개발에 필요하다니까 아무 생각없이 써왔는데(...) 점점 궁금한 것이 많아져 조사를 하게 됐어요! 1. Apache(웹 서버) 아파치는 오

makemethink.tistory.com

 

 

 

전체적인 구조!!

 

스프링 컨테이너와 서블릿 컨테이너 - 인프런 | 질문 & 답변

안녕하세요! 강의를 든던중 궁금한 점이 있어서 이렇게 질문 남깁니다. 스프링 컨테이너는 서블릿 컨테이너의 한 종류라고 인식을 해도 되는걸가요? - 질문 & 답변 | 인프런...

www.inflearn.com

 

 

 

 

 

 

서블릿컨테이너를 통해서 서블릿 객체를 생성해준다(서블릿컴포넌트스캔으로 자동적으로 생성)

 

이렇게 helloServlet이 서블릿컨테이너에 존재하게됬을때

url호출을 하면 웹브라우저가 http요청메시지를 만들어서 서버에 전달한다.  

 

1.url이 호출되게되면 웹브라우저가 http요청메시지를 만들어서 서버에 전달한다.

 

2.http요청메시지를 기반으로 서블릿컨테이너는 서블릿request객체를 생성한다.

내용이 비어있지만 서블릿response객체도 서블릿컨테이너가 생성한다.

 

3.http요청메시지에 있는 url에 맞는 서블릿객체를 쓰레드가 호출한다.

서블릿객체안에 있는 service메소드(비즈니스 로직)에 서블릿request와 서블릿response객체를 전달해서 실행시켜준다.

 

4.비즈니스로직이 끝나면 서블릿reponse객체를 서블릿컨테이너에 넘기고

 

5.서블릿컨테이너는 서블릿reponse객체를 이용하여 http응답메시지를 생성하고 클라이언트에 전달한다.

웹 어플리케이션 서버 == 톰캣

 

웰컴페이지 추가

index페이지와 연결되면서, 공부한 내용을 쉽게 확인할수 있게 만든 basic.html도 추가한다.

localhost:8080 url를 호출하게되면 다음과 같이 index.html의 내용이 보인다.

저 하이퍼링크를 누르면 basic.html로 이동한다.

 


서블릿을 상속하고, 서블릿 이름과 url를 매핑해서 서블릿클래스를 만들었다.

스프링부트가 올라갈때 서블릿객체를 만들어준다 (싱글톤) 

 

url이 호출되게되면 웹브라우저가 http요청메시지를 만들어서 서버에 전달한다.

 

http요청메시지를 기반으로 서블릿컨테이너는 서블릿request객체를 생성한다.

내용이 비어있지만 서블릿response객체도 서블릿컨테이너가 생성한다.

 

http요청메시지에 있는 url에 맞는 서블릿객체를 쓰레드가 호출한다.

서블릿객체안에 있는 service메소드(비즈니스 로직)에 서블릿request와 서블릿response객체를 전달해서 실행시켜준다.

 

비즈니스로직이 끝나면 서블릿reponse객체를 서블릿컨테이너에 넘기고

 

서블릿컨테이너는 서블릿reponse객체를 이용하여 http응답메시지를 생성하고 클라이언트에 전달한다.

댓글