본문 바로가기

Blog/일상

레거시 JSP 프로젝트 심폐소생술 고군분투 후기

반응형

[서론]

대학교 후배와 같이 Java 스터디를 하다가,

후배의 중학교 동창이 개발 회사 대표님인데, JSP 개발 세팅을 급하게 도와달라는 연락을 받게 되었다.

 

처음에 듣기로는 Next.js 개발만 하는 회사임에도 아는 지인의 부탁으로 Java 프로젝트 유지보수를 맡게 되었는데, 하필 Java 개발자가 없어서 난감해 하던 상황이라고 했다.

 

어쨌든, 연락을 받은 다음 날 회사에 찾아가보니 Java JSP 개발 환경 구축을 위한 데스크탑 한 대가 마련되어 있었고, 기본적인 환경 구축 후 넘겨받은 파일을 열어봤다.

 

근데 내가 생각하던 것 이상으로 상태가 심각했다.

 

- 프로젝트 최상위 폴더 바로 아래에 JSP 파일이 수십 개가 있다

(보통 WEB-INF 폴더 안에 하위 폴더로 구분된 jsp 파일들이 있고, src/main/java 안에 패키지와 java 파일이 있어야 한다. 하지만 이 프로젝트는 그런 체계적인 구조를 기대하기 힘들다.)

- Java 파일따위는 없다. 이미 컴파일된 .class 파일만 있다. 중구난방으로.

- 심지어 누락된 파일들도 있다.

- 문서따위는 없다. 실제 서비스를 배포해야 할 접속정보만 담긴 간략한 텍스트 파일만 전달받았을 뿐.

 

어쨌든, 실제 운영 중인 서비스를 함부로 건드렸다간 문제가 발생할 수 있기에

- 받은 프로젝트를 로컬에서 실행할 수 있게 하고

- 개발서버 구축을 하는 것

 

이 두 가지가 급선무였다.

그래서 어쩌다 보니, 하루 동안 이클립스 세팅정도로 끝날 줄 알았던 업무가

2~3주 동안의 프리랜서 계약으로 전환이 되어버렸다.

 

후... 자 시작해볼까?

 

 

[본론]

[1일차]

 

아무것도 설치되어 있지 않은, Pure한 윈도우 포맷 상태의 데스크탑 한 대를 받았다.

기본적인 유틸리티(Chrome, 사내 메신저, 리브레 오피스, Everything, 7-zip)

그리고 개발 도구(JDK, JRE, Git, SourceTree, MobaXterm, DBeaver, Eclipse, IntelliJ IDEA, FileZilla, Docker)

마지막으로 이 프로젝트를 위해 필요한 프로그램들 (MSSQL, SSMS, Tomcat)을 하나씩 설치해갔다.

 

 

일단, Eclipse 설치하고, JDK 환경변수 세팅 후 프로젝트를 열어봤다.

분명 JDK 환경변수는 제대로 설정했음에도 불구하고 코드 내에 빨간 줄이 엄청나게 많이 있었다.

 

혹시라도 내가 이클립스 환경설정을 놓친 부분이 있을까 싶어서 검색도 하고 ChatGPT에게도 물어봤다.

아무리 방법을 찾아봐도 답이 안나온다.

 

 

[2일차]

도대체가, 이 서비스는 어떻게 돌아가는지 이해가 안가서 서비스 구성을 계속 탐구해보았다.

구성은 대략 이랬다.

 

 

일단 jar니 war니 그런게 아니다.

Tomcat의 reloadableunpackWARs 옵션을 통해 jsp 파일들을 서버의 특정 디렉토리에 올리면 바로 핫리로드 되어 실시간으로 반영된다.

 

후.. 일단 웹 서비스는 Tomcat이 설치되어 있는 윈도우 서버 두 대를 기반으로 로드밸런싱 처리가 되어 있었고, FileZilla Server 프로그램을 통해 두 서버 상호간 동기화가 되고 있는 것을 확인했다.

 

A 서버에서 파일을 만들었더니 5초 뒤에 B 서버에서 같은 파일이 생겼고,

파일을 지우면 양 쪽에서 똑같이 사라지는 것을 확인했다.

 

 

Tomcat도 대체 얘를 어떻게 돌리고 있나 연구했었는데,

일단 ROOT 디렉토리는 Tomcat의 설정파일인 conf/server.xml을 뒤져서 찾아내었고,

테스트 파일인 test.jsp를 만들어서 Hello, World! 문구를 띄웠더니 잘 나오더라.

 

 

[3일차]

개발 서버에 데이터베이스를 구축하는 것을 목표로 했다.

MySQL과 MariaDB만 써봤던 나는 MS-SQL이라는 물건이 생소했지만, 아주 이해를 못하는 건 아니었다.

 

일단 첫 번째로, MS-SQL을 설치함에 있어 라이센스를 확인했다.

보통 기업용으로 프로그램을 설치하면 유료로 값을 지불해야 하기 때문이다.

 

다행히, Express 버전을 설치함에 있어서 큰 문제가 되지 않음을 확인했다.

무료로 사용할 수 있는 것을 확인하고 나서, MS-SQL 환경을 구축했다.

 

설치하던 도중 msvcp140.dllVC_redist.x64.exe 에 대한 오류가 발생했는데, 이 정도는 Google 검색을 통해 해결했다.

 

 

MS-SQL 설치함에 있어 한동안 정보를 찾아보고 설치완료를 했는데,

실제 운영 중인 서버에서 스키마를 어떻게 빼와야 할지 한참 고민했었다.

 

이건 의외로 ChatGPT가 깔끔하게 해결해줬다.

스키마 정보를 내보내고자 하는 데이터베이스 오른쪽 마우스 클릭 - 태스크 - 스크립트 생성 클릭

 

 

그럼 이렇게 스크립트를 생성하기 위한 팝업이 하나 뜬다.

 

 

다음을 누르고, 스크립트를 저장하기 전 고급 버튼을 눌러서

스크립팅할 데이터 형식에 대한 값을 스키마만에 체크한 후 확인을 눌러준다.

 

확인 버튼을 누르고 스크립트 파일로 저장에 체크, 스크립트 파일 저장할 경로 지정하고 다음 버튼 누르면 끝!

 

 

이렇게 하면 실제 데이터는 제외하고, DB 스키마에 대한 정보만 .sql 파일로 저장이 된다.

이 파일을 개발 서버 DB를 바라보는 SSMS 프로그램에서 해당 스크립트를 실행하게 되면 개발용 DB 구축은 완료!

 

 

아, 물론 해당 데이터베이스를 사전에 만들어 두고, 그 DB를 사용할 사용자 계정을 미리 만들어 두었다.

반드시 멤버 자격에서 db_owner 권한을 부여해야 한다.

 

 

[4일차]

잘 알려져있다시피, JSP 파일은 HTML 코드 안에 Java 파일이 혼재되어 있다.

 

장점은 Java를 통해 동적인 웹 페이지를 생성할 수 있다는 것인데, 

단점으로는 Java의 코드와 HTML 코드가 분리되어 있지 않아 전체적인 구성이 한 눈에 들어오지 않는다.

 

그래서 코드 분석을 해서 전반적으로 어떻게 돌아가고 있는지 파악을 해야 하는데,

아까도 말했지만 컴파일된 .class 파일과 누락된 .java 파일들 덕분에 JSP 파일에서 빨간 줄이 엄청나게 많이 떴다.

 

 

그래서, 프로젝트 폴더 안에 있던 모든 .class 파일들을 IntelliJ IDEA를 통해 .java 파일로 디컴파일하였다.

하지만, 그럼에도 불구하고 어느 정도의 한계는 있는데

 

 

바로 변수 명이 var1, var2, var3... 이런 식으로 매겨진다는 것이다.

 

컴파일러 입장에서는 사람이 읽기 쉬운 방식의 이름을 굳이 고집하지 않고, 변수에 대한 최소한의 정보(메모리 주소)만 일치하면 되기 때문에 이미 Java 코드를 컴파일 한 .class 파일에는 기계가 필요한 정보 외에는 필요 없기 때문에 Java 코드에 있던 변수 이름과 같은 정보는 버려져 임의로 IntelliJ IDEA에서 변수 이름을 지정한 것. (주석과 같은 정보도 .class 파일 내에서는 포함되지 않는다)

 

때문에, 해당 파일은 어느 정도의 코드 흐름 파악을 위해서만 사용되었다.

 

참고로, VSCode도 .class의 파일을 디컴파일하여 .java 파일로 변환하는 기능이 있기는 하다.

하지만, UTF-8을 제대로 지원하지 않는건지 한글로 입력한 부분에 대해서는 깨져서 나오기 때문에 좀 더 깔끔하게 결과가 나오는 IntelliJ IDEA를 사용했다.

 

 

[5일차]

대표님의 부탁으로, 레거시 JSP 프로젝트를 유지보수할 사람을 선발하고자 Java 면접 문제를 기출하였다.

물론, 나 또한 이 회사에서 더 일할 생각이 있냐고 제안이 왔지만 다음과 같은 사유로 거절하게 되었다.

 

- 이미 다른 회사에 서류합격 하여 한창 준비 중

- 안그래도 전 회사에서 Spring Boot 쓰고 있었음에도 불구하고 더 배우고자 퇴사해서 부트캠프를 갔는데, 이후에 JSP를 유지보수 하며 경력을 쌓고 싶지 않았음

 

어쨌든, 이 프로젝트를 유지보수 할 만한 인재를 대상으로 문제를 기출해야 했었는데 대표님의 요구사항은 다음과 같았다.

- 일단 뽑아두면 바로 프로젝트에 투입할 수 있을만한 인재여야 함

(스타트업 회사인데다, 신입을 가르칠 만한 여유가 없는 상황이라 그렇다)

 

이 요구조건을 맞추기 위해 어떤 문제를 기출해야 할지 고심끝에 총 18문항의 문제지를 완성하게 되었다.

물론, 해당 문제를 이 곳에서 공개하기는 어렵고 어떤 부분을 신경써서 만들었는지 기출의도에 대해 공유하고자 한다.

- 기초적인 역량 확인 (자기가 개발하는 환경 정도는 스스로 구성할 수 있는가)
- Java에 대해 얼마나 깊이 있는 지식을 알고 있는 사람인가 (코드 분석 능력 확인)
- 이 프로젝트에 대한 환경에 얼마나 적응할 수 있는 사람인가 (응용 능력, 시스템 분석 능력)
- B2B 요구사항을 얼마나 이해해서 적용할 수 있는 사람인가 (실제 요구사항 예시를 들어 해결역량 확인)
- 프로젝트를 정말로 잘 다룰 수 있는 사람인가 (실제 발생했던 오류 내용을 토대로 해결역량 확인)

 

특히나, JSP 개발자가 회사에서 단 한 명만 있기 때문에, 다른 사람에게 JSP 개발에 대해 도움을 받기 어려운 상황이다.

또한, 프로젝트에 바로 투입해야 하는 상황이기 때문에, 난이도를 예상보다 좀 더 상향해서 면접 문제를 기출하게 되었다.

 

 

[6일차]

실제 운영 중인 서버와 마찬가지로, Local 개발 환경에서도 Tomcat을 이용해서 서비스를 돌려야 테스트 할 수 있기 때문에 동일한 환경을 어떻게든 만들어내야만 했다.

 

우선, 일반적인 방법으로 Tomcat을 설정하고 ROOT 디렉토리에 프로젝트를 넣어봤다.

안된다. HTTP STATUS 404가 뜬다. (NOT FOUND)

 

당연한 결과이다.

일반적인 JSP 프로젝트는 webapps 폴더 혹은, WEB-INF 폴더 하위에 *.jsp 파일들이 위치하고 있어야 하는데

내가 담당한 JSP 프로젝트는 프로젝트 최상위 경로 바로 아래에 *.jsp 파일들이 위치하고 있어 경로를 찾지 못한다.

 

그래서 실운영서버의 tomcat 설정(conf)은 어떻게 되어있는지 확인해보았다.

 

<Context path="" docBase="(프로젝트 디렉토리 위치)" reloadable="true"/>

 

이 코드가 Host 부분 하위에 지정이 되어있더라.

이걸 응용하면 뭔가 될 것 같았다.

하지만 안됐다.

 

이유가 뭘까?

이유는 다음과 같았다.

 

실 운영서버는 공인인증서나 여러 보안을 고려해야 하기 때문에 HTTPS를 지원하기 위한 SSL 인증서가 지정되어 있다.

이것을 지원하기 위한 설정으로 SSLHostConfigredirectPort가 지정되어 있다.

 

그래서인지 localhost:8080으로 아무리 접속해도 localhost:8443으로 자꾸만 리다이렉트 되더라.

 

저 두 가지 설정을 server.xml에서 제거하고, 또 한 가지 설정을 변경했다.

web.xml에서도 아래 부분을 주석처리 하여 제거했다.

 

<security-constraint>
  	<web-resource-collection>
  	        <web-resource-name>SSL Forward</web-resource-name>
  		<url-pattern>/*</url-pattern>
  	</web-resource-collection>
  	<user-data-constraint>
  		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
  	</user-data-constraint>
</security-constraint>

 

 

이 설정들을 만져주고 다시 Tomcat을 리로드했더니..

아직 프로젝트가 정상적으로 실행되진 않지만, 적어도 redirectPort로 302 Redirect 되는 현상은 없어졌다.

 

여기부터는 눈에 보이는 가시적인 오류가 없기 때문에, 

보이지 않는 문제의 원인을 파악하기 위해 Tomcat 내부의 오류 로그를 확인해보았다.

 

그리고, 원인을 찾아냈다.

JDBC를 이용해 DB 커넥션을 생성해야 하는데, 실제 서버 DB를 바라보고 있어서 오류가 났더라. (권한 부족)

(한글이 깨져서 으로 나오긴 하지만, 영어로 된 부분과 숫자로 된 DB접속 정보를 기반으로 어느 정도 로그를 파악할 수 있었다.)

 

그래서 오류 로그에 적혀있던 데이터베이스 xml 경로를 찾아가 개발용 DB 접속 정보로 수정하고

혹시 몰라서 인터넷을 차단한 뒤에 마지막으로 Tomcat을 껐다가 다시 켜봤다.

(잘못 바꿔서 실제 운영DB에 데이터가 기록되면 안되기 때문)

 

키야.. 기분 최고였다

며칠 간의 고생 끝에 드디어 이 레거시 JSP 프로젝트를 로컬 개발 환경에서 되살리는 데 성공했다.

 

 

[7일차]

요즘 채용 시장이 불황이긴 한가보다.

단 한 명 뽑는 자리인데도 4일 동안 60명이 지원했다.

아직 마감이 안돼서 이 글을 쓰는 중에도 지원자가 계속 늘어나고 있다.

 

하지만 너무 아쉬웠는데, 서류 지원자 중 공고를 읽지 않고 지원하는 경우가 너무 많았다.

허수라고 해야할까?

 

나 또한 또 한명의 취업준비생이지만... 보면서 너무 안타까웠다.

그 이유는 이 글에서 자세히 설명해두었으니 참고.

 

2025.03.04 - [Blog/일상] - 페르세우스그룹 JSP개발자 채용 면접관 후기

 

 

[결론]

간만에 회사에서 개발업무 하니깐 즐거웠습니다.

- 개인 프로젝트를 위해 라즈베리파이에 Tomcat 환경 구성하며 server.xml 설정했던 경험
- 내 컴퓨터를 언제 어디서든 접근하기 위해 RDP 서비스 구축 + 공유기 포트포워딩 한 경험
- 개인 홈페이지 만들기 위해 데이터베이스 구축했던 경험
- 다른 사람의 코드를 많이 읽어보며 분석하고 개선했던 경험
- Java 스터디를 몇 번씩 반복하며 자바의 정석을 정독했던 경험

 

등등

저의 이런 경험들 덕분에 문제를 해결하는 데 도움이 되지 않았나 싶습니다.

 

결과적으로

1. 코드 분석 후 서비스 흐름 분석

2. 개발환경 구축 + 서비스 배포

3. 후임 JSP 개발자 선발

 

이라는 목표를 모두 달성할 수 있었습니다.

 

누군가에게는 제가 거쳐온 과정이 당연하다고 생각할 수도 있지만, 

다른 누군가에게는 이 글을 통해 문제를 해결하는 데에 도움이 되지 않을까 해서 작성해보았습니다.

 

긴 글 읽어주셔서 감사합니다 :)

 

 

 

 

 

반응형