유용한 정보

java10 및 서블릿 jsp 어플리케이션 구조

CyberI 2018. 9. 28. 10:25

java10

오라클이 3 20 Java SE 10(JDK 10) GA(general availability)를 발표했다. JDK 10은 자바 커뮤니티 프로세스 내 JSR 383에 명시된 대로 자바 SE 10 플랫폼의 상용 가능한 구현입니다.

2018 3 20일 발표. 일반 지원은 2018 9월에 종료될 예정이다. var 키워드를 이용한 지역 변수 타입 추론, 병렬 처리 가비지 컬렉션, 개별 쓰레드로 분리된 Stop-The-World, 루트 CA 목록 등이 추가되었다. 또한 JDK의 레포지토리가 하나로 통합되었으며, JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당할 수 있게 되었다. 실험 기능으로 Java 기반의 JIT 컴파일러가 추가되었고, 이전 버전에서 Deprecated 처리된 API Java SE 10에서 모두 삭제되었습니다.

jdk 릴리스에 대한 자세한 내용은  https://blogs.oracle.com/java-platform-group/introducing-java-se-10  블로그를 참조하면 되며 블로그에 명시된 명세서를 기반으로 작성해 봤습니다.

 

1. JEP 286: Local-Variable Type Inference

java 10의 변화 중 코드 측면에서 가장 흥미로운 점을 하나 고르라면 당연 Local Variable Type Inference 입니다. 로컬변수 선언을 var 를 이용하여 기존의 엄격한 타입 선언 방식에서 탈피하여 컴파일러에게 타입을 추론하게 할 수 있습니다. 기존에 lombok에서 제공하는 val/var 기능을 사용하고 계셨다면 크게 생소하진 않을 내용입니다.

Local Variable Type Inference는 다음과 같은 상황에서만 사용할 수 있습니다

초기화된 로컬 변수 선언 시

반복문에서 지역변수 선언 시 (enhanced for loop 포함)

Java 9에서 등장한 jshell를 이용하면 쉽게 테스트할 수 있습니다.

2. JEP 296: Consolidate the JDK Forest into a Single Repository

개발을 단순화하고 간소화하기 위해 JDK 포리스트의 수많은 리포지토리를 단일 리포지토리에 결합합니다.


3. JEP 204) 가비지 컬렉터 인터페이스 

GC (garbage collector) 인터페이스를 도입하여 다양한 가비지 콜렉터의 소스 코드 분리할 수 있도록 개선시켰습니다.


4. JEP 307: Parallel Full GC for G1

Java 9에서 default Garbage Collector G1 full GC를 피하도록 설계되었지만, concurrent GC에서 충분한 young area를 확보하지 못하면 full GC가 발생합니다. 기존 G1에서 full GC를 수행할 때 싱글 쓰레드 방식으로 동작하는 mark-sweep-compact 알고리즘을 사용하였습니다. G1 이전의 default 였던 parallel collector 처럼 G1에서도 full GC를 병렬화 시켜 G1의 최악의 케이스에서 지연 시간을 개선시켰습니다.


5. JEP 310: Application Class-Data Sharing

기존의 Class-Data Sharing(CDS) 기능을 확장해 애플리케이션 클래스를 공유 아카이브에 배치하고 서로 다른 자바 프로세스들이 공유함할 수 있도록 개선함으로써, startup 시간을 단축시키고 메모리 사용량을 최적화 시켰습니다. 기존에 AppCDS 기능은 상업용으로 Oracle JDK에서만 제공되었으나, 오픈소스화 되어 Open JDK에도 사용할 수 있게 되었습니다.


6. JEP 312: Thread-Local Handshakes

JVM safepoint Stop the World를 의미합니다. Thread-Local Handshake는 이런 safepoint가 발생하는 지점들을 줄이기 위한 프로젝트입니다. 모든 쓰레드를 동시에 멈춰야 했던 기존과 달리 쓰레드를 개별로 멈출 수 있게 되었고, VM safepoint를 수행하지 않고도 개별 Thread에서 콜백을 실행할 수 있습니다.


7. JEP 313: Remove the Native-Header Generation Tool (javah)

${JAVA_HOME}/bin 디렉터리 안에는 JDK에서 제공하는 수많은 툴들이 존재합니다. javah는 그 중에 하나로, 코드에 native 메서드들을 사용할 경우 JNI 헤더 파일들을 생성해줍니다. Java 8부터 javac에서 JNI 헤더 파일 생성을 지원하기 때문에 javah이 더 이상 필요하지 않아 제거되었습니다.


8. (JEP 314) 추가 유니 코드 언어

태그 확장 : BCP 47 언어 태그의 추가 유니 코드 확장을 구현하기 위해 java.util.Locale 및 관련 API를 향상시킵니다.


9. (JEP 316) 대체 메모리 장치의 힙 할당

HotSpot VM Java 객체 힙을 사용자가 지정한 대체 메모리 장치 ( : NV-DIMM)에 할당 할 수 있도록합니다.


10. (JEP 317) 실험적인 Java 기반 JIT 컴파일러

Java 기반 JIT 컴파일러 Graal Linux / x64 플랫폼에서 시험용 JIT 컴파일러로 사용할 수 있습니다.


11. (JEP 319) Root Certificates

JDK에서 루트 인증서 CA (Certificate Authority) 인증서의 기본 세트를 제공합니다.


12. (JEP 322) 시간 기반 릴리스 버전 관리

현재 및 미래의 시간 기반 릴리스 모델에 대한 Java SE Platform JDK의 버전 문자열 스키마와 관련 버전 정보를 개정합니다.


서블릿/jsp 어플리케이션 구조

 

1. Servlet(서블릿)

서블릿을 한줄로 정의하자면 아래와 같이 정의할 수 있습니다.

웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술


[ Servlet 특징 ]

클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트

html을 사용하여 요청에 응답한다.

Java Thread를 이용하여 동작한다.

MVC 패턴에서 Controller로 이용된다.

HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다. UDP보다 속도가 느리다.

HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.

일반적으로 웹서버는 정적인 페이지만을 제공합니다. 그렇기에 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 합니다. 동적인 페이지로는 임의의 이미지만을 보여주는 페이지와 같이 사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미합니다. 여기서 웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이며, 동적인 페이지를 생성하는 어플리케이션이 CGI입니다.

JSP 특징

->빈즈(Beans)라고 하는 자바 컴포넌트를 사용할 수 있다.

->최초 서블릿으로 컴파일된 후에 메로리에서 처리되기 때문에 많은 사용자가 접속도 원할히 할 수 있다.

->JSP 또는 다른 서블릿간의 데이터 공유가 쉽다.(page, request, session, application, scope)

-> 자바의 모든 기능을 사용 할 수 있다.

 

JSP의 동작원리

기존 html 동작

기존의 HTML을 사용할 시 사용자가 특정 도메인 주소로 접속을 시도 하면, DNS 서버에서 IP주소를 반환 받아해당 포트로 접속을 시도하고 DocumentRoot로 설정된 디렉토리에서 index.html파일을 읽는다

 

JSP 구성과 흐름도

특정 도메인 주소로 접속을 시도하고 IP를 받은 후, 80포트로 접속을 시도한다.

웹 서버는 요청내용을 분석하고, 서블릿 컨테이너에게 요청을 넘긴다.

그리고 서블릿 컨테이너에서 JSP 파일에 해당하는 서블릿이 있는지 확인하고, 없을 경우 JSP 파일을 서블릿으로 컴파일한다. 컴파일된 JSP는 서블릿으로 변환되어 컨테이너에 적재된다.

서블릿 내용 중 데이터베이스 처리 부분이 있으면, 데이터베이스에서 데이터를 가져온다.

화면에 보일 내용을 정리해서 HTML 문서 형태로 클라이언트에 재 전송한다웹브라우저는 웹 서버에서 보낸 텍스트 내용 중 HTML 태그를 분석해서 적절히 변환하여 화면에 보여준다.