가장 처음에 발생했던 에러는 위와 같은 '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를 인식할 수 있기 때문에 귀찮더라도 재부팅을 하고 다시 진행합니다!
이제 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> 이라는 문구로 커맨드를 입력하게 되었다면 제대로 연결이 된 것입니다.
이 과정에서 다른 설정을 더 추가할 수도 있지만 이 과정은 추후에 기회가 된다면 다른 포스팅에서 추가적인 설명을 해 보도록 하겠습니다.(여기서는 생략하겠습니다.)