Day63 Java프로그래밍 기초(웹프로그래밍)
웹프로그래밍
기존 myapp 프로토콜
- 기존 프로젝트는 전용 프로토콜을 사용하여 클라이언트-서버간 통신을 수행한다.
- 현 프로젝트에는 유효한 기술이지만, 범용성적인 측면에서 효용성이 떨어진다.
- 보편적인 기술을 적용하는 것이 범용성, 보편성을 충족 시킬 수 있다.
- 보편적인 기술을 적용하여 클라이언트와-서버가 통신 하도록 하는 프로그래밍을 웹프로그래밍이라고 한다.
웹 애플리케이션 아키텍처 및 구동 원리
웹 서버(Web Server)
- 정의
- 웹 서버는 클라이언트(브라우저)에서 요청한 정적 콘텐츠(HTML, CSS, 이미지, JavaScript 파일 등)를 제공하는 서버이다.
- 웹 서버는 주로 HTTP 프로토콜을 사용하여 클라이언트와 통신하고, 클라이언트의 요청을 처리하여 정적 파일을 전달하는 역할을 수행한다.
- 기능
- 정적 콘텐츠 제공: HTML, 이미지, CSS, JavaScript 파일과 같은 정적 리소스를 클라이언트에 전달.
- 로드 밸런싱: 여러 서버 간의 트래픽을 분배하는 기능을 제공하여, 높은 트래픽을 효율적으로 처리.
- HTTP 요청 처리: 클라이언트에서 들어오는 HTTP 요청을 받아 그에 따른 응답을 반환.
웹 애플리케이션 서버(Web Application Server, WAS)
- 정의:
- 웹 애플리케이션 서버는 동적인 콘텐츠를 생성하는 서버로, 웹 서버와는 달리 복잡한 비즈니스 로직을 처리하고, 데이터베이스와 통신하며, 사용자의 요청에 따라 동적 페이지(예: JSP, PHP, ASP.NET) 및 애플리케이션 로직을 수행한다.
- 웹 애플리케이션 서버는 웹 서버와의 통합 기능도 제공하며, 주로 서블릿이나 JSP 등의 기술을 사용하여 웹 애플리케이션을 동작하게 한다.
- 기능:
- 동적 콘텐츠 생성: 클라이언트의 요청에 따라 사용자 맞춤형 동적 콘텐츠를 생성.
- 비즈니스 로직 처리: 복잡한 비즈니스 로직을 수행하고, 이를 통해 요청에 따른 데이터를 가공하여 클라이언트에 응답.
- 데이터베이스 연동: 데이터베이스와의 상호작용을 통해 데이터의 CRUD 작업을 수행.
웹 서버와 웹 애플리케이션 서버의 차이점
항목 | 웹 서버(Web Server) | 웹 애플리케이션 서버(WAS) |
---|---|---|
주요 역할 | 정적 콘텐츠(HTML, 이미지, CSS 등)를 제공 | 동적 콘텐츠 처리 및 비즈니스 로직 수행 |
주요 기능 | HTTP 요청 처리, 정적 리소스 제공, 로드 밸런싱 | 서블릿, JSP 처리, 데이터베이스 연동, 트랜잭션 관리 |
주로 사용하는 콘텐츠 | 정적 콘텐츠 (HTML, CSS, JavaScript, 이미지) | 동적 콘텐츠 (서블릿, JSP, PHP, ASP.NET) |
대표적인 예 | Apache HTTP Server, Nginx, Microsoft IIS | Tomcat, JBoss, WebLogic, WebSphere |
연동 가능성 | 보통 웹 애플리케이션 서버와 함께 사용 (WAS와 연동 가능) | 자체적으로 웹 서버 기능도 포함 |
복잡성 | 단순: 정적 파일을 전달하는 데 중점 | 복잡: 비즈니스 로직, 데이터베이스 연동, 동적 콘텐츠 처리 |
응용 프로그램 처리 | 직접적인 응용 프로그램 처리 기능 없음 | 웹 애플리케이션 및 비즈니스 로직 처리 |
웹 서버와 웹 애플리케이션 서버의 관계
- 웹 서버는 주로 정적 콘텐츠를 제공하는 역할에 중점을 둡니다. 웹 서버는 클라이언트의 요청에 따라 HTML 파일이나 이미지와 같은 정적 파일을 전송한다.
- 웹 애플리케이션 서버(WAS) 는 동적 콘텐츠를 처리하며, 사용자 요청에 따라 비즈니스 로직을 처리하고, 필요한 데이터를 가공하여 클라이언트에 동적인 페이지를 전달한다.
- 실제로 웹 서버와 WAS는 종종 함께 사용되며, 웹 서버가 정적 콘텐츠를 처리하고, 동적 콘텐츠 요청을 WAS로 전달하는 형태로 사용된다.
Web Application Server의 구조
클라이언트 계층 (Web Browser)
- 웹 브라우저(Web Browser) 는 클라이언트 측에서 사용자가 상호작용하는 요소이다.
- 브라우저는 HTTP 프로토콜을 통해 서버로 요청을 보내고 결과를 받는다.
웹 서버(Web Server)
- 웹 서버(Web Server) 는 웹 브라우저로부터 들어오는 HTTP 요청을 받아 처리한다.
- 웹 서버는 주로 정적 콘텐츠(HTML, CSS, 이미지)를 제공하는 역할을 하지만, 동적 요청은 WAS로 전달한다.
- HTTP 요청이 웹 서버로 전달되고, WAS로 전달된다.
웹 애플리케이션 서버(Web Application Server, WAS)
- WAS는 웹 서버로부터 동적 요청을 받아, 내부의 비즈니스 로직을 처리하는 계층으로 전달한다.
Tomcat
같은 웹 서버가 이 역할을 수행한 후, 요청을 WAS로 넘겨 처리한다.
애플리케이션 계층 (Java Application)
- WAS 내에서 비즈니스 로직은 Java Application에 의해 처리된다. 이는 Java로 작성된 서버 애플리케이션으로서, 클라이언트의 요청에 따라 데이터를 처리하고, 로직을 수행한다.
데이터 처리 및 응답 흐름
- Java Application에서 요청을 처리한 후, execute 과정이 일어나고 그 결과가 클라이언트에게 Return을 통해 응답한다.
- 이 응답은 WAS를 통해 다시 웹 서버로 전달되며, 최종적으로 클라이언트인 웹 브라우저로 반환된다. 이때 HTTP 응답을 통해 처리된 결과가 클라이언트에 전달된다.
Web Developer
- WAS와 상호 통신하는 JavaApp을 개발하는 개발자를 웹프로그래밍 개발자라고 한다.
- WAS와 JavaApp이 상호 통신을 하기위해서는 JavaEE 기술명세에 따라 작성을 해야한다.
JavaEE 기술 명세
- 기업용 App 제작을 위해 다양한 기술을 모은 버전이다.
- 다양한 애플리케이션 서버 환경에서 작동하며, 대규모, 확장 가능한, 신뢰성 있는 애플리케이션을 쉽게 구축할 수 있도록 여러 기술 명세를 제공한다.
대표기술 | 내용 |
---|---|
Servlet/JSP | - WebApplication 제작기술 |
EJB | - 분산 컴포넌트 제작기술 |
Web Service | - 웹 기반 분산컴포넌트 제작기술 |
Authentication & Deployment | - 관리 및 보안 기술 |
JavaEE 기술 명세와 항목 기술/ 구현 서버
- 항목 기술은 다음과 같다.
구분 | Servlet | JSP | EL | EJB |
---|---|---|---|---|
Java EE 5 | ver 2.5 | ver 2.1 | - | ver 3.0 |
Java EE 6 | ver 3.0 | ver 2.2 | ver 2.2 | ver 3.1 |
Java EE 7 | ver 3.1 | ver 2.3 | ver 3.0 | ver 3.2 |
Java EE 8 | ver 4.0 | ver 2.3 | ver 3.0 | ver 3.2 |
- 구현서버 버전은 다음과 같다.
구분 | 서버 | WebLogic | WebSphere | JEUS | Tomcat |
---|---|---|---|---|---|
Java EE Ver | 5 | 10.3 | 6.1, 7.0 | 6.0 | 6.0 |
Java EE Ver | 6 | 11g, 12c | 7.0, 8.0 | 7.0 | 7.0 |
Java EE Ver | 7 | 12c, 12.2 | 8.5, 9.0 | 8.0 | 8.0 |
Java EE Ver | 8 | 12.2.1, 14.1 | 9.0.x | 8.1, 8.2 | 8.5, 9.x |
- 이처럼 버전 별로 다르기 때문에
서블릿 컨테이너와 서블릿
서블릿(Servlet)
- 서블릿은 자바로 작성된 서버 측 컴포넌트로, 클라이언트의 HTTP 요청을 처리하고, 그 결과로 HTTP 응답을 생성하는 역할을 한다.
- 서블릿은 동적인 웹 콘텐츠를 생성하는 데 사용되며, 자바의 클래스로 구현된다.
서블릿 컨테이너(Servlet Container)
- 서블릿 컨테이너는 서블릿을 관리하고 실행하는 환경을 말한다. Java EE 표준을 따르며, 서블릿의 생명 주기(생성, 초기화, 요청 처리, 종료)를 관리한다.
- 서블릿 컨테이너는 HTTP 요청을 받아 서블릿으로 전달하고, 서블릿의 응답을 클라이언트로 돌려보낸다.
- 또한, 서블릿 컨테이너는 멀티스레딩, 세션 관리, 보안 등의 기능을 제공하여 서블릿이 효율적으로 작동할 수 있도록 지원한다.
서블릿과 서블릿 컨테이너의 관계
- 서블릿은 서블릿 컨테이너 안에서 실행됩니다. 서블릿 컨테이너는 서블릿을 생성하고, 초기화하며, 클라이언트의 HTTP 요청을 서블릿에 전달하고, 서블릿이 생성한 HTTP 응답을 클라이언트에게 다시 전송하는 역할을 한다.
- 서블릿의 생명 주기(생성, 초기화, 서비스 요청 처리, 종료)는 서블릿 컨테이너에 의해 제어된다. 서블릿 컨테이너가 없다면, 서블릿은 독립적으로 동작할 수 없다.
JAVA EE / Jakarta EE
- 과거에는 Oracle이 관리했으나, 2017년에 Eclipse Foundation으로 이관되면서 Jakarta EE로 이름이 변경되었다.
- Jakarta EE는 엔터프라이즈급 애플리케이션 개발에 필요한 확장된 기능을 제공하며, 웹 애플리케이션, 대규모 분산 시스템, 트랜잭션 처리, 메시징 등의 기능을 포함한다.
- JavaEE 버전에 따라 SpringBoot(Tomcat)버전이 다르다.
Tomcat 설치 및 구동
- tomcate서버의 구조는 다음과 같다.
Tomcat 서버 구조
- Web Brower : 유저에게 UI를 출력하는 곳이다. 정적자원을 실행하는 주체이다.
- Mini Web Server : 정적자원을 관리하는 곳이다.
- Web Container(Servlet Container) : Servlet을 구축하는 환경이다. Application에 명령을 호출한다.
- Java App : Servlet을 수행하며 동적자원을 관리한다.
Tomcat 서버 실행
- tomcat mini web sever는 개발용으로는 적합하나, 성능이 제한된다.
- web server는 NginX와 같은 외부 서버를 혼용해서 사용한다.
웹 프로젝트 생성 및 구동
- Tomcat server 실행 방법은 간접실행과 직접실행이 있다.
- 간접실행 : Tomcat Embedded서버를 통해 서버를 구동하는 방식.
- 직접실행 : .war파일을 tomcat서버 파일에 옮기거나 Eclipse임시폴더로 구동하는 방식.
웹애플리케이션 + 톰캣서버 배치
- 웹애플리케이션 + 톰캣서버 : 라이브러리를 통해서 Tomcat Embedded Server를 구축 하여 jar파일을 생성한다.
- Tomcat Embedded Server 구축 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.io.File;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
public class App {
public static void main(String[] args) throws Exception {
System.out.println("서버 시작!");
// 톰캣 서버를 구동시키는 객체 준비
Tomcat tomcat = new Tomcat();
// 서버의 포트 번호 설정
tomcat.setPort(8888);
// 톰캣 서버를 실행하는 동안 사용할 임시 폴더 지정
tomcat.setBaseDir("temp");
// 톰캣 서버의 연결 정보를 설정
Connector connector = tomcat.getConnector();
connector.setURIEncoding("UTF-8");
// 톰캣 서버에 배포할 웹 애플리케이션의 환경 정보 준비
StandardContext ctx = (StandardContext) tomcat.addWebapp("/", // 컨텍스트 경로(웹 애플리케이션 경로)
new File("src/main/webapp").getAbsolutePath() // 웹 애플리케이션 파일이 있는 실제 경로
);
ctx.setReloadable(true);
// 웹 애플리케이션 기타 정보 설정
WebResourceRoot resources = new StandardRoot(ctx);
// 웹 애플리케이션의 서블릿 클래스 등록
resources.addPreResources(new DirResourceSet(resources, // 루트 웹 애플리케이션 정보
"/WEB-INF/classes", // 서블릿 클래스 파일의 위치 정보
new File("bin/main").getAbsolutePath(), // 서블릿 클래스 파일이 있는 실제 경로
"/" // 웹 애플리케이션 내부 경로
));
// 웹 애플리케이션 설정 정보를 웹 애플리케이션 환경 정보에 등록
ctx.setResources(resources);
// 톰캣 서버 구동
tomcat.start();
// 톰캣 서버를 구동한 후 종료될 때까지 JVM을 끝내지 말고 기다린다.
tomcat.getServer().await();
System.out.println("서버 종료!");
}
}
- 코드의 구조는 다음과 같다.
직접배치
- 직접배치 하는 방법은 표준 웹프로젝트 구조를 참고하여 직접 war파일을 옮기는 방법과 Eclipse에서 지원하는 자동 배치하는 방법이 있다.
- 프로젝트 하위 폴더에 webapp에서 정적자원을 관리하고, WEB-INF에서 동적 파일 및 설정 파일 관리한다.
- Maven 표준 웹 프로젝트 구조를 참고하여 war파일을 생성한다.
- 생성된 war파일을 tomcat 서버 webapps에 놓는다.
- 서버를 실행하면 war파일의 압축이 풀리면 app폴더가 생성 된다.
Eclipse 배치
- Eclipse에서 설정에서 서버를 설정한다.
- 서버를 추가하고, 서버를 구축할 java프로젝트를 선택한다.
- 서버를 Pulishgkaus Eclipse임시 배치 폴더에 웹프로젝트가 생성된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.