이클립스를 활용해서 구현된 코드를 인텔리제이에서 작업하다가, IDE는 그냥 별 것 아니라고 생각하다간 꾀나 시간을 소비할 수도 있을 것 같아서 글을 남긴다.
먼저 알아야할 것이 두 IDE에서 쓰는 용어가 다르다는 점이다.
같은 것을 지칭하지만 표현하는 말이 달라서 IDE Setting이 필요할 때 은근히 귀찮다.
마침 유명하신 분이 잘 정리해둔 내용이 있어서 아래 링크를 통해 용어 차이를 이해하면 된다.
https://jojoldu.tistory.com/334
이거 때문에 골치아파서 그냥 구조를 바꾸면 되지 않을까 생각했다.
(여기에 별개로 Window or Mac 환경에 따라 또 달라지니까 더 빡친다.)
윈도우를 기준으로, File -> Project Structure 에 들어가보면 아래와 같다.
위처럼 Modules 에 Dependency 탭으로 가서 보면 하단에 format 이 보인다.
여기서 이클립스로 바꿀 수 있는데, 이건 절대 하면 안되는 것 같다.
일단 메이븐이 날라갈 수 있다는 경고를 주기 때문이다.
근데 그걸 해봤다.
보통 클래스에 파란색 C 로 표현되던 인텔리제이가 주황색 J 로 바뀌었다.
즉, 클래스로 인식 못하고 있다는 뜻이다. 그냥 자바파일로 인식하는 정도.
물론 인텔리제이에서는 더이상 실행시킬 수 없게 된다.
이클립스로 넘어갈때 유용할지는 모르겠으나 지금은 이클립스를 인텔리제이로 변환하는거라 다시 롤백했다.
롤백 과정도 오래걸린다. 인텔리제이를 껐다 켰다 하면서 계속 리셋해봐야한다.
나 같은 경우엔 10분정도 지나니까 간신히 롤백이 됐다.
이클립스로 짰던 코드를 인텔리제이에서 실행시켜보면 에러가 난다.
가장 상단에 표기된 오류는 조금씩 차이는 있는 것 같았다.
근데 결론은 servlet filter 문제다.
구글링한 결과, 위처럼 dependency 의 scope 에 주석처리를 주면 에러는 사라지고 실행된다.
이전에 올렸던 사진의 Project Structure 에서도 dependency의 scope를 변경해줄 수 있다.
만약 메이븐이 아닌 gradle을 사용한다면, complie("org.apache....생략") 이렇게 compile로 변경해주면 된다.
근데 여기서 의문이 든다.
디펜덴시를 이렇게 바꿔버려도 되는걸까?
그리고 왜 이걸 바꿔주면 해결이 되는걸까?
의문을 해결하기 위해선 먼저 의존성 범위에 대해 알아야한다.
보통 (메이븐이라면) Pom.xml 에 적혀있는 provided, runtime 등등..
위의 내용을 더 자세히 알려면 빌드, 컴파일 등의 시점을 명확히 알고 있는 것이 좋다.
여기선 그 내용까지 다루진 않는다.
결과만 말하자면, 안된다.
아까 위에서 메이븐에서 scope를 주석처리해버리면 된다고 했는데, 그건 로컬에서 일단 스프링이 실행은 된다 라는 의미일 뿐이다.
실제 배포를 하게되면 에러가 난다.
그렇기 때문에 임의로 로컬에서만 주석처리를 하고 개발을 마친 뒤, 다시 붙여주고 배포하던가 아니면 다른 방향을 찾아야한다.
이걸 위해서 scope를 설명했었다.
스프링부트는 기본적으로 톰캣을 내장하고 있어서 jar 파일로 실행된다.
때문에 provided 로 설정된 몇몇 dependency의 경우엔 이미 스프링부트(컨테이너)가 제공해주고 있는 걸 또 제공하고 있는 셈이다.
바로 이것 때문에 에러가 났던 것.
그리고 실제 배포를 하게되면 에러가 난다는 말은 war 일때 해당된다.
war는 톰캣을 내장하지 않으니까 저 dependency 가 필요한데, 없으니 에러를 발생시키는 것이다.
그냥 한 10분 걸려서 이클립스로 된거 인텔리제이로 시작하다가 생긴 에러 덕분에 갑자기 글 하나를 1시간 정도 걸려서 쓰게 됐다.
당장 해야하는 일이 있어서 배보다 배꼽이 더 커진 것 같지만, 알아두면 필요한 사람들에게도 유용하고 나도 나중에 이런 상황에서 왜 에러가 났는지 파악하기 쉬울 것 같아서.. 암튼 끝!