Maven을 쓰면서 생기는 오류 ① : target 폴더에 대해, class 파일이 이상하다면?
목차
- 시작하며
- 타겟(Target) 폴더란?
- 삭제한 자바파일에 대해 클래스파일이 삭제되지 않는다면?
- 마치며
시작하며
이번에는 내가 이틀동안 골머리를 앓다가 해결했던 문제에 대해 포스팅해보려고 한다. 만약 Java언어를 사용해서 백엔드나 여타 다른 프로젝트를 진행한다면 Maven에 대해 모르는 사람은 거의 없을 거라고 생각한다. 만약 잘 모른다면 여기를 참조하면 좋을 것이다.
타겟(Target) 폴더란?
만약 맨 처음 프로젝트를 생성하고 IDE(이클립스 or 인텔리제이 등)에서 폴더 구조를 확인해봤다면 타겟 폴더를 발견하지 못했을 것이다. 왜냐면 타겟 폴더는 프로젝트를 빌드하면 생성되는 폴더이기 때문이다.
정확히는 메이븐의 라이프사이클에 대해서 알면 좋은데 라이프사이클에 대해서는 여기서 이야기한 적이 있다. 여러 개의 라이프사이클 중 install 단계를 거치면서 타겟 폴더에 컴파일된 파일들이 위치하게 된다.
더 정확히는 메이븐 라이프사이클을 거치면서 단순히 생성기만 하는 의미가 아니라 컴파일된 파일들 + 실제 배포되는 파일인 jar/war 파일이 만들어진다.
그래서 프로젝트를 처음 만들었다면 타겟(Target) 폴더가 없는 것은 당연하다.
간략하게 타겟(Target) 폴더의 특징을 요약하자면,
- 프로젝트 빌드 시 타겟 폴더 내부 내용이 빌드 내용에 맞게 바뀐다. (신규 파일이 생성되거나 삭제된 항목이 삭제된다)
- 추후 배포시에는 프로젝트명.war 혹은 jar가 배포된다.
삭제한 자바파일(.java)에 대해 클래스파일이 삭제되지 않는다면?
나같은 경우는 정말 곤혹이었던게 폴더를 탐색하며 그 안에 존재하는 클래스들에 대해서 리플렉션을 사용해서 메서드를 불러오는 작업을 해야할 때가 있었다.
내 예상이 맞다면 문제없이 진행되어야 하는 부분이지만 어째서인지 try~catch문을 사용해도 Exception이 발생하지 않고 디버깅이 뻑나는 것같은 현상이 발생했었다.
몇 번의 디버깅으로 이전에 삭제했던 .java file에 대한 .class file이 내가 탐색하려는 폴더안에 존재했던 것이다. 내가 탐색하려고 했던 폴더는 톰캣 webapps/ROOT/classes 폴더에 컨트롤러 패키지가 있는 폴더였다.
내가 의아했던 점은 바로 이전에 만들었다가 삭제했던 클래스 파일은 빌드하면 잘 생성/삭제가 되는데 해당 클래스는 왜 계속 남아서 나를 곤혹하게 하는지에 대해서였다.
개인적으론 아마 옛날에 만들었던 클래스파일이 깨지진 않았지만 내부적으로 private 메서드가 있어서 불러와지지 않은 것 같다라는 추측을 하고 있다. 어찌되었든 결론적으론 Maven Clean 라이프사이클을 실행하거나 타겟(Target)폴더를 통째로 지웠다가 다시 빌드하면 된다.
어쨌든 메이븐을 사용하기 위해선 뭔가 안되면 타겟 폴더를 의심해보는것도 합리적인 선택이 될 것이다. 왜냐면 엄청나게 애를 먹었기도 했고, 실제 소스폴더의 내용이 완벽하게 타겟 폴더에 적용되지 않는 경우도 있을 수 있기 때문이다!
마치며
리플렉션도 처음 제대로 사용해보는데 이런 부가적인 문제로 인해 정답을 찾아오는데에 이틀이나 걸렸다.... 그래도 그만큼 많이 알아가는것같아서 다행이긴하다... 아무리 허드렛일이라도 아는가와 모르는가는 작업 시간에 큰 차이를 줄 수 있기 때문이다..ㅎㅎ
추가적으로 나는 인텔리제이 얼티메이트 버젼을 사용하는데 톰캣 로컬 실행환경에서 Edit Configurations... -> deployment를 들어가서 하단에 잘보면 컨텍스트 경로(Context Path)를 설정할 수 있다.
근데 이게 처음에 "/" 로 되어있었다.
알고보니 이 컨텍스트 경로를 기준으로 톰캣 webapps 폴더 (톰캣 어플리케이션(프로젝트)들이 존재하는 폴더)가 생성되는거여서 최상위인 "/"로 해놓으면 자동으로 ROOT폴더로 저장이 되었다. 그렇다고 프로젝트에서 사용하는 모든 링크 경로 앞에 "/프로젝트/"를 붙히는 것도 엄청나게 귀찮은 일이 될 것이라고 생각한다.
그렇다고 모든 프로젝트의 컨텍스트 경로를 "/"로 해두면... 하는 생각을 했는데 해도 되나? 하는 생각이 갑자기 들었다. 왜냐면 이전에 작업하던 내용이 있어서 초기화되고 새로운 프로젝트가 ROOT폴더에 들어가있다가 다시 이전 프로젝트를 실행하려고 한다고 해도 어차피 타겟 폴더에서 불러올거니까!!
근데 역시 이상하다면 우리들은 뭔가 이상하면 webapp/ROOT 폴더를 지워보고 생각하도록 하자^^
추가적으로 컨텍스트 경로를 "/"이 아닌 다른걸로하면 여태까지 만들어뒀던 경로에 모두 컨텍스트 경로를 붙혀야 하니 하지 않도록 했다.
감사합니다!!