본문 바로가기

공부방/Spring

스프링부트

 

 

전통적인 방식

과거에 자바로 웹 애플리케이션을 개발할 때는 먼저 서버에 톰캣 같은 WAS(웹 애플리케이션 서버)를 설치했다.

그리고 WAS에서 동작하도록 서블릿 스펙에 맞추어 코드를 작성하고 WAR 형식으로 빌드해서 war 파일을 만들었다.

이렇게 만들어진 war 파일을 WAS에 전달해서 배포하는 방식으로 전체 개발 주기가 동작했다.

이런 방식은 WAS 기반 위에서 개발하고 실행해야 한다.

IDE 같은 개발 환경에서도 WAS와 연동해서 실행되도록 복잡한 추가 설정이 필요하다.

 

최근 방식

최근에는 스프링 부트가 내장 톰캣을 포함하고 있다.

애플리케이션 코드 안에 톰캣 같은 WAS가 라이브러리로 내장되어 있다는 뜻이다.

개발자는 코드를 작성하고 JAR로 빌드한 다음에 해당 JAR를 원하는 위치에서 실행하기만 하면 WAS도 함께 실행된다.

쉽게 이야기해서 개발자는 main() 메서드만 실행하면 되고, WAS 설치나 IDE 같은 개발 환경에서 WAS 와 연동하는 복잡한 일은 수행하지 않아도 된다.

 

그런데 스프링 부트는 어떤 원리로 내장 톰캣을 사용해서 실행할 수 있는 것일까? 지금부터 과거로 돌아가서 톰캣도 직접 설치하고, WAR도 빌드하는 전통적인 방식으로 개발을 진행해보자. 그리고 어떤 불편한 문제들이 있어서 최근 방식으로 변화했는지 그 과정을 함께 알아보자. 이미 잘 아는 옛날 개발자들은 WAS를 설치하고 war를 만들어서 배포하는 것이 익숙하겠지만, 최근 개발자들은 이런 것을 경험할 일이 없다. 그래도 한번은 알아둘 가치가 있다. 과거에 어떻게 했는지 알아야 현재의 방식이 왜 이렇게 사용되고 있는지 더 깊이있는 이해가 가능하다. 서블릿 컨테이너도 설정하고, 스프링 컨테이너도 만들어서 등록하고, 디스패처 서블릿을 만들어서 스프링 MVC와 연결하는 작업을 스프링 부트 없이 직접 경험해보자. 그러면 스프링 부트가 웹 서버와 어떻게 연동되는지 자연스럽게 이해할 수 있을 것이다. 참고로 여기서는 web.xml 대신에 자바 코드로 서블릿을 초기화 한다. 옛날 개발자라도 대부분 web.xml 을 사용했지 자바 코드로 서블릿 초기화를 해본 적은 없을 것이므로 꼭 한번 코드로 함께 따라해보자.

 

 

JDK 17 version 다운로드

 

https://www.oracle.com/java/technologies/downloads/#jdk17-windows

 

아래 링크되어 있는 오라클 자바 다운로드 페이지에서 원하는 JDK를 사용하고 있는 운영체제에 맞게 다운받습니다. 저는 윈도우용 JDK 17을 다운로드하도록 하겠습니다.

다운로드한 jdk-17_windows-x64_bin.exe를 실행시켜 원하는 폴더에 JDK 17를 설치합니다.

 

내 PC -> 우클릭 -> 속성을 눌러 시스템 정보로 들어간 뒤 관련 설정에 고급 시스템 설정을 누릅니다. 그러면 시스템 속성 창이 뜨게 될 텐데 상단의 고급 탭에서 환경 변수 버튼을 클릭합니다. 

 

기존에 다른 버전의 JDK가 설치되어 있었다면 시스템 변수에 JAVA_HOME이 있을 겁니다. 이것을 클릭한 뒤 편집 버튼을 누릅니다.

JAVA_HOME의 변수 값에 설치 한 jdk17의 위치를 넣어준 뒤 확인 버튼을 누릅니다.

작업 표시줄 검색창에 cmd를 입력한 뒤 명령 프롬프트를 켜고 java -version 명령어를 입력하여 자바 버전이 제대로 변경되었는지 확인합니다.

 

 

참고 : https://coding-factory.tistory.com/823

 

Tomcat 설치

다운로드 받아서 압축을 풀고 실행하면 된다.

https://tomcat.apache.org/download-10.cgi

 

 

아래와 같이 실행이 된다. (한글 문제가 좀 있네요)

localhost:8080으로 들어가면 tomcat이 실행된 것을 확인할 수 있다.

 

 

build 파일 생성

gradlew build  명령어로 build 파일 생

 

war 파일을 확인해보자

jar -xvf server-0.0.1-SNAPSHOT.war

 

압축을 풀어보니 3개의 폴더 및 파일이 나타날 것입니다..

META-INF

 - 클래스나 라이브러리가 들어가게됨

WEB-INF

index.html

 

JAR, WAR 간단 소개 

JAR 소개

자바는 여러 클래스와 리소스를 묶어서 JAR (Java Archive)라고 하는 압축 파일을 만들 수 있다.

이 파일은 JVM 위에서 직접 실행되거나 또는 다른 곳에서 사용하는 라이브러리로 제공된다.

직접 실행하는 경우 main() 메서드가 필요하고, MANIFEST.MF 파일에 실행할 메인 메서드가 있는 클래스를 지정해두어야 한다.

 

실행 예) java -jar abc.jar

Jar는 쉽게 이야기해서 클래스와 관련 리소스를 압축한 단순한 파일이다.

필요한 경우 이 파일을 직접 실행할 수도 있고, 다른 곳에서 라이브러리로 사용할 수도 있다.

 

WAR 소개

WAR(Web Application Archive)라는 이름에서 알 수 있듯 WAR 파일은 웹 애플리케이션 서버(WAS) 에 배포할 때 사용하는 파일이다.

JAR 파일이 JVM 위에서 실행된다면,

WAR는 웹 애플리케이션 서버 위에서 실행된다.(JAVA -> WAS -> WAR)

웹 애플리케이션 서버 위에서 실행되고, HTML 같은 정적 리소스와 클래스 파일을 모두 함께 포함하기 때문에 JAR와 비교해서 구조가 더 복잡하다.

그리고 WAR 구조를 지켜야 한다.

 

WAR 구조

WEB-INF
    classes : 실행 클래스 모음
    lib : 라이브러리 모음
    web.xml : 웹 서버 배치 설정 파일(생략 가능)
index.html : 정적 리소스

WEB-INF 폴더 하위는 자바 클래스와 라이브러리, 그리고 설정 정보가 들어가는 곳이다.
WEB-INF 를 제외한 나머지 영역은 HTML, CSS 같은 정적 리소스가 사용되는 영역이다.

 

WAR 배포

이렇게 생성된 WAR 파일을 톰캣 서버에 실제 배포해보자.

1. 톰캣 서버를 종료한다. ./shutdown.sh

2. 톰캣폴더/webapps 하위를 모두 삭제한다.

3. 빌드된 server-0.0.1-SNAPSHOT.war 를 복사한다.

4. 톰캣폴더/webapps 하위에 붙여넣는다.

    톰캣폴더/webapps/server-0.0.1-SNAPSHOT.war

5. 이름을 변경한다.

    톰캣폴더/webapps/ROOT.war

6. 톰캣 서버를 실행한다. ./startup.sh

 

webapps에 있는 예제 폴더들은 모두 지워준다.

 

 

톰캣 설정 - 인텔리J 유료 버전