[자바웹개발 워크북] 1. 웹 프로그래밍의 시작

yoons(이윤서)·2025년 7월 10일

1.1 자바 웹 개발 환경 만들기
1.2 웹 기본 동작 방식 이해하기
1.3 Web MVC 방식
1.4 HttpServlet
1.5 모델(Model)

1.1 자바 웹 개발 환경 만들기


📌JSP(Java Server Page)

  • JSP 파일은 Java Server Pages의 약자로, 동적인 웹 페이지를 만들기 위해 HTML 코드 내에 Java 코드를 삽입하여 사용하는 기술입니다.
  • JSP 활용 시 <% %>를 사용하면 HTML문서 중간에 Java코드를 삽입하여 동적인 코드로 변경이 가능


1.2 웹 기본 동작 방식 이해하기


🔸브라우저와 서버의 관계 이해
🔸서블릿과 JSP가 브라우저에 데이터를 전달하는 과정,
🔸브라우저에서 사용되는 과정

📌 Request(요청)/Response(응답)


브라우저에 원하는 정보를 전달하는 방식 GET, POST

GET
주소와 필요한 데이터를 한번에 같이 보내기 때문에 단순 링크로 처리된다.
ex) https://velog.io/@liy_se00/posts?tag=000000

POST
주소와 데이터를 따로 보내는 방식.
ex) /api/members/news/{newsId}/read


✨브라우저와 서버의 데이터 전달 과정

  1. 브라우저에서 데이터를 요구 = 요청(Request)
  2. 서버는 이에 대한 응답(Response) 데이터를 만들어 브라우저로 보낸다.
  3. 서버에서는 이를 정적인 데이터인지 동적인 데이터인지에 따라 다르게 처리.
  • 웹 서버(Web Server): 항상 같은 정적 데이터만 보내는 역할만을 수행하는 서버
  • 웹 애플리케이션 서버(Web Application Server; WAS): 동적 데이터를 만들어 보내는 경우의 서버. 대부분의 WAS는 웹 서버 기능도 같이 포함하므로 이미지, CSS/JS, 서블릿/JSP 모두 처리 가능.


📌 HTTP(Hyper Text Transfer Protocol)


✨프로토콜(protocol) : 브라우저의 요청과 서버의 응답 사이에서 한 데이터 교환 약속. 웹에서는 HTTP나 보안이 강화된 프로토콜인 HTTPS 프로토콜 방식으로 데이터를 주고받는다.

개발자도구 -> Network -> 오가는 데이터 확인 가능(Headers, Response, Cookies...)


✨비연결성(Connectionless)
웹의 특성상 여러 사용자가 브라우저를 통해 서버를 호출하는 구조이기 때문에 서버에서는 최대한 많은 사용자에게 서비스를 제공하기 위한 고민이 필요하다.
-> HTTP는 이를 위해 '비연결성' 방식을 택하는데, 이는 요청과 응답을 처리한 후 연결을 종료하는 것이다. ex) 새로고침


📌 자바 서버 사이드 프로그래밍


서버 사이드 프로그래밍: 서버 쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성하는 것을 의미

  • 동시에 여러 요청 어떻게 처리?
  • 서버 문제 발생 시 어떻게 처리?
  • 어떤 방식으로 데이터 전송 최적화?
  • 분산 환경이나 분산 처리 문제?

자바의 경우 위와 같은 처리를 JavaEE라는 기술 스펙으로 정리해 두었고, Servlet과 JSP는 JavaEE의 여러 기술 중 가장 기본적인 기술이다.


[ Servlet ]

✨서블릿(Servlet) 기술
서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것

🔸톰캣이란(Tomcat)?
톰캣은 아파치 소프트웨어 재단의 웹 어플리케이션 서버(와스)로서, 자바 서블릿을 실행키고 JSP코드가 포함되어 있는 웹 페이지를 만들어준다.
출처: https://cheershennah.tistory.com/54

JSP는 근본적으로 서블릿과 같은 원리이지만 좀 더 HTML을 쉽게 이용할 수 있는 방식으로 코드를 작성할 수 있기 때문에 '서블릿으로는 코드를 이용한 처리, JSP로는 화면 개발'과 같이 역할을 분담해서 개발하는 것이 일반적이다.

서블릿 컨테이너: 서블릿의 실행은 서블릿을 실행할 수 있는 환경에서 실행이 가능하다.(톰캣) 이를 '서블릿 컨테이너'라 부르며 과거에는 '서블릿 엔진'이라고 불렀다.

서블릿 코드를 실행하는 주체는 서블릿 컨테이너(톰캣)이므로, 일반 자바 프로그램과 아래와 같은 점들이 달라진다.

  • 객체 생성, 호출 주체는 서블릿 컨테이너
  • 객체의 관리 자체가 서블릿 컨테이너에 의해 관리
  • 서블릿/JSP 코드 개발은 기본적인 자바 API와 더불어 서블릿 API도 같이 사용해야 한다.
    ex) 서블릿 클래스를 보면 import에 javax로 시작하는 서블릿 관련 API가 java.io.*와 함께 사용된 것을 볼 수 있다.

서블릿 라이프 사이클: init(), doGet(), destory()등 서블릿 API에서 지정된 메소드들을 서블릿 컨테이너가 호출하고 관리하는 것


[ JSP ]

✨ JSP 기술
서블릿이 있는데도 JSP가 제공되는 이유?
👉🏻 두 기술의 목적 자체가 다르기 때문

  • JSP 기술은 서블릿과 달리 HTML 코드를 그대로 이요하고 필요할 때 약간의 자바 코드를 넣음
  • 서블릿은 자바 코드를 이용해여 HTML 문자열을 만들어내는 방식의 차이

JSP 파일도 서블릿 코드로 변환되어 컴파일되고 실행된다. JSP 파일은 필요한 순간에 자바 파일로 생성되고, 컴파일하여 class 파일로도 만들어진다.
HTML <head> 코드 -> 모두 out.write("<head>\n"); 형태의 코드로 변환된다.


🔸서블릿/JSP 공통점

  • 모두 JavaEE 스팩의 일부
  • 실행하기 위해서 서블릿 컨테이너가 필요함
  • 서블릿 컨테이너가 객체를 생성하고 생명주기 관리

✨JSP 특징

  • ${}: JSP에서 사용하는 EL 기술. 서버에서 데이터를 출력하는 용도
  • 웹의 파라미터는 모두 문자열 -> 숫자 계산을 위해서는 Integer.parseInt() 적용
  • JSP는 기본적으로 GET/POST 방식의 호출을 구분하지 않는다.

JSP 올바른 사용법

  • JSP에서 쿼리 스트링이나 파라미터를 처리하지 않는다.
    👉🏻 JSP 대신 서블릿으로 처리
  • 입력 화면을 구성하거나 처리 결과를 보여주는 용으로만 사용
  • 서블릿 경로를 통해 JSP를 보는 방식으로 사용
  • JSP는 직접 호출하지 않고 Controller를 통해서만 JSP에 접근하도록 구성
  • JSP는 결과만/처리는 서블릿

-> 이러한 문제를 해결하기 위해 등장한 것이 웹 MVC

1.3 Web MVC 방식


- MVC 구조와 서블릿/JSP

요청이 들어오면
-> 서블릿은 준비한 데이터를 JSP로 전달
-> JSP는 EL을 이용해 최종적인 결과 데이터 생성
-> 생성된 결과 화면은 톰캣을 통해 브라우저로 전송

📌 웹 MVC 구조

: Model - View - Controller 역할을 분리해서 처리하는 구조

  • Controller: 데이터 처리(서블릿)
  • View: 결과 처리(JSP)
  • Model: JSP에 필요한 데이터를 가공하는 역할을 하는데 필요한 데이터를 제공하는 객체

- RequestDispatcher를 이용한 요청(Request) 배포

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
		ServletException, IOException {
		System.out.println("InputController...doGet...");
		RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/calc/input.jsp");
		dispatcher.forward(req, resp);
	}

👉🏻 WEB-INF 란?
WEB-INF는 브라우저에서 직접 접근이 불가능한 특별한 경로입니다. WEB-INF 밑에 jsp 파일을 둔다는 것은 브라우저에서 jsp로 "직접" 호출이 불가능하다는 것을 의미합니다.(따라서 jsp 파일이 호출될 때는 controller를 필수적으로 거치게 됩니다.)

✨RequestDispatcher

  • 서블릿에 전달된 요청을 다른 쪽으로 전달 혹은 배포한다.
  • RequestDispatcher를 이용하면 InputController는 jsp파일로 가는 중간 경유지가 됩니다.

✨ reponse.sendRedirect("/....")

  • POST 방식으로 처리하고 JSP를 이용해서 결과를 보여주는 방식을 이용할 때 HttpServletResponse의 sendRedirect()로 처리가 끝난 후에 다른 경로로 이동하게 하는 것이 일반적이다.

📌 PRG 패턴(Post-Redirect-GET)

PRG 패턴은 POST 방식의 처리 후에 바로 다른 주소로 브라우저가 이동하기 때문에 반복적으로 POST 호출이 되는 상황을 막을 수도 있습니다.

  • 웹 MVC 구조에서 가장 흔하게 사용하는 패턴
  • 사용자는 컨트롤러에 원하는 작업을 POST 방식으로 처리하기를 요청
  • POST 방식을 컨트롤러에서 처리 -> 브라우저는 다른 경로로 이동(GET)하라는 응답(Redirect)
  • 브라우저는 GET 방식으로 이동

1.4 HttpServlet


Servlet 클래스의 상속 구조

HttpSevletRequest의 주요 기능

주로 '읽는' 기능 제공

🔹 getParameter()

  • ?name=AAA&age=20과 같은 쿼리 스트링에서 키를 이용해 값을 얻을 때 사용
  • getParameter() 결과값은 항상 String
  • 문자열로 반환되기 때문에 숫자를 처리할 때의 예외 발생을 주의해야 한다.
  • 해당 파라미터가 존재하지 않는다면 null 반환 주의

🔹 getParameterValues()

  • 동일한 이름의 파라미터가 여러 개 있는 경우에 사용
  • String[] 타입으로 반환

🔹 setAttribute()

  • JSP로 전달할 데이터를 추가할 때 사용한다.
  • key와 value의 형태로 데이터를 저장할 수 있다.

🔹 RequestDispatcher

  • 현재의 요청을 다른 서버의 자원에게 전달하는 용도로 사용
  • forward() : 현재까지의 모든 응답 내용은 무시하고 JSP가 작성하는 내용만을 브라우저로 전달

HttpSevletResponse의 주요 기능

주로 '쓰는' 기능 제공

웹 MVC 구조에서 주로 JSP에서 처리되기 때문에 sendRedirect()를 이용하는 경우가 많다.

1.5 모델(Model)


모델과 3티어

DTO(Data Transfer Object)

3티어와 같이 계층을 분리하는 경우에는 반드시 계층이나 객체들 간에 데이터 교환이 이루어지기 때문에 여러 개의 데이터를 묶어서 하나의 객체로 전달하는 것을 DTO라고 한다.

  • 대부분 Java Beans 형태로 구성한다.

    Java Beans 구성

  • 생성자가 없거나
  • 반드시 파라미터가 없는 생성자 함수를 가지는 형태
  • 속성은 private으로 작성
  • getter/setter 제공
  • 추가 선택적 규칙) Serializable 인터페이스 구현해야 함
public enum TodoService {

	INSTANCE;
}

enum 타입으로 클래스를 작성하는 경우, 정해진 수만큼만 객체를 생성할 수 있다는 장점이 있다. TodoService.INSTANCE와 같이 간단하게 객체를 하나만 생성해서 사용 가능하다. 이를 싱글톤 패턴이라고 한다.

싱글톤 패턴?
왜 싱글톤 패턴을 사용할까?

- 인스턴스가 하나만 필요할 때
예를 들어, 설정 정보(환경 설정 클래스), 로깅 클래스, DB 커넥션 풀 관리 클래스 등은 여러 개의 객체가 필요하지 않다.

- 메모리 낭비 방지
매번 new 키워드로 객체를 생성하지 않고 하나의 인스턴스를 재사용함으로써 메모리를 절약할 수 있다.

- 전역 접근
어디서든지 동일한 인스턴스를 사용할 수 있어, 공유 리소스 관리에 유용하다.

enum class로 INSTANCE를 만든 이유는 Java의 Enum이 JVM 차원에서 싱글톤을 보장하기 때문

profile
개발공부하는 잠만보

0개의 댓글