2 minute read

현재 은행에서 여신 서브시스템의 개발 및 운영과 서버/WAS/DB 관리를 담당하고 있다. 자체 프레임워크를 통해서 웹을 개발하고 있는데, 큰 규모의 개발은 자주 하지 않고 자잘한 유지보수를 주로 하다보니 자바를 깊게 알지 못해도, 프레임워크의 구조를 알지 못해도, 웹 어플리케이션의 구조를 깊게 알지 못해도, 평소 웹 개발 지식이 많지 않았어도 개발하는데, 업무 하는데 큰 문제를 겪지 못하였다. 그냥 프레임워크가 MVC 아키텍처 기반으로 되어있어서 이를 기반으로 개발 요청에 맞춰 service, business logic, DAO 파일을 수정하거나 화면 조금씩 수정하는 정도의 일이 많았다.

어제 타부서에서 SSO 재구축이 완료되어서 새로운 SSO API 연동 개발을 해달라고 요청을 받았다. jsp를 이용한 개발 가이드를 제공받았다. jsp라니… 가이드를 받긴 했으나 우리 실정에 안 맞을 수도 있고, 잘못 적용했다가 사고가 터질 수 있으니 현황 파악을 해보기로 했다. 기존에도 jsp로 로그인 처리를 하고 있던건지, 어떤 로직을 통해 로그인 처리가 되고 있던건지 확인해보기로 하였다.

제니퍼로 모니터링을 해보면 root url로 브라우저에서 접속 시 로그인 처리를 하는 url로 redirect 된 후, 로그인 처리가 완료되면 main page로 리다이렉트 되었다. 근데 root url을 처음 받아 redirect 하고 있는 곳이 도대체 어디인지 도통 알 수가 없었다. 웹 개발은 이전에 django와 flask를 통해 해봤었는데, 그때는 분명 url을 mapping해서 그에 맞는 html을 던져줬었다. 근데 아무리 뒤져봐도 그런 로직은 존재하지 않았다. 그래서 프로그램 시작부터 차근차근 따라가려고 하였는데 시작 지점을 알 수가 없었다. 보통 내 상식선에서 프로그램은 main 메소드에서 시작하는 것이었는데 프로젝트에서 main 메소드가 보이지 않았다.

프레임워크에 무지하고 웹 어플리케이션 구조를 모르고 있는 것이 문제인가 싶어 프레임워크 소스를 까보기 시작했다(프레임워크 관련 문서가 존재하지 않는다. 여담이지만 프레임워크 뜯어보니 이상한 goto가 난무하고 변수명이 a,b,c,d로 되어있어 이해하기 매우 힘들었다). 자체 프레임워크가 스프링을 기반으로 만들어졌다고 알고 있어 검색을 통해 스프링 프로젝트의 구조를 훑어보고, 이 지식을 기반으로 자체 프레임워크를 까봤는데 스프링 기반이 아니었다.급한 일도 없고 물어볼 사람도 없어서 하루종일 소스를 까고, 구조를 이해하고, 공부하면서 놀았다. 그리고 새롭게 안 것은 프로젝트를 실행하면 main 메소드가 없어도 mapping된 servlet이 호출된다는 것이었다. 따지자면 main 메소드가 아닌 WAS실행이 최초 시작점이다.

브라우저에서 어떤 URL을 서버로 요청하면 어떤 Servlet 파일을 실행시킬지 web.xml에 정의된 servlet mapping에 의하여 ControllerServlet이 호출된다. 그러면 Dispatcher를 거쳐 PageContainer -> ServcieContainer -> DAoFactory를 거쳐 DB에서 데이터를 가져오고 화면에 뿌려주는 구조였다. 근데 web.xml에 root url에 매핑된 servlet은 정의되어있지 않았다. 하지만 서블릿 매핑을 꼭 web.xml로만 할 수 있는 것은 아니어서 스프링처럼 annotation으로 mapping된 것이 있는지 찾아봤지만 그것도 없었다.

공부하다보니 root url로 request를 하면 index.html을 불러오고 이 안의 스크립트가 실행되면서 로그인 처리가 되는 것까지 알게 되었다. 근데 또 아무리 뒤져도 index.html을 불러오는 코드는 존재하지 않았다.

미궁 속으로 빠지다 index.html의 이름을 indes.html로 바꾸고 다시 로컬에서 어플리케이션을 실행해보았다. 그랬더니 콘솔에 welcome-file-list 어쩌고 하면서 에러 비슷한게 뜨는게 아닌가. 프로젝트의 WebContent 디렉토리 아래 web.xml에서는 welcome-file-list 태그가 없었다. 근데 어쨰서 welcome-file-list 태그에서 value를 가져오려 하고 있었을까? 싶었는데 jetty에서 디폴트 설정으로 welcome-file-list에서 index.html이 있었던 것이었다. 그래서 root url로 접속을 하면 index.html이 불러와지고, 그 안에 있는 스크립트가 실행이 되면서 로그인 처리가 되었던 것이다.. 하루종일 찾은 것 치고는 너무 허무하였다. 하지만 덕분에 스프링도 공부하고, 자체 프레임워크도 공부하고, servlet도 공부하고 전체적인 웹 어플리케이션 구조에 대해 공부할 수 있었으니 다행이라고 생각해야겠다. 정작 보려고 했던 로그인 로직은 제대로 살펴보지 못해서 다음 주에 출근해서 살펴봐야겠다.