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 요청 정보,응답 정보를 추출하여 처리한다.
전체 서블릿 과정
- 나의 서버인 웹 브라우저가 http://localhost:8080/hello url을 통해 WAS에게 HTTP 요청을 보낸다
- WAS 서버가 request, response 객체를 생성
- 서블릿 컨테이너는 URL에(urlPatterns = "/hello") 매핑된 서블릿 클래스 'HelloServlet' 를 찾아서 확인
- @WebServlet(name = "helloServlet", urlPatterns = "/hello")
- 서블릿 컨테이너는 helloServlet 에 객체 생성
- 해당 서블릿의 service() 메서드를 호출하여 WAS 서버가 만든 request, response 객체를 전달하여 HTTP 요청과 응답을 처리
- 끝나고 서블릿 리턴하여 response 객체정보로 HTTP 응답 메세지를 생성
- 웹 브라우저에 응답 메세지 전달
* 여기서 응답 생성과 응답 메세지 생성은 조금 다른 개념
'응답 생성'은 서블릿 컨테이너에서 리턴하기 전에 설정, 서블릿 리턴 후에 '응답 메세지'를 생성
테스트해보기
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);
}
}
'공부' 카테고리의 다른 글
Spring MVC | 서블릿에 HTTP 요청 및 응답하는 테스트 해보기, 웰컴 페이지 생성 (0) | 2024.02.17 |
---|---|
Spring MVC | 스프링 부트 3.x 프로젝트 생성과 실행, 환경설정 (0) | 2024.02.13 |
Spring | 싱글톤 컨테이너 , @Configuration (0) | 2024.01.09 |
Spring | 싱글톤 패턴 적용하기, static, 싱글톤 문제점 (0) | 2024.01.08 |
Spring | 관심사의 분리 (AppConfig)와 의존성 주입 , AppConfig 리팩터링 (0) | 2023.12.19 |