본문 바로가기
Software Architect/SI 프로젝트 가이드

개발프레임워크 구현

by romainefabula 2018. 3. 1.

SWA의 코딩 능력

개발환경이 준비되었으니 이제부터는 개발프레임워크를 구현해야 한다. 로컬 개발환경 구성까지는 SWA로서 경험이 많지 않아도 차례만 잘 따라서 어느 정도의 시간만 투자하면 얼추 비슷한 결과물이 나올 수 있지만, 이번 과정은 아주 많은 프로그래밍 언어적인 지식과 경험에 의해 정교하고 수준 높은 코딩 능력이 필요하다. 필자의 경험을 바탕으로 생각해 보면 최소한 4년 정도는 공통모듈이나 프레임워크 프로그램 개발을 해 봐야 어느 정도 수준의 개발프레임워크를 개발할 수 있을 것 같다. 참고로 코딩 능력을 빠르게 향상시키는 첫번째 방법은 잘 만든 코드를 많이 보는 것인데, 그 코드에는 능력 있다고 알려진 선배의 코드를 참조하거나 공개된 오픈소스 라이브러리의 소스코드를 보는 것이다. 이런 면에서 SWA는 오타쿠적인 기질이 있어서 뭔가 기능이 궁금한 코드가 있으면 어떻게 구현했는지 소스코드를 찾아 보거나, 소스코드가 없으면 디컴파일을 해서 비슷하게라도 구현하는 방법을 익히는 과정이 필요하다. 코딩 능력을 향상시키기 위한 두번째 방법은 어려운 코드를 많이 만들어 보는 것이다. 아무래도 라이브러리와 우리가 만들고자 하는 코드는 목적이 다르다 보니 기능적으로도 차이가 나서 똑같이 적용하기는 힘들다. 내가 필요한 기능을 구현하기 위해서 어떤 구조가 좋고 메소드가 받은 파라미터에 대해 어떻게 검증하고 처리결과로 어떤 값을 리턴하는 것이 좋은지, 메소드를 호출한 결과에 대해서는 어떻게 검증하고 어떻게 확인하는지에 대해서 많은 고민이 필요하다. 이 두번째 고민을 하는 시간을 빨리 줄이려면 첫번째 방법처럼 좋은 코드를 많이 보면 된다.

프레임워크 코드의 무게

필수적으로 맨처음 조사한 요구사항을 모두 만족시키도록 기능을 빠짐없이 구현해야 하며, 개발자들이 빠르게 개발할 수 있도록 쉽게 만들어야 하고, 대량처리시에 높은 성능을 발휘해야 하고, 처리 중에 문제가 발생하지 않도록 안전해야 한다. 업무프로그램은 그 기능을 실행할 때만 호출되기 때문에 코드에 문제가 있더라도 그 기능을 호출하는 경우에만 문제가 있다. 하지만, 개발프레임워크는 어떤 기능을 호출하더라도 매번 호출되기 때문에 한번의 코딩실수가 모든 시스템에 영향을 미칠 수 있다. 그래서, 개발프레임워크를 멋모르고 만들 때는 막 개발하지만, 어느 정도 알게 되면 코딩을 하면서 이 코드가 문제가 있진 않은지 성능상 병목구간이 되진 않을지 항상 고민을 하게 된다. 참을 수 없는 코딩의 무거움이라고 할까?
대개 개발이 끝나고 오픈을 준비할 때 성능테스트를 수행하면서 프레임워크의 문제를 발견해서 수정하기도 하지만, 개발프레임워크 구현이 끝나고 나서 프레임워크 코드와 인터페이스에 문제가 없는지 PoC(Proof Of Concept) 개념의 성능테스트를 수행하는 것을 추천하고 싶다. 오픈준비단계에서 프레임워크를 수정하는 것은 시간도 촉박하고 응용개발코드의 대량 수정을 초래할 수도 있으니까, 개발 시작하기 전에 미리 문제를 찾아서 수정하는 것이 훨씬 마음 편하다.

구현시 주의사항

서버단의 개발프레임워크를 개발할 때 조심해야 할 것이 몇 가지 있는데,
첫번째는 Singleton 클래스를 사용한다면 synchronized를 아주 조심해서 사용해야 한다.(Java의 경우 객체 단위 lock을 사용하기 때문에 Singleton 방식 객체가 아니면 synchronized가 전혀 작동하지 않는다) synchronized가 걸린 부분에서 오류가 생기거나 시간이 오래 걸리면 그 뒤에 이 코드를 호출하는 프로그램들이 모두 대기상태에 빠져 서버가 hang이 걸릴 수 있다.
두번째는 서버가 Thread 방식으로 동작한다면 반드시 코드가 thread-safe하도록 만들어야 한다. Thread 사이에 공유하는 변수가 있을 때 그것을 잘못 다루면 한 건씩 요청을 처리할 때는 문제가 없지만, 동시에 이 부분을 호출했을 때 각자 다른 요청 사이에서 변수값이 엉키면서 예상치 못한 결과가 나올 수도 있고 참조값이 꼬여서 오류가 발생할 수도 있다.
세번째는 자체적으로 cache 클래스를 만들어서 사용할 때 반드시 사용하지 않는 값을 그때그때 삭제해 줘야 하고, 전체 cache를 refresh할 때도 꼭 이전 값들을 clear한 후 새로운 값을 읽어 들어야 한다. Cache가 처음 시작할 때는 데이터가 많지 않지만 자꾸 여기에 올리는 값들이 늘어나기만 하고 삭제를 하지 않으면 모든 heap을 사용해서 결국에는 OutOfMemory가 발생하게 된다.
네번째는 병목구간이 생기지 않도록 하는 것이다. 한건씩 호출할 때는 이상이 없지만, 한꺼번에 대량의 요청이 들어올 경우 구현이 잘못 되었거나 풀의 크기를 너무 작게 설정하면 이 구간에서 걸려서 처리량이 증가하지 않는 문제가 발생한다. 이런 문제가 생기지 않도록 구현이나 풀의 크기에 주의를 기울여야 한다.

코드 복사/붙여넣기 시 주의사항

개발프레임워크를 만들 때는 보통 이전에 잘 만들어진 예제를 가져다가 필요한 부분만 고쳐서 사용하는 것이 보통인데 앞서 설명한대로 개발프레임워크의 모든 부분 하나하나가 전체 시스템의 성능과 안전성에 영향을 미칠 수 있기 때문에, 가져다 사용하는 코드라도 기능을 모두 확인하면서 어떻게 동작하는지 모두 확인하고 주석을 달아 두는 것이 좋다. 그래야 문제가 생겼을 때 원인을 찾아서 빠르게 수정할 수 있다. 그리고, 가져 온 예제에서 필요없는 기능은 지워 놓는 것이 좋다. 프레임워크는 꼭 필요한 기능만으로 구성되어야 하는데 어떤 기능인지도 모르는 코드가 들어가 있으면 그로 인해 문제가 생겼을 때 원인을 찾기도 어렵고 해결하기는 더 어려워진다. SWA는 자신이 만든 개발프레임워크에 포함된 모든 기능을 완전하게 파악하고 있어야 한다.

자체 성능테스트

사용자 인증, 권한, 요청/응답 데이터처리, 메시지, DB연결 등을 구현하면, 이런 기능들과 개발프레임워크를 테스트하기 위해 기본적인 CRUD를 수행하는 프로그램을 개발하면서 스스로 개발편의성을 검증한다. 여기서 부족한 부분이 있으면 보완하고, 로컬에서 이 샘플프로그램을 이용해 간단한 성능테스트를 수행한다. LoadRunner가 있으면 좋겠지만 없으면 JMeter나 간단한 클라이언트 프로그램을 이용해서 부하를 주고, 서버 프로그램에 대해선 JConsole이나 Java VisualVM 등으로 간단하게 모니터링을 할 수도 있다. 문제가 없으면 좋겠지만 부하를 주다가 Heap이 꽉 차 OutOfMemory가 발생하면 jmap으로 Heap Dump를 생성해서 Eclipse Memory Analyzer 등으로 분석해서 해결한다.

개발환경 배포 전 검증

이렇게 준비가 끝나면 개발자들에게 개발환경을 배포해야 한다. 앞서 설명한 대로 C:\DEV 폴더를 통째로 압축해서 전달하기만 하면 되는데, 이 개발환경도 미리 테스트가 필요하다. C:\DEV 외의 디렉토리는 참조하지 않도록 만들긴 했는데 실수로 빠지는 경우가 있을 수 있기 때문에, 새로운 PC에 이 압축파일을 풀어서 개발을 해 보면서 문제가 없는지 마지막으로 확인하는 것이다.
여기서 노하우를 하나 전수하자면, 이렇게 준비된 개발환경을 테스트해 줄 사람이 필요한데 다른 SWA가 있으면 좋지만 그렇지 않은 경우가 있다. 프로젝트를 진행하다 보면 개발환경 뿐만 아니라 공통모듈 등을 수시로 배포해야 한다. 그래서, 프로젝트에 한두명 정도의 개발자와 친하게 지내는 게 좋다. 이런 사람들에게 이런 것을 배포하기 전에 테스트를 요청해서 미리 확인하고, 대신 이 개발자들에게 도움이 필요할 때 열심히 도와 주면서 서로 공생하는 관계로 지내는 것이다.
또 하나 조언을 하자면, 개발환경을 만들어서 압축까지 했는데 나중에 보니까 조금 수정할 것이 생겼다면 바로 새로운 압축파일을 만드는 것이 좋다. 사실 압축파일이 거의 2GB 이상 크기라서 시간도 오래 걸리지만, SWA가 한 번 움직이면 개발자 수명에서 수십명이 움직일 일이 최소 한번씩 줄어든다. 반대로. SWA가 한번 실수하면 많은 개발자가 최소 한번 이상씩 할 일이 늘어난다. 그러니까, SWA는 자신이 할 수 있는 최대한의 최적화와 테스트를 하는 습관을 들여야 한다.

형상관리 준비

다음으론 개발한 소스를 관리하는 형상관리 시스템을 설치하고 여기에 소스를 올리고 내려 받는 과정을 확인한다. 형상관리에 있는 소스를 자동으로 내려받아 빌드하고 개발서버에 배포하는 시스템(CI)도 구성한다.

 

 

1. 소프트웨어 아키텍트란?

2. 요구사항 조사

3. 소프트웨어 아키텍처 설계

4. 개발 프레임워크 설계

5. 로컬 개발환경 구성

6. 개발프레임워크 준비

7. 개발가이드 작성 및 개발자 교육

8. 개발단계에서의 개발자 지원