오랜만에 글을 쓰는 것 같다. 최근 회사에서는 유지보수 하던 업무가 인수인계중에 있어 업무를 넘겨주다 보니 기존의 단순한 유지보수 시스템에 문제가 생긴다 생각하여 유지보수 시스템에 대해 생각하고, 이에 대하여 시스템을 구축하고 있다.

나는 회사에서 JSP로 만들어진 사이트를 유지보수 한다. 프레임 워크는 오래 전 회사에서 만든 것인데, 나름대로 폴더 구조만 잘 맞춰주면 로그도 잘 남고, DB 풀이나 객체 재사용에 대한 대비, 기본적인 JSP 내에서 사용해야 할 예를들어 자동 문자열 콤마라던가 기타 편리한 기능들은 잘 만들어져 있다.

내가 속한 회사는 사실 웹보다는 Active X 와 TR-transaction을 통한 금융 거래를 주로 하던 업체라 웹에 대해서는 단순히 viewer의 기능만 할 뿐이라 크게 신경쓰지 않았다. 허나, 최근들어 웹을 통한 거래가 많아지자 웹, 특히 WAS단과 DB에 대한 관심도가 높아져서 올 초 웹 전담 유지운영팀이 생기게 되었다.

기존에 웹 개발자들은 소수에 불과하였고, 서로 다른 팀에 있던 사람들이 모이다 보니 사실 유지보수 하는 사이트들도 준구난방, 하지만 사실 원천은 위에서 언급한 프레임워크를 사용한 파생 상품이고, 구조 또한 동일하다. 하지만 사람들이 자기 일을 관리하기에도 벅차기 때문에 아무도 이 프레임워크에 대해 신경쓰지 않았다.

그래서 처음 내가 한 일은 원천 소스를 찾는 일이었다. 다행히도 jdk 1.5로 컴파일된 버전을 찾긴 하였는데, 알고 보니 또 우리가 유지보수 하는 소스는 jdk 1.4로 컴파일 되어 있다. 내참.. 당장 원천 클래스 파일을 수정할 일은 없으므로 원천 소스를 가지고 있는 자체로 만족하고, jdk 1.4버전으로 향후 downgrade하기로 생각하고 일단 패스.

그리고 초창기부터 형상관리가 전혀 되지 않아 백업도 제각기이고 그나마 테스트 서버가 있어 그곳에서 마구잡이로 우선 에디트로 소스 수정을 하고 리얼 서버에 반영한다. 하지만 혼자 작업할 때에는 이게 참 좋겠지만, 문제는 얼마 전 내가 받은 신입 두명이 차례로 받아 작업한 사이트에서 발생한 것이다. 거래량으로 따지면 일순위인데 이 사이트를 신입급 둘이 유지보수 하고 했으니, 다른건 몰라도 소스가 2천줄 이상 되는 것, 자바스크립트 내에 보안도 되지 않은 상황에서 중요한 정보가 노출되는 것, 소스 상에 DB화 되지 않은 데이터가 배열로 박혀 있는 것(-_-;;) 등 아주 심각한 상황이 크게 발생해 있었다.

물론 지금이야 내가 수정해 놓아서 다행이긴 하지만, 또 다시 나는 이 서비스를 다른 분에게 인수인계 해야 하는 시점이 왔고, 그렇게 바로 인수인계 한다면 또 같은 상황이 발생할 것이라는 판단 하에 형상관리 시스템을 구축하기로 했다. 뭐 단순히 SVN만 생각했었는데, 결론적으로는 온갖 삽질 끝에 SVN+HUDSON+ANT 라는 구조를 잡았다.


SVN을 통한 버전관리, HUDSON을 통한 리얼 서버의 WAS에 통합, 그리고 윈도우 배치와 Ant 스크립트를 통한 배포환경을 만들었다. 개발자는 로컬에 환경을 세팅하고 커밋하면 Hudson에서 변경된 파일을 받고 Ant를 통해 자동으로 WAS의 루트에 Different Task를 통해 변경된 파일만 올리게 된다. 이 과정에서 WAS의 루트 중 바뀌는 파일은 Copy Task 이전에 Ant의 Zip Task를 통해 자동 백업하게 된다.

[개발자 로컬 -> 테스트 서버 배포과정]
1. 개발자 Commit -> SVN 저장
2. SVN을 통해 Hudson에서 최신 소스파일 저장
3. WAS 의 Root 중 변경된 파일만 비교하여 백업(Ant의 Different Task 및 Zip Task 사용)
4. 최신 소스파일 -> WAS의 ROOT로 이동(Ant의 Copy Task 이용)

그럼 일단 테스트에서 정상 작동 여부를 확인할 수 있고,  정상 작동시 리얼에 배포 과정을 거치는데 이 역시 사용자의 윈도우 배치파일을 실행함에 따라 아래 절차를 자동으로 수행한다.

[테스트 서버 -> 리얼서버 배포 과정, 리얼 서버는 L4로 구분되어 2대로 정의.] 
1. 리얼 기존 파일 temp폴더로 내려받기. 만약 기존에 temp폴더에 내려받은 것이 있다면, 변경된(업로드할) 파일만 내려받기
2. temp폴더와 테스트 서버의 WAS Root를 비교하여 변경된(업로드할) 파일 자동 압축백업(Ant Zip Task)
3. 수정된 파일 -> temp 폴더로 이동(향후 1번 과정을 하면서 중복 다운로드를 하지 않기 위해)
4. 수정된 파일만 -> 리얼 업로드 (1,2번 서버)

약 3일간 고심해서 이렇게 세팅을 해 놓았는데 나름대로 만족하고 있다. 다만, 아직 리얼 이관을 실제로 해보지 못해서 좀 걱정이긴 하지만;; 확실히 자동화 작업은 많은 편의성이 있는가 하면 제대로 세팅해 놓지 않는다면 크나큰 문제가 발생할 것 같다. 그리고 그런 문제를 방지하기 위해서 메뉴얼 작업 역시 필수인 것 같다. 메뉴얼이 단순히 글로만 써놓은 그런 글이 아닌, 이미지를 통한 따라하기 방식으로 설명해 놓은 메뉴얼 말이다. 

말이 나온 김에 메뉴얼에 대해 얘기해 보자면, 단순히 유지보수 운영 메뉴얼 같은 것들이 정보성 글들만 쓰인 것이 많은데, 많은 유지보수 업무를 도맡아 하는 사람들은 대부분 신입이다. 그들을 위해 나름 경력이 있는 개발자들은 절대 실수할 염려가 없는 이미지를 통한 따라하기 식의 튜토리얼을 만들면, 그 정도의 상급자들의 배려가 있으면 더 좋지 않을까 하는 아쉬움이 든다.

나야 물론 팀 작업을 위해 이런 자동화를 구축하는 것도 있지만 사실 다 내 개발의 편의를 위해서이다. 솔직히 운영하다 보면 저런 과정에서 쓸때없이 발생하는 문제가 많이 생긴다. "최신 소스 동기화" 작업이 안되있으면 말이다. 급한 오류건에 대해서 보통 일반적으로 리얼에서 작업해서 처리하는 경향이 많은데, 그러다가 자칫 잘모해서 비정상적인 소스가 리얼로 올라가게 된다면? 그야말로 얼마나 큰 문제점이 초래되겠는가? 이는 사용자의 편의가 생명인 웹 서비스에서 사활이 걸린 문제이기도 하다.

여튼 내가 아무리 유지보수만 전담해서 한다 하더라도, 한번의 작업을 참여하더라도 항상 끝 마무리는 제대로 하도록 하는 것이 좋겠다. 뒷사람을 생각하는 배려. 그것이 없다면, 뒷사람들이 얼마나 욕을 할 지는 정말 상상하기도 힘들다. 나 역시도 전에 개발한 사람의 욕을 무지하게 해댔으니 말이다. 배려라는 것이 다른데 있는 것이 아닌, 나의 주위에 나와 함께 하는 사람들에 대한 배려가 진정한 배려라는 사실. 이번 기회에 깊히 깨닫는 것 같다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 메튜장

트랙백 주소 http://izect.kr/trackback/661 관련글 쓰기

댓글을 달아 주세요



오늘 오전에 회사에서 CVS관련 자료를 보면서 기존에 세팅해 두었던 CVS서버를 드디어 처음으로 건드려 보았다.

 

[ 초 스피트 CVSNT 설치 방법 ]
1. Windows 2003 서버에 CVSNT 설치(http://www.march-hare.com/cvspro/#downcvsnt)
2. 제어판 -> CVSNT Server 실행
3. Repository Configuration 선택해서 저장소 추가. Add버튼 누르고 적절한 경로 입력(단, Name은 /cvs 이런 식으로 입력해야 유닉스 호환이 가능)
4. 시작->cmd 에서 set CVSROOT=:pserver:127.0.0.1:/cvs(여기서 cvs는 3번에서 입력한 Name) 로 환경변수 추가
5. cvs login 입력 후 엔터. 비밀번호는 현재 접속한 윈도우의 접속 계정(보통 Administrator계정의 비번)
6. 계정을 추가 : cvs passwd -a -r administrator test 입력->administrator는 계정과 연결할 윈도 계정, test는 cvs로 로그인 할 계정
7. 비번 물어보는데 아무거나 한다.
 
그래서 CVS과 Ants(자동빌드용)에 대해 생각해 보았다.

- CVS에서 Commit를 하면 History관리(헤더)가 있는 각종 소스 파일이 올라간다.(작업PC->CVS서버)
- Ants에서 build.xml을 run as를 통해 실행시키면 빌드된 클래스 파일 등이 올라간다.(작업PC->운영 서버)


그럼 이것들의 차이점은 무엇인가..?

사실 난 CVS서버를 통해 소스를 관리하고 싶지만, CVS서버를 통해 업로드 된 파일들을 실제 운영 서버의 WAS와 매칭된 Root Path와 같게 하고 싶지는 않았다. CVS에서는 소스파일과 심지어 문서들까지도 관리하게 되는데, 그 루트를 WAS의 루트와 같게 한다? 그건 아니라고 생각했다. (보안상의 위험도 있고..)

그래서 프로그램을 다시 유심히 살펴 보니, BASE_SRC(기본 소스코드) 와 WEB(.jsp 및 이미지들, 즉 실제 서비스할 파일들) 이렇게 나뉘어져 있었다.

  • BASE_SRC
    • SRC
      • com.xxx
        • 클래스 하위 구조들(Spring의 controller, view, dao들)
    • sql 맵핑 xml데이터
    • properties 파일
    • library 파일
  • WEB
    • WebContent(웹 파일들)
      • images(이미지)
      • js(자바스크립트)
      • jsp(jsp 소스들)
    • WEB-INF
      • 각종 library 및 web.xml 등
 얼추 이와 비슷한 파일 구조를 가지는데(여기서 BASE_SRC와 WEB은 독립된 프로젝트이다.) 중요한 것은 BASE_SRC에서는 자동 컴파일을 통해 WEB의 WEB-INF안에 class라는 폴더로 빌드된 파일들을 전송해 준다. 결국, 실제 운영 서버에는 CVS루트의 파일 중 WEB폴더 안의 내용들을 집어 넣으면 잡다한 소스 파일들은 프로젝트 딴에서 걸러지고 운영에 필요한 파일들만 집어넣을 수 있다는 것!

결국 CVS를 설정할 때 더 효율적으로 구조를 잡으려면 CVS의 설정을 건드리는 게 아니고 각 프로젝트의 Properties를 보고 Build Path와 이클립스의 CVS설정을 보는 것이 가장 효과적이라는 이야기이다.

아, 중요한 것을 하나 배운 것 같다. 이클립스는 자동화 기능이 너무 좋지만, 제대로 설정을 하지 않으면 반드시 낭패를 경험하게 되므로, 정확한 설정과 무엇보다 어려운 것은 없으니 도전해 보는 것이 중요하지 않을까라고 생각한다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 메튜장

트랙백 주소 http://izect.kr/trackback/468 관련글 쓰기

댓글을 달아 주세요


회사에서 작업하는 자바 웹 프로젝트 기반은 Spring 2.5 + ibatis + velocity + resin3.0.27 + oracle 이다. 뭐 아직 작업에 본격 투입된 지는 얼마 되지 않았지만, 뭐랄까.. 요즘 SI쪽의 대세가 자바라고 했던가? 마찬가지로 웹 쪽도 대부분의 대규모 서비스는 자바를 많이 사용하는 추세인 것 같다. (물론, 닷넷도 무시할 수는 없지만..)


10여 명의 중급 경력자들이 참여한 프로젝트에 잠시나마 파트타임으로 참여했었고, 지금은 그 프로젝트의 프로그래밍 유지보수 부분을 전부 담당하고 있다. 어차피 자바라는 게 객체기반이고, 초기 설정은 기존 개발자들이 추가해 놓아서 크게 내가 건드릴 설정 부분은 없고 벌써 3개월째 작업을 하다 보니 대부분이 익숙하다.

물론, 핵심 부분은 아직 건드리기에는 내가 미숙한 점이 많아서 부담스러운 부분이 많다. 그래서 우선 내가 일전에 파트타임으로 참여했던 부분부터 조금씩 역할을 크게 하는 방향으로 하고 있다. 유지보수이다 보니 우선 완제품이 나온 상태인지라, 초반에는 자잘한 업무가 많았는데, 갈수록 조금씩 기능 추가적인 부분이 많아지면서 이때부터 나의 스킬 향상을 위한 분석에 들어간 것이다. 왜 신입이 유지보수부터 하는 것이 최적인지 알 것만 같다.

지금 유지보수 작업이 들어간 3개월 동안 "내가 이것은 꼭 주의하고 명심해야 겠다" 라고 생각한 부분을 정리해 본다.



1. 백업의 생활화 혹은 앤츠를 통한 자동 빌드/백업 설정
우선, 웹 유지보수의 가장 중요한 것이 바로 백업이 아닌가 싶다. 나같은 경우 작업PC->테스트 서버->실 서버 의 3단계를 걸쳐 최종 작업물을 업로드 한다. 그래서 항상 백업 파일이 2개씩 생기는 편이다. 테스트 서버와 실제 서버에 파일명_날짜.vm 이런 형식으로 파일을 우선 백업하고, 업로드 하는 편이다. .class , .xml , .vm 등.. 그리고, 혹여나 신규 작업으로 말미암아 발생할 수 있는 에러상황이 발생할 때는 우선 바로 백업을 원복하고 다시 검토해 보는 게 최선인 것 같다.
앤츠의 설정 및 빌드 :  http://guni.textcube.com/144

2. 작업 내용에 대한 기록 혹은 혼자 작업하더라도 SVN/CVS의 사용
최종 버전에 대한 기록. 이것 역시 백업과 같이 중요한 작업 중 하나이다. 왜냐면 유지보수를 하면서 변경되는 소스코드와 서비스 뷰, sql문, properties등이 있을 것이다. 그런 것들에 대한 히스토리가 없다면 일단은 추후에 인수인계가 제대로 안된다. 그리고 혼자서 소스파일 관리를 하다 보면 아무리 잘한들 소스코드가 꼬일 수 있다는 것이다.
혼자 작업하는데 SVN,CVS의 사용? 사실 상당히 귀찮은 작업이 될 수 있겠지만, 엑셀에 작업 히스토리를 기록하거나 주석으로 설명하는 것보단 훨씬 나은 듯 하다. 귀찮은 일이 많이 줄 수 있으니깐..
간단한 SVN 사용법 : http://www.hybrid.pe.kr/tt/246
간단한 CVS 사용법 : http://www.javajigi.net/pages/viewpage.action?pageId=174

3. 아무리 자신 있는 수정이라도 정책적인 부분은 상사의 승인을 받고 진행
이건 예전부터 느끼고 있었는데, 아무리 잘한다고 섯불리 나서다 보면 큰 책임을 감수해야 할 수도 있다. 내가 관리하는 사이트는 공공기관의 사이트인데, 최근에 아이핀 관련해서 도입해 달라고 요청이 왔다. 솔직히 주민번호 체크하는 방식이 아주 간단해서 아이핀 또한 그리 어렵지 않을 거다 생각했는데, "책임"이라는 것이 딱 떠오르다 보니 이 작업을 내가 책임지기는 어려울 것 같았다. 그래서 실장에게 작업이 힘들 것 같다고 이야기했다. 위에서는 외주를 준다고 하고는 내 책임을 벗어났다.
이처럼 책임 문제는 개발하면서 항상 염두해 놓아야 할 문제이다. 너무 당연한가? 자신이 기회를 잡았다고 좋아라 작업에 아무런 보고도 없이 들어갔다간 피박을 볼 수 있기 때문에, 업무에는 항상 책임이 따른다는 것을 잊으면 안 되겠다.

4. 9시~6시 중 서버 restart는 NO, 리부팅/리스타트는 7시 이후에.
윈도우 서버이다 보니 업데이트 등으로 리부팅을 할 수도 있고, WAS를 리스타트 해야만 적용되는 것들이 있다. 이런 것들은 빠른 작업반영을 위해서라면 필요한 과정이긴 하지만, 서비스되는 사이트가 5분만 접속이 안돼도 사람들은 서비스 회사에 전화를 하기 마련이다. 특히나, 그 과정에서 어떤 사람이 서비스를 사용하며 글을 작성하고 있을지 모르기 때문에 함부로 업무시간 내에 서버를 리스타트 하는 것은 위험한 행동이다. 고로, 회사에서 관리하는 사이트라면 리부팅은 최소한 저녁 6시 이후에 진행하는 것이 안전할 것이다.


이 정도가 내가 그간 느낀 핵심 포인트라 할 수 있겠다. 무엇보다, 유지보수는 개발과 비슷한 면이 있지만 "관리"에 있어서 이를 기록하고, 보고하고 하는 것이 가장 중요하다. 그리고, 끝없이 사이트를 체킹하면서 에러 사항을 찾아두고 전체 소스코드 및 사이트 구조, 프레임워크 구조, DB구조 등을 시간 날 때마다 분석해 두는 것 또한 다음번 추가작업에 있어서 작업 시간을 줄여주는 중요한 요인 중 하나이다.

이런 것들을 명심하며 나와 같이 초짜 웹사이트 유지보수 개발자 분들이 실수하지 않기를 바란다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 메튜장

트랙백 주소 http://izect.kr/trackback/418 관련글 쓰기

  1.  삭제

    Subject: 자바 애플릿을 이용한 이진 트리 그래픽 구현

    2009/11/06 19:34 | Tracked from 세상속

    자바 애플릿을 이용하여 이진트리를 그래픽으로 구현한 소스파일입니다. 삽입, 삭제, 검색 사용가능하며 전위,후위,중위 순회를 구현하였습니다. 다음은 본문에 사용된 애플릿 초기화 소스입니다. public void init(){ T = new BinarySearchTree(); setLayout(new BorderLayout()); setBackground(Color.lightGray); p1=new Panel(); p1.setBounds(0,0,600,..

  2.  삭제

    Subject: 자바 swing 으로 구현한 윈도우 메모장

    2009/11/06 19:36 | Tracked from 세상속

    자바 swing 으로 구현한 윈도우 메모장입니다. 윈도우 메모장가 거의 흡사하게 제작 했습니다. swing, awt 공부하시는 분들에게 큰 도움이 될거라 생각합니다. 어렵지 않게 짜여있고, 윈도우 메모장 기능을 가지고 있습니다. 자바 swing으로 구현한 윈도우 메모장

  3.  삭제

    Subject: 스프링(SPRING) 2.5 어노테이션을 활용한 iBatis 연동 분석 활용정리 자..

    2009/11/06 19:37 | Tracked from 세상속

    1. 톰캣과 JDK1.5 이상 버전을 설치한다.(테스트 – JDK 1.6 톰캣 5.5) http://tomcat.apache.org http://java.sun.com 2. 이클립스 WTP를 다운 받는다. www.eclipse.org 참조 http://www.eclipse.org/downloads/download.php?file=/webtools/downloads/drops/R2.0/R-2.0.1-20070926042742/wtp-all-in-one..

댓글을 달아 주세요

이전버튼 1 이전버튼



블로그 이미지
html5,모바일웹,웹앱,자기브랜드,시간관리 등을 다룹니다.
메튜장

Yesterday198
Today84
Total478,679

달력

 « |  » 2012.02
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29