Java Spring, JPA 프로젝트 배포 도전기, 근데 이제 오류를 곁들인...

timo·2021년 8월 18일
1

troubleshooting

목록 보기
9/11
post-thumbnail

엄청나게 더운 날씨와 함께 프로젝트를 시작했었는데, 어느덧 아침저녁이면 서늘해졌고 동시에 프로젝트도 배포 단계에 돌입했다. 말로만 들어 보았던 'AWS'를 통해 '배포'를 해보는 것이 재미있었지만, 말로만 들은 만큼 마주쳤던 수많은 오류들을 기록해보려 한다.ㅎㅎ

📌 EC2 인스턴스 git clone 실패

EC2 인스턴스를 생성 후, 접속하여 git을 설치했다. 우리 프로젝트 repository 통해 clone을 시도했지만 다음과 같은 에러메세지가 발생했다.

Permission denied (publickey).

https://chucoding.tistory.com/23

해당 인스턴스에 대한 SSH키를 등록하지 않아 발생하는 문제였다.

등록 후 정상적으로 clone되는 모습.

📌 gradlew test의 실패

해당 문제는 해결하기에 상당히 긴 시간이 걸렸다.

1. permission denied

그렇게 clone을 하고 설레는 마음으로 ./greadlew test 를 진행했지만 반겨주는 것은 마찬가지로 permission denied였다.

https://velog.io/@donghyeondev/.gradlew-test-%EC%8B%9C-Permission-denied

permission에 관련된 문제이다보니 해당 사안은 금방 처리할 수 있었다. chomod +x ./gradlew 를 통해 권한을 주니 실행할 수 있었다.

2. java 버전으로 인한 빌드 실패

다른 형태의 에러 메세지를 발견할 수 있었다.

invalid source release: 11

라는 메세지를 통해 java 버전의 문제임을 알 수 있었다. 우리의 프로젝트 build.gradle 를 살펴보면 sourceCompatibility = '11', 즉 java 11이었고, 내가 EC2 인스턴스에 설치한 버전은 8 이었다.

https://pompitzz.github.io/blog/Java/awsEc2InstallJDK11.html#jdk-%E1%84%89%E1%85%A5%E1%86%AF%E1%84%8E%E1%85%B5

해당 게시글의 도움을 받아 Java 11을 설치하고 다시 시도했다.

3. 메모리 부족인가..?

이전과 다른 에러 메세지를 출력했다. 이 시점부터 상당한 시간이 소모되었다.

구글링을 통해
https://velog.io/@kot8585/AWS-%EC%97%90%EB%9F%AC
첫번째 방향으로서 이 게시글과 비슷한 오류인 것 같다는 생각이 들었다.

메모리가 문제일 것 이라는 생각이었는데, 우리 프로젝트의 Test들을 진행하는 듯 보였는데, Java Spring에선 application.yml 파일에 DB에 대한 명시가 없으면 메모리를 사용하여 테스트를 진행한다.

aws 프리티어로서 무료로 사용이 가능한 인스턴스, 즉 사양이 매우 낮은 컴퓨터이기 때문에 메모리 부족으로 인한 오류일 것이고, 때문에 swap memory를 설정해보았다.

https://transferhwang.tistory.com/506
해당 글을 따라 swap 메모리를 설정했다.

3-1. swap 메모리를 설정하면서..

swap 메모리를 위한 공간을 확보하면서 또 자잘한 오류들을 접할 수 있었는데..(끝없는 오류의 연속)

sudo dd if=/dev/zero of=/swapfile bs=128M count=16

사진 첫줄에서 확인할 수 있는 위 코드는, swap 메모리를 위한 공간을 확보하는 코드이다. 간단히 말하자면 bs블럭 사이즈를 의미하는데, 128MB의 블럭을 확보하는 행위를 16번 반복한다는 의미이다.

여기서 나는 해당 코드를 작성하고도 반응이 없었는데, 이유는 블럭 사이즈가 현재 사용 가능한 메모리의 용량보다 작아야 하기 때문이다.

위 사진을 다시 확인하면, Mem:, free가 110M이다.

4. 테스트의 실패

swap메모리 추가 이후 또다시 에러 메세지가 달라졌다.

이제는 테스트 실행 단계까지 왔지만, 테스트가 통과되지 않았다.

여기서 또다시 상당한 시간을 고민했는데 (과부화)

고민점은 다음과 같았다. 우선 오류 메세지는 dataSource에 관련된, 즉 테스트를 실행 할 데이터베이스를 제대로 설정해 주지 않았다는 내용 같았다. 하지만 앞서 언급했듯, application.yml에 관련된 내용이 없으면 자동으로 메모리를 사용하여 테스트를 진행할텐데 계속해서 에러메세지가 발생했다. EC2 인스턴스가 아닌 로컬에서 테스트를 진행할 때도 어떤 부분에서 오류가 발생하고 발생하지 않는지 정확히 구분할 수 없었다.

결국 다음날 이유를 찾을 수 있었는데, 역시 원인은 가까운 곳에 있었다.

우리 프로젝트는 로컬 개발에서부터 mysql을 사용했기 때문에, build.gradle파일에 mysql만 의존성이 추가되어져 있었다.

메모리 기반의 테스트를 하기 위해선 결국 H2 데이터베이스가 필요했고, 이것도 의존성에 추가를 해야한다는 점을 놓쳤다.

이렇게 의존성에 testImplementation('com.h2database:h2') 한줄을 추가했고,

BUILD SUCCESSFUL 을 발견할 수 있었다!!

마무리

application.yml, build.gradle 등 기본적인 설정에 대한 이해가 부족하단 것을 확실히 느낄 수 있었다.. 그리고 아직 끝나지 않았다 ㅎㅎ

profile
Backend Developer

0개의 댓글