Java 웹 개발

HY·2022년 3월 25일
0

Java 웹 개발

목록 보기
1/6

요즘 웹 개발에 대해 배우고 있다. 예전에 Spring boot를 이용해 간단한 클론 코딩을 한 적이 있지만, 구현만 했지 기초적인 부분에 대해서는 잘 알고 있지 않은 것 같아 Servlet, JSP 등을 공부하는 겸 정리를 해보려고 한다.

사실 요즘에는 JSP 같은 경우는 사용하지 않는 추세인 것 같고, Servlet도 직접적으로 사용하지는 않는 것 같다. 하지만 기초적인 부분이기도 하고, Servlet 같은 경우는 Spring Framework를 이해하는 데에도 필요한 개념이기 때문에 공부를 할 필요가 있어 보인다.

🌏 Web Application Architecture

먼저 가장 기초적인 웹 어플리케이션 구조에 대해서 알아보자.

client -> Server(Web - Web Application - DB)

Client에서 Server에 요청 request을 보내면 Server는 요청을 처리해 응답 response을 보내준다.

Web Server는 주로 HTTP 요청에 응답해 정적인 컨텐츠를 제공해주고, Application Server는 비즈니스 로직, DB 조회 등 동적인 컨텐츠를 제공해준다.

보통은 Nginx나 Apache같은 웹서버를 Apache Tomcat과 같은 WAS(Web Application Server)와 같이 사용을 하는데 기능을 분리해 (웹서버는 정적페이지만 처리하고 연산이 필요하면 WAS에게 넘겨 수행한뒤 다시 결과를 받아 반환) 서버 부하를 방지하고 보안 강화, 로드 밸런싱 등을 이유로 분리해서 같이 사용한다고 한다.

🐱 Servlet

Java에서는 서블릿 Servlet이라는 웹페이지를 동적으로 생성하기 위한 기술이 있다. 대표적인 WAS인 Tomcat에서는 자바 서블릿 Java Servlet 을 실행하기 위한 서블릿 컨테이너를 제공한다.

서블릿과 웹 어플리케이션 서버에 대해 좀 더 알아보기 위해 HTTP 통신 과정에서 서버에서 처리해야 하는 것들에 대해 생각해보자.

🔍 서버에서 처리해야 하는 업무

  • 서버 TCP/IP 대기, 소켓 연결
  • HTTP 요청 메시지를 파싱해서 읽기
  • POST 방식, /save URL 인지
  • Content-Type 확인
  • HTTP 메시지 바디 내용 파싱
  • 지정 프로세스 실행
  • 비즈니스 로직 실행
    • 데이터베이스에 저장 요청
  • HTTP 응답 메시지 생성
  • TCP/IP에 응답 전달, 소켓 종료

여기서 비즈니스 로직 실행을 제외한 부분은 Java의 '서블릿 Servlet'이 모두 자동으로 해준다.
HttpServletRequest, HttpServletResponse 객체를 통해 HTTP 요청, 응답 정보를 편리하게 사용할 수 있다.

WAS 안에서는 요청메시지를 기반으로 request, response 객체를 만들고 이 객체들을 받아 서블릿을 실행하고 response 객체 정보로 HTTP 응답을 생성해 클라이언트로 보내준다.

🔍 Servlet Class

일반적인 자바 클래스와는 다르게 main method가 없고 객체의 생성부터 실행(method call)까지 서블릿 컨테이너 Servlet Container가 모두 관리한다.

서블릿 클래스는 일반적으로 javax.servlet.Servlet 인터페이스를 구현한 추상 클래스인 HttpServlet 클래스를 상속해서 구현한다. HttpServlet API 문서

제공하고자 하는 HTTP 메서드에 따라 doGet(), doPost() 등의 메서드를 오버라이딩해서 필요한 내용을 구현하면 된다.

public class HelloWorldServlet extends HttpServlet {
    public doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ...
    }
    
    public doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    ...
}

🔍 Servlet Life Cycle

서블릿 클래스는 서블릿 컨테이너에 의해 객체의 생성과 소멸 등이 관리된다.
서블릿의 생성과 소멸은 다음과 같은 과정을 거친다.

  1. 사용자 URL 요청에 따른 서블릿을 실행한다.
  2. 서블릿 인스턴스가 생성되어있지 않다면 인스턴스를 생성한다. (생성자 호출 후, init() 호출)
  3. 이미 객체가 생성되어 있다면 각 요청별로 스레드를 생성해 서블릿의 service() 메서드 호출
  4. service 메서드를 통해 사용자 요청에 따라 doGet(), doPost() 등의 메서드를 호출한다.
  5. 서블릿 컨테이너를 종료하거나 서블릿 변경 등 기존 서블릿을 정리해야 할때 destroy() 메서드 호출

service() (& doGet, doPost 등)은 여러번 호출될 수 있다. - 요청시마다 호출
나머지 init() 이나 destroy()는 처음 요청 때 한번만 호출

📑 JSP

HTML내에서 자바 코드를 삽입해 웹 서버에서 동적으로 웹 페이지를 생성해 웹 브라우저에 돌려주는 언어이다. 실행 시에는 자바 서블릿으로 변환 후 실행된다.

서블릿과 다른 점은 서블릿은 기본적으로 자바 클래스이고, JSP는 HTML이 기반인데 그 안에 J자바 코드를 넣을 수 있다는 점인 것 같다.

동작을 살펴보면, 웹 어플리케이션 서버 내에서 jsp 파일은 자바 서블릿 파일로 변환되고, 컴파일한 후, 서블릿 클래스를 메모리에 적재하게 된다.

HTML 파일에 자바를 쓸 수 있다는 장점이 있지만, 요즘은 react, vue 등 프론트엔드 프레임워크가 발달함에 따라 프론트와 백이 분리되면서 많이 쓰지 않는 추세다.

🌱 Spring

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크.
개발을 편리하게 할 수 있게 해주는 프레임워크(뼈대)로, low level에 신경쓰지 않고 비즈니스 로직 개발에만 전념할 수 있도록 해준다.

웹 서비스를 개발할 때 주로 쓰이고, 스프링을 사용하면 개발자 입장에서는 순수 자바 객체로 개발을 할 수 있지만 스프링 내부적으로는 서블릿이 사용된다.

POJO(특정 기술에 종속적이지 않은 일반적인 자바 객체), DI(의존성 주입) 등의 특징을 가져 객체 지향적으로 개발하기 좋고 사용하기 편리하지만, 설정해줘야 하는 부분이 많다. 이런 부분을 보완하기 위해 스프링 부트 Spring Boot가 나왔다. 스프링 부트는 라이브러리 의존성, 버전 관리 등을 자동으로 해준다는 장점이 있고, 내장 톰캣을 가지고 있어서 따로 설치할 필요없이 빌드하고 실행하기만 하면 된다.

마무리

이 글에서는 웹 개발의 구조가 어떻게 되어 있는지, 자바로 어떻게 웹개발을 하는지 간략하게 정리해보았다.
다음 글에서부터는 Servlet, JSP 등으로 어떤 식으로 개발하는지 예제와 함께 글을 쓸 예정이다.

이 글은 infearn 강의와 SSAFY 강의, https://dinfree.com/lecture/backend/javaweb_1.1.html 사이트 등을 참고해서 작성했다.

0개의 댓글