Search
Duplicate
🍃

Spring Profiles

Created time
2023/06/26 06:31
Last edited time
2023/07/11 03:47
Status
Done
tag

들어가기에 앞서

참고한 자료를 바탕으로 비전문가가 정리한 글이므로 오류가 있을 수 있습니다.
오류에 대한 지적 사항은 언제든지 환영합니다. 부디 댓글로 알려주시길 바랍니다. 감사합니다.

org.apache.ibatis.binding.BindingException

오늘은 Mybatis 동적 쿼리 활용 연습을 하던 도중 만난 문제의 해결 과정을 공유하려고 한다.
인텔리제이에서 위와 같이 Http Request를 실행하여 테스트를 진행하였으나, 아래의 에러를 만나고 말았다.
500 내부 서버에러가 발생한 모습
구현된 매퍼를 전혀를 인식하지 못 함
해당 에러는 매퍼를 전혀 인식하지 못 하는 문제로, 분명히 정확한 위치에 매퍼가 구현되어 있음에도 불구하고 디스패처 서블릿이 찾지 못 하는 상황이다.

Trouble Shooting

위 에러를 해결하기 위해 나는 다음과 같은 조치를 하였다.
1.
com.kalgooksoo.mapper.CategoryMapper 클래스에 insert라는 이름의 쿼리가 있는지 확인.
2.
매퍼 XML 파일 (CategoryMapper.xml)에서 insert라는 ID를 가진 SQL 매핑이 있는지 확인. 즉, 해당 XML 파일에 <insert id="insert">...</insert>와 같은 형태의 쿼리 매핑이 정의되어 있는지 확인.
3.
매퍼 XML 파일에 <mapper> 태그가 있는지 확인.
4.
SQL 쿼리에 오타나 올바른 구문을 따르지 않는 문제가 있는지 확인. 쿼리가 올바른 형식인지, 필요한 매개변수를 사용하고 있는지, 테이블 이름과 컬럼 이름이 정확한지 등을 확인.
5.
application.properties에서 매퍼 파일이 올바르게 등록되어 있는지 확인.
그러나, 여전히 위 문제는 해결되지 못 했다. 포기하려던 찰나, 스프링 프로젝트 설정파일이 application.properties 이 아닌 application-local.properties 인 것이 눈에 띄었고, 검색을 통해 스프링의 프로필과 관련이 있음을 알게 되었다.

Spring Profiles

스프링의 프로필은 스프링 프레임워크의 핵심 기능으로 빈을 프로필에 매핑할 수 있는 기능이다.
즉, 서로 다른 환경에서 서로 다른 프로필을 활성화하여 필요한 빈만 부트스트랩이 가능해진다.
내가 겪었던 에러는 바로 이 프로필을 설정하지 않아 생긴 문제였고,
application-local.properties 라는 이름처럼 프로필을 ‘local’로 설정해줘야지 해결이 가능했던 것이다.
default 프로필이 설정된 모습. spring.profiles.active=local이 아니면 인식을 못 한다.
위와 같이 application-local.properties 파일에 spring-profiled.active=local 이라고 설정하였더니 아래와 같이 정상적으로 응답을 받을 수 있게 되었다.
200코드 정상적으로 응답하는 모습
spring-profiled.active=local 을 적는 대신 위와 같이 Run Configurations에서 local을 적어도 된다

결론

사실 위와 같이 application.properties로 파일이름을 변경하면 기본 프로필인 ‘default’ 환경에서도 제대로 매퍼를 인식하지만, 그렇게 대충 넘어가기에는 생각보다 많은 것을 놓칠 수가 있다.
첫째, Spring의 프로필이 뭔지 알게 되었다. 둘째, 운영환경과 로컬환경 및 개발환경을 분리할 때 각자 다른 properties 파일을 쓰기 위해 application-local.properties 와 같이 파일 이름을 명명한다는 것을 알게 되었다. 셋째, 스프링부트 콘솔창에 나오는 각종 정보들을 대충 넘기지 말아야 한다는 것을 배웠다.
분명 Mybatis 동적 쿼리를 연습하려고 했는데 뭔가 샛길로 빠진 것 같지만 그래도 새로운 것을 배웠음에 만족한다.

참고