HTTP 

HTTP 메시지를 통해 모든것을 전송한다

  • 이미지, 음성, 영상, 파일
  • HTML, TEXT
  • JSON, XML
  • 서버간 데이터 주고받을때도 HTTP 사용

 

 

웹 서버 Web Server

HTTP 기반으로 동작

정적 파일 (정적 HTML, CSS, JS, 이미지, 영상..) 및 클라이언트 요청처리에 주로 중점을 둔다

예로는 Apache 아파치 같은 웹서버가 해당

 

정적 파일이란? 클라이언트 요청 그대로 서버에게 전달되는 것

 

 

WAS (웹 어플리케이션 서버)

HTTP 기반으로 동작

클라이언트 요청에 동적으로 콘텐츠를 생성하여 DB와 상호작용한다

웹 서버 기능 + 동적 웹 어플리케이션 실행

프로그램 코드를 실행하여 애플리케이션 로직 수행

(동적 HTML, 서블릿, JSP, 스프링 MVC)

 

예로는 톰캣이 있다. 

 

 

 

웹 서버와 WAS 차이점은?
  • 웹서버는 정적 리소스 , WAS 는 애플리케이션 로직과 정적 리소스도 모두 제공가능
  • 웹서버는 정적 컨텐츠를 주로 중점을 두고 WAS는 동적 컨텐츠를 생성하고 DB와 상호작용을 통해 웹 애플리케이션을 실행하는데 사용
  • 클라이언트 요청이 들어오면 웹 서버가 정적 콘텐츠를 담당하고 동적 콘텐츠가 필요하면 WAS 가 처리한다고 보면된다. 그 결과를 클라이언틑에게 전달

 

 

 

 

왜 정적, 동적 처리를 웹서버와 WAS에 나누느냐?

만약 WAS가 정적, 동적 요청을 모두 맡아버리면 서버 과부화가 될 수 있고

WAS에서 장애가 났을 때 오류화면이 노출 불가능하다  

 

 

이렇게 WEB, WAS의 역할이 나눠진다면?

정적 리소스는 웹서버가 처리, 동적인 처리는 WAS에 요청을 하여 처리를 했을때

WAS,DB 에서 장애가 일어났을때 WEB 서버가 오류 화면을 보여줄 수 있다. 

(WAS 서버가 잘 죽기 때문에 역할을 나누는게 중요!)

 

 

 


 

이제 서블릿에 대해 알아보자 

 

WAS 가 서블릿을 지원한다.

WAS는 서블릿 실행환경인 서블릿 컨테이너(아파치, 톰캣)를 제공하고 서블릿이 웹 애플리케이션 로직을 처리하도록 도와준다. 

 

HTTP 요청 메시지를 내가 직접 파싱하고 처리하는건 힘드니까 서블릿을 사용하여 대신 처리할 수 있도록 도와준다. 

클라이언트에게 받은 HTTP 요청을 서블릿에게 전달하고, 서블릿은 요청을 처리하고 응답도 생성해준다 
개발자는 요청과 응답에 대한 처리 로직을 서블릿 클래스에서 작성하여 요청 정보를 편리하게 사용할 수 있다.

 

 

 

서블릿 특징

  • 웹 브라우저가 생성한 요청 HTTP 메시지를 필요한 정보를 추출하고 처리

 

 

  • 서버에서 HTTP 응답 메시지 생성하여 클라이언트에게 반환

 

 

1. 패키지 생성하기

hello > servlet > basic 패키지 순으로 생성하고

 

2. 자바 클래스 생성

basic 패키지에 HelloServlet 자바 클래스를 생성

 

 

 

HelloServlet 클래스

service 오버라이드

ctrl + O 하면 service 메서드(자물쇠 모양) 선택

: 서블릿이 호출되면 이 service  메서드가 호출된다.

 

 

 

서블릿 클래스

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
    }
}

 

 

  • urlPatterns 은 url에 /hello 이 있으면 해당 서블릿 코드가 실행된다.  
  • HttpServletRequest 객체에는 HTTP 요청에 관한 정보가 담겨져 있다
    • request 객체를 통해 파라미터 값을 찾을 수 있다.
    • 예를들어 getParameter("username") 을 통해 username 파라미터 값 추출
  • HttpServletResponse 객체에는 HTTP 응답에 관한 정보가 담겨져 있다
  • 서블릿은 HttpServletRequest , HttpServletResponse 객체를 통해 클라이언트의 HTTP 요청 정보,응답 정보를 추출하여 처리한다. 

 

 

전체 서블릿 과정

 

 

  1. 나의 서버인 웹 브라우저가 http://localhost:8080/hello url을 통해 WAS에게 HTTP 요청을 보낸다
  2. WAS 서버가 request, response 객체를 생성
  3. 서블릿 컨테이너는 URL에(urlPatterns = "/hello") 매핑된 서블릿 클래스 'HelloServlet' 를 찾아서 확인
    1. @WebServlet(name = "helloServlet", urlPatterns = "/hello")
  4. 서블릿 컨테이너는 helloServlet 에 객체 생성
  5. 해당 서블릿의 service() 메서드를 호출하여 WAS 서버가 만든 request, response 객체를 전달하여 HTTP 요청과 응답을 처리
  6. 끝나고 서블릿 리턴하여 response 객체정보로 HTTP 응답 메세지를 생성
  7. 웹 브라우저에 응답 메세지 전달

 

* 여기서 응답 생성과 응답 메세지 생성은 조금 다른 개념

'응답 생성'은 서블릿 컨테이너에서 리턴하기 전에 설정, 서블릿 리턴 후에 '응답 메세지'를 생성

 

 

 

 

 

테스트해보기

System.out.println("HelloServlet.service"); 

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
    }
}

 

 

 

run 실행해보니 이런 에러가 났다 

 

 

 

방법1. Gradle 옵션으로 변경

setting > Gradle >  IntelliJ IDEA 이 아닌 Gradle로 옵션을 변경한다

 

인텔리제이 무료버전은 Gradle로 설정해야 한다고

Jar 파일의 경우는 문제가 없는데, War의 경우 톰캣이 정상 시작되지 않는 문제가 발생한다.

하지만 Gradle 로 할 경우 속도저하가 일어나기 때문에 조금 별로다 

 

 

 

 

방법2. build.gradle 에서 다음 코드를 주석처리하기

 

IntelliJ IDEA 옵션으로 그대로 하되

providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'  제거 후 reflesh 

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	//providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

run 실행하면 정상작동! 로그에 8080 확인하고 url 검색해보기 

 

 

 

url 에 http://localhost:8080/hello 검색하면 빈 화면이 나온다 그럼 정상!

 

 

그리고 콘솔창을 보면 System.out.println("HelloServlet.service");  이 호출된 것을 볼 수 있다.

 

 

 

 

이번에는 request, response 객체 추출해보기

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);
    }
}

 

 

 

 

반응형
LIST

+ Recent posts