새소식

반응형
Back-end/Spring

[Spring] Part 1-2. 나만의 MVC 프레임워크 만들기 | Gradle 개발 환경 구성하기 (with 도커|Docker)

2023.01.09
  • -
반응형

1. Intro

이번에는 웹 프로젝트 개발 환경을 구성해 보도록 하겠습니다.

 

2. 웹 프로젝트 환경 구성

2-1. 프로젝트 생성

먼저 프로젝트를 생성해 주겠습니다.

IntelliJ 프로젝트 생성 창

 

위와 같은 설정을 마치고 create 버튼을 누르면 해당 디렉터리에 파일이 생성되게 됩니다. 아래 사진과 같이 말입니다.

만들어진 프로젝트

위 부분에서 저는 org.example이라는 패키지가 자동으로 만들어졌는데 혹시나 만들어지지 않으신 분들은 src > main > java 밑에 org.example이라는 패키지를 새로 만들어 주시길 바랍니다.

 

 

또한 그 밑에는 Main이라는 자바 파일이 있을텐데요 해당 클래스명을 위 사진과 같이 WebApplicationServer로 바꾸어 주었습니다.

이는 main 메소드를 실행했을 때 톰캣이 실행되도록 하기 위한 밑작업이라고 보시면 되겠습니다.(main 메소드 이름은 그대로 놔둡시다. 해당 코드는 아래에 나옵니다.)

 

 

2-2. 의존성 추가

이제 실습에 필요한 의존성을 추가하도록 하겠습니다.

 

 

첫번째 의존성은 이번 프로젝트에서는 WAS(Web Application Server)로 임베디드 톰캣(embed Tomcat)을 사용할 것이기 때문에 build.gradle 파일의 dependencies 밑에 이와 관련한 의존성을 추가하겠습니다.

이 사진처럼 dependencies 밑에 추가합니다.

implementation 'org.apache.tomcat.embed:tomcat-embed-core:8.5.42'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:8.5.42'

 

그리고 톰캣을 servlet을 실행하기 때문에 servlet 의존성도 추가합니다.

implementation 'javax.servlet:javax.servlet-api:4.0.1'

 

또한 간단한 jsp 화면을 만들기 위해서 아래와 같은 의존성도 추가해 줍니다.

implementation 'javax.servlet:jstl:1.2'

 

 

마지막으로 로그를 볼 수 있게 하기 위해 아래와 같은 의존성을 추가하고 이제 본격적으로 실습에 들어가겠습니다.

implementation 'ch.qos.logback:logback-classic:1.2.3'

 

항상 build.gradle 파일이 변경 된 후에는 반드시 아래와 같은 아이콘을 클릭하여 sync를 맞추어 주셔야 적용이 되는 것을 잊지 말아야 합니다. 

 

 

3. 실습

main 메소드를 실행했을 때 톰캣을 실행시키도록 코드를 구현해 보겠습니다.

package org.example;

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.slf4j.Logger;

import java.io.File;
import org.slf4j.LoggerFactory;


public class WebApplicationServer {
    private static final Logger log = LoggerFactory.getLogger(WebApplicationServer.class);

    public static void main(String[] args) throws LifecycleException {
        String webappDirLocation = "webapps/";
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);

        tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
        log.info("configuring app with basedir: {}", new File("./" + webappDirLocation).getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();
    }
}

왼쪽 초록색 플레이 버튼 클릭하여 main 메소드를 실행할 수 있습니다.

 

 

초반 dependencies 추가를 위해 작성했던 코드에서 발생한 오류

가장 처음에 발생했던 에러는 위와 같은 'Could not find javax.servlet.javax.servlet-api:4.0.1:' 이라는 에러였는데요. 

해당 에러는 제가 바보 같이 오타를 내서 에러가 발생한 것이었습니다... (오타 조심하세요...ㅎㅎ)

그래서 중간에 ':' 대신에 '.'으로 되어있어서 해당 부분을 바꾸어 주었습니다.

 

 

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]

그 다음에 발생한 오류는 'org.apache.catalina.LifecycleException: Failed to start component' 이라는 오류로 에러 로그를 구글에 검색해 보고 나와있는 솔루션대로 해 봐도 해결이 되지 않았습니다.

 

그런데 코드를 자세히 보니 webapps/ 밑에 out 파일을 생성하도록 한 것 같은데 빌드 시에 이것이 생성이 잘 되지 않고 있었고 해당 부분을 해결하기 위해서 out 파일을 생성하는 디렉터리 경로를 만들어주는 방법을 검색해 보았고 해결책은 다음과 같았습니다.

 

1. [IntelliJ IDEA] -> [File] -> [Project Structure] -> [Project Settings] -> [Project] 내에 Compiler output의 경로를 다음과 같이 설정해 줍니다.

[내 프로젝트 경로]\webapps\WEB-INF\classes

[내 프로젝트 경로]\webapps\WEB-INF\classes  로 설정해 줍니다.

 

2. 또한 같은 창에서 Modules에 들어가 내 프로젝트를 클릭하고 그 안의 main을 클릭하여 Compiler Output 부분에서 Use module compile output path를 클릭하고 Output path 부분도 위에서 설정한 것과 똑같은 경로로 설정해 줍니다.

 

3. 마지막으로 Settings > Build, Execution, Deployment > Build Tools > Gradle 에서 

Gradle projects 부분의 "Build and run using"과 "Run tests using" 부분을 Gradle에서 IntelliJ IDEA로 바꾸어 줍니다.

이를 통해 빌드를 했을 때 컴파일 된 output이 해당 경로로 지정되어 잘 실행 될 수 있을 것입니다. (항상 코드를 짠대로 환경을 그에 맞게 설정해 줍시다.)

 

사실 해당 부분은 톰캣의 규약이라고 합니다.

톰캣은 루트디렉터리 밑에 WEB-INF 밑에 classes 밑에서 필요한 파일들을 찾게 됩니다. 그래서 만약에 해당 부분에 빌드된 파일이 없다면 톰캣을 해당 파일을 실행할 수 없게 되고 당연히 그랬기 때문에 오류를 뿜어내게 되는 것입니다.

(애가 아파한다면 이유가 있었겠죠...ㅠㅠ)

 

정상적으로 빌드가 완료되어 실행되면 위와 같은 로그를 띄우면서 서버를 실행시키는 데 성공을 합니다. 빨간 글씨로 마구 되어 있긴 하지만 error를 내지 않았다면 정상적으로 작동한 것이니 무서워하지 않으셔도 됩니다.

 

 

4. 도커 및 도커 컴포즈 소개

도커

사진 출처: AWS

도커(Docker)는 아마 개발자를 희망하신다면 많이들 들어본 용어일 것입니다.

 

도커란 컨테이너 기반의 가상화 플랫폼입니다.

 

가상화에는 컨테이너 기반의 가상화하이퍼바이저 기반의 가상화(OS 가상화)가 있는데요, 

위 그림에서 왼쪽은 하이퍼바이저 기반의 가상화를 나타낸 모습이고 오른쪽이 컨테이너 기반의 가상화를 나타낸 모습입니다.

 

Hypervisor 기반 가상화

왼쪽편 이미지를 보시면 Guest OS라는 표현이 있고 조금 아래로 가시면 Host Operating System이라는 표현이 있습니다.

여기서 Host란 물리 서버를 의미하고 Guest는 가상 서버를 의미한다고 보시면 되겠습니다. 

 

그리고 host와 guest를 중간에서 연결해 주는 Hypervisor라는 역할이 있는데, 이는 서버 가상화 기술로써 host 서버에 설치되고 host와 guest를 나누는 역할을 하며, 각각의 guest는 hypervisor에 의해 관리되고, 시스템 자원을 할당받게 됩니다.

 

Hypervisor 기반의 가상화는 격리된 환경에서 또 하나의 가상 서버를 실행하는 기술이라고 생각하시면 쉬울 겁니다.

 

그리고 Guest OS로는 다양한 OS의 선택이 가능하며 GuestOS에서 실행되는 application이 host의 자원을 사용하기 위해선 반드시 GuestOS를 거쳐야만 하기 때문에 아무래도 속도적인 측면에서 느릴 수밖에 없는 것이죠.

 

Container 기반 가상화

오른쪽 편의 Conatiner 기반의 가상화는 격리된 환경에서 프로세스를 실행하는 기술이라고 생각하시면 될 것 같습니다.

 

애플리케이션은 Docker 엔진을 통해 호스트 자원을 사용할 수 있고 구조적으로 GuestOS가 존재하지 않기 때문에 용량도 매우 가볍습니다.

 

도커 허브(Docker Hub)

도커 허브란 도커에서 제공하는 이미지 저장소로 우리가 익히 알고있는 깃허브와 유사하다고 생각하시면 될 것 같습니다.

 

일단 아래 링크를 통해 들어가 보시면,

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

원하는 도커 이미지를 마음껏 검색해서 찾아내실 수 있습니다.

 

도커 컴포즈(Docker Compose)

또한 도커 컴포즈라는 개념도 있는데, 이는 다중 컨테이너를 정의하고 실행하기 위한 도구입니다.

즉, 여러 개의 프로세스(Mysql, Web sever, kafka, redis....) 를 하나의 파일로 정의해서 동시에 실행하기 위한 도구인 것입니다.

 

도커 컴포즈는 YAML 파일을 사용하여 다중 컨테이너를 구성합니다.

 

아래 링크를 통해 사용법과 도커 컴포즈가 무엇이고 어떤 기능을 할 수 있는지에 대해 자세히 알 수 있을 것입니다.

 

Overview

 

docs.docker.com

 

 

5. 도커를 이용한 환경 구성하기

아래 홈페이지에 접속하여 자신의 OS에 맞는 Docker Desktop을 설치해 줍니다.

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

 

 

설치가 완료되면 아래 명령어를 통해 설치가 제대로 이루어졌는지 확인합니다.

  • docker --version

 

설치가 제대로 되었다면 MySQL 도커 이미지를 다운로드 받을 것입니다.

이 역시 아래 링크(도커 허브) 들어가 mysql을 검색하면 mysql 도커 이미지가 나오는데요. 

 

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

 

아래 과정을 이어나가기 앞서서 컴퓨터 재부팅을 해야 docker를 인식할 수 있기 때문에 귀찮더라도 재부팅을 하고 다시 진행합니다!

 

이제 mysql image를 가져올 건데요.

mysql을 검색한 페이지에 어떤 방식으로 이미지를 pull 받을 수 있는지 명령어가 나옵니다. mysql을 pull 받는 명령어는 아래와 같습니다.

  • docker pull mysql:{version}
  • 저는 최신 버전을 pull 받기 위해서 docker pull mysql:latest 명령어를 입력하였습니다.

 

 

이미지를 다운받았으면 이제 MySQL 도커 컨테이너 생성과 실행을 하도록 하겠습니다.

docker run --name mysql-sample-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 msyql:{version}
  • 해당 명령어에 대한 설명은 공식 홈페이지에 자세히 나와있지만 위 명령어가 어떤 역할을 하는지 간략하게 설명하자면, run은 docker를 실행하겠다는 의미이고 --name 옵션은 뒤에 나올 인자로 컨테이너의 이름을 짓겠다는 의미이며, 그 뒤에 나오는 부분은 MYSQL_ROOT_PASSWORD, 말 그대로 root 권한을 가진 password를 설정하는 부분이며 -o 옵션으로 3306 포트에 연결하여 latest mysql 이미지를 사용하겠다는 것을 의미하고 있습니다.

 

docker가 제대로 실행되었는지 확인해 보기 위해선 docker ps 라는 명령어를 통해 확인할 수 있습니다. 

 

 

그렇다면 이제 도커 컨테이너에 접속하도록 해 보겠습니다.

docker exec -it {도커 컨테이너 이름} bash

 

컨테이너에 접속했다면 이제 해당 컨테이너에서 mysql에 붙어보도록 하겠습니다.

mysql -u root -p

앞서 설정했던 password를 입력하면 mysql> 이라는 문구로 커맨드를 입력하게 되었다면 제대로 연결이 된 것입니다.

 

이 과정에서 다른 설정을 더 추가할 수도 있지만 이 과정은 추후에 기회가 된다면 다른 포스팅에서 추가적인 설명을 해 보도록 하겠습니다.(여기서는 생략하겠습니다.)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.