프로그래밍/스프링

[스프링 부트로 배우는 자바 웹 개발]1. 개발 환경의 변화와 자바

돌비돌비돌비 2018. 11. 18. 20:48

1.1 인프라와 스프링 프레임워크의 변화


1.1.1 아키텍처의 변화


- 1단계) 서버/클라이언트 개념의 등장 : GUI개발의 본격화, 델파이를 이용한 업무 프로그램과 ActiveX를 이용한 웹 애플리케이션

- 2단계) 서버에서 파일로 데이터를 저장하거나 소켓 통신을 통해 클라이언트와 통신

- 3단계) 전자상거래, 웹의 인기, 상용 관계형 DB의 흥행

3tier : 서버(JSP,PHP,ASP) - 클라이언트 - 데이터베이스

- 4단계) 클라우드 서비스 :

장점 : 인스턴스 형태로 자유롭게 확장 가능

단점 : 클라우드 업체의 기술에 종속, 정해진 요금제 사용



1.1.2 스프링 프레임워크의 변화


초기 : 오라클, IBM 등 업체가 제공하는 솔루션을 사용

-> 웹로직, 웹스피어 같은 서버 사용 + EJB(Enterprise JavaBean)을 이용하여 개발 + 톰캣의 성능 안정

이후 : 많은 스타트업의 클라우드 사용 빈도 증가

-> PasS로 서버를 인스턴스로 사용함에 따라 JDK, 톰캣을 설치, XML 설정 단계의 간소화 필요

-> 로드 존슨이 만든 '스프링 프레임워크'

-> 루비온레일스, 장고로 빠르게 개발하지만 스프링은 빠르게 개발할 수 없다.

-> 무거워진 스프링을 대체하기 위해 스프링 부트의 등장



1.2 웹 애플리케이션 컨테이너


- 웹 서버 : HTML과 같은 정적 파일들을 전달해 주는 서버

- 웹 애플리케이션 컨테이너(Web Application Container) : 웹 애플리케이션이 배포되는 공간 + 동적인 페이지를 생성하는 웹 서버

= 웹 애플리케이션 서버(WAS, Web Application Server)




1.2.1 자바 개발을 위해 꼭 필요한 클래스 로더

WAS가 웹 애플리케이션을 인식하고 동작시키는지 알기 위한 클래스 로더


  •  클래스 로더

- Write once, run anywhere

- 자바 코드를 작성한 후 컴파일하면 JVM에서 실행 가능한 상태가 된다.

- 이 클래스를 JVM이 실행하기 위해서는 클래스로더가 클래스를 로딩해야한다.


    • 클래스 로더의 특징
      1. 구조가 계층적이다. 상위 클래스 로더가 하위 클래스 로더를 갖는 방식이다. 최상위 클래스 로더는 부트스트랩 클래스 로더.
      2. 클래스 로딩을 위임할 수 있다. 
      3. 가시적인 규약이 있다. 
      4. 클래스 언로딩 불가능이다. 가비지 컬렉터가 동작하거나, WAS가 재시작할때 초기화된다.

자식 클래스로더는 클래스 로딩 요청 위임을 통해 부모 클래스 로더가 로딩한 클래스를 찾을 수 있다.
부모->자식은 안된다.

    • 클래스 로더의 유형
Image result for 클래스 로더

1) 부트스트랩 클래스 로더 : JVM 런타임 실행의 기반이 되는 파일들을 로드. rt.jar 파일과 연관이 있다.
2) 확장 클래스 로더 : 부트스트랩 클래스 로더가 로딩이 끝나면 자바의 최상위 객체인 Object를 포함한 자바 API를 로드한다.
(자바 홈 폴더 하위의 ext 폴더 하위에 있는 jar파일들과 연관이 있다.)
3) 시스템 클래스 로더 : 확장 로더의 로드가 끝나면 클래스패스에 포함된 클래스들을 로드한다.
4) 유저 정의 클래스 로더

※ 클래스 로더는 이와 같은 계층 관계를 가지고 있다.
※ 사용자는 시스템 클래스 로더가 로드하는 클래스 패스 영역에만 접근할 수 있다.
※ 독립적인 영역이 필요한 WAS의 경우에는 시스템 클래스 로더 하위에 사용자 정의 로더를 만들어서 사용한다.
ex)톰캣 설치 위치를 CATALINA_HOME으로 지정하는 것


    • WAR파일의 특성

JAR : 로컬 실행 프로그램
WAR : 웹 실행 프로그램.


Image result for web archive 구조
웹 애플리케이션 컨테이너는 WAR파일의 WEB-INF 폴더를 기준으로 클래스 파일들을 로드한다.



애플리케이션 클래스 로더는 사용자 정의 클래스 로더에 해당한다. 


웹 애플리케이션 컨테이너는 웹 애플리케이션 자체 API를 제공하기 위해 컨테이너를 로드하는 클래스 로더와 
사용자가 추가한 JSP나 WAR파일들을 다루기 위한 ServletContext Loader를 사용한다.
컨테이너가 시작되고 Context가  서블릿 스펙의 권장 사항에 따라 WEB-INF/classes 파일을 먼저 검색해서 로딩하고, 그 후에 WEB-INF/libs에 있는 JAR파일들을 로딩한다.

==> 톰캣이라는 컨테이너가 자체 API를 이용하기 위해 서블릿컨테이너 클래스 로더를 실행
  + 사용자가 추가한 JSP, WAR파일들을 이용하기 위해 서블릿컨텍스트 클래스 로더를 실행