본문 바로가기
사이드 프로젝트/To-do 캘린더 프로젝트

Spring boot 프로젝트 AWS 배포 오류 해결기록(8)

by Baley 2022. 9. 16.

1. 문제점: Permission Denied

캡처1

이번 프로젝트를 배포할 때 가장 시간을 오래 끌었던 문제가 이 Permission Denied 에러였다. 무엇 때문에 어디에 접근하는 권한이 거절되었는지 확인하기 위해 vim nohup.out 명령어를 입력해 로그를 확인해보았다.

캡처2

데이터베이스가 있는 url 자체를 찾지 못한다고 한다.

application.properties는 ec2에 올려져 있었고 같은 똑같은 application.properties 내용으로 로컬에서 실행할 때는 별 문제가 없었는데 서버에서 실행하니 url이 지정되어 있지 않아 DataSource를 설정할 수 없다고 한다.

application.properties에는 spring.datasource이라는 prefix가 붙은 채로 url과 driver-class-name, username, password가 잘 들어가 있었다. vim nohup.out에 들어가니 좀 더 자세한 에러 내역을 볼 수 있었다.

 

2. 문제점 세부사항:

캡처3

2-1. Cannot resolve reference to bean 'sqlSessionTemplate' while setting bean property 'sqlSessionTemplate'

sqlSessionTemplate에서 bean을 생성하지 못 한다.

2-2. Error creating bean with 'sqlSessionFactory' defined in class path resource

sqlSessionFactory 역시 bean을 생성하지 못한다.

myBatisAutoConfiguration에서 sqlSessionTemplate과 sqlSessionFactory를  생성하지 못 했던 것이다. mapper를 찾지 못 해 생기는 문제가 생긴 것으로 추측된다.

mybatis를 사용할 때 mapperLocation의 위치를 지정해야 ~mapper.xml의 위치를 찾는데 myBatis에 관한 모든 설정을 application.properties에 몰아넣은 상태였다. 

캡처4

 mybatis.config에 mybatis 설정 파일을 지정해놓고 정작 설정 파일에 들어가야 할 내용도 모두 application.properties에 넣은 것이다. mybatis-config.xml이 있긴 하나 안의 내용은 비어 있는 상태였다. 그 상태로도 로컬에선 별 문제가 없었기 때문에 mybatis-config.xml을 사용하지 않아도 내용이 비어있는 대로 두고 삭제하지 않고 두었던 것이 문제였다.

 

3. 문제 원인 파악: MyBatis AutoConfiguration 작동

mybatis-config.xml에 별다른 내용이 없더라도 문제가 되지 않을 거라 생각한 것은 어차피 application.properties에서 'mybatis'하는 prefix가 붙어있는 속성이 있다면 읽어 들일 거라 안일하게 생각했기 때문이다.

application.properties에 작성하는 것과 myBatis 설정 파일에 myBatis 설정을 입력하는 것이 어떻게 다른지 찾아보자. 

myBatisAutoConfiguration 디펜던시에 들어가 보면 MabatisProperties라는 클래스가 있다.

캡처5: MybaitsProperties.class 내부

mybatis라고 prefix가 붙은 내용을 모두 읽어 들이도록 상수가 'mybatis'로 설정되어 있고 checkConfigLocation 값이 false로 지정되어 있다. 여기서 유의할 게 false가 configLocation이 존재하는 상태이다.

캡처6: MyBatisAutoConfiguration.class 내부

그리고 MyBatisAutoConfiguration 클래스에서 MyBatisProperties클래스의 checkLocation 필드와 configLocation 필드의 값을 이용해 if문으로 mybatis 설정 파일이 있는지 없는지 확인한다. 존재한다면 MyBatisProperties의 checkLocation이 초기값 그대로 false이므로 if문이 작동하지 않지만  없다면 true가 되어 if문 안 쪽의 코드가 실행되어 mybatis 설정 파일을 찾을 수 없다는 안내물을 출력하다.

일단 myBatis설정 파일이 존재한다고 판단된다면 설정 파일에서만 myBatis setting 속성을 읽어 들인다. 이번 프로젝트의 경우, 설정 파일이 존재한다고 applicaton.properties에는 명시해서 myBatis AutoConfigurtion이 mybatis-config.xml을 찾아 읽어들였지만 그 내용이 비었기에 sqlSessionTemplate와 sqlSessionFactory가 생성되지 못했던 것이다. 하지만 mybatis-config.xml이 존재하기는 해서 myBatis 설정파일이 없다는 안내문은 출력되지 않은 것이다.

mybatis의 resultType를 자동으로 연결해줄 수 있는 mapUnderscoreToCamelCase 설정을 mybatis-config.xml에서 찾을 수 없으니 sqlSessionTemplate 에러가 났다. 

 

4. 원인

 Auto-mapping을 하려면 mapUnderscoreToCamelCase 설정을 true로 지정해서 JAVA Class의 변수명과 데이터베이스의 컬럼명이 일치하도록 설정해야 했는데 mybatis-config.xml에 해당 설정이 존재하지 않아 auto-mapping이 되지 않아 sqlSessionTemplate에서 에러가 난 것이다.  

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html#auto-mapping

 

MyBatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면

mybatis.org

 

5. 해결방안

 따라서 application.properties에는 mapperLocation과 mybatis-config.xml의 위치만 명시해주고 mybatis-config.xml에서 mapUnderscoreToCamelCase설정과 typeAliasesPackage설정을 해주니 permission denied 에러까지 해결되었다.

캡처7

이것 때문에 며칠을 dependency에 있는 코드와 매뉴얼들을 찾으며 보냈는지 모르겠다. 막상 해결하고 나니 정말 별거 아닌 걸로 고생한 것 같지만 스프링 자동 설정과 내부 구조에 대해 깊게 찾아볼 수 있었다.

 


 

# 참고:

https://yangbox.tistory.com/30?category=853536 

 

Springboot의 자동설정(starter 라이브러리)

스프링부트에서 의존성을 추가하고 싶을 때 주로 스프링부트에서 제공하는 starter 라이브러리를 의존성 설정파일에 추가한다. 예를들어 Mybatis 라이브러리를 추가하고자 하면 제공되는 starter 라

yangbox.tistory.com

 

댓글