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

소프트웨어 아키텍처 설계

by romainefabula 2022. 3. 21.

소프트웨어 아키텍처 관련 요구사항에 대한 조사가 끝났으면 이를 만족하는 아키텍처를 설계해야 한다. 아키텍처는 요구사항에 따라서 매번 바뀌기 때문에 결국은 좋은 아키텍처를 많이 보고 자신이 오랫동안 고민하면서 설계해 봐야 실력이 는다. 그래서, 여기서는 반드시 주의해야 하는 사항만을 얘기할까 한다.

일반적으로 서버 안에서 돌아가는 개발 프레임워크는 구성 방법의 차이가 있어도 문제가 있어서 구현이 불가능한 경우는 없다. 즉, 어떻게든 돌아가게 할 수 있다는 의미다. 하지만, 동일하거나 원격의 서버에서 별도의 프로세스로 돌아가는 프로그램이나 솔루션은 서로 통신하는 프로토콜이 일치하지 않으면 통신을 할 수가 없다. 그러므로, 소프트웨어 아키텍처 설계는 단순히 장표에서 두 프로세스 사이에 화살표를 하나 그린다고 알아서 통신하는 것이 아니고, 두 프로세스가 통신에 사용하는 프로토콜이 일치하는지와 둘 중에 어떤 것이 서버이고 어떤 것이 클라이언트 인지도 미리 파악해 두어야 한다. 여기서 클라이언트는 요청을 생성해서 서버로 보내는 역할이고, 서버는 하나의 네트워크 포트를 bind 하고 listen 하고 있다가 이 포트를 통해 들어오는 요청을 받아서 처리하고 클라이언트 쪽으로 응답을 보내는 역할이다.

이 내용을 가장 익숙한 웹시스템에 적용해서 설명해 보면, 사용자의 웹브라우저는 클라이언트이고 웹서버나 WAS 서버는 서버의 역할을 하게 된다. 사용자가 웹브라우저에서 링크를 클릭하면 웹브라우저는 요청을 생성해서 링크에 있는 서버로 요청을 보낸다. 만약에 링크의 주소가 http://somedomain:1235/index.html 이라면 somedomain이라는 서버의 1235 포트로 연결 요청을 하고 연결이 수락되면 GET 방식으로 /index.html 페이지를 요청한다. 그러면, somedomain 서버에서 1235 포트를 bind 하고 listen 하던 웹이나 WAS 서버는 웹브라우저의 연결 요청을 수락한 후에 /index.html 요청을 받고 이 페이지의 내용을 클라이언트로 보내 준다. 참고로, http://somedomain/index.html과 같이 포트를 명시하지 않으면 프로토콜에 따라 default 포트가 사용된다. 여기는 http니까 80 포트를 서버가 listen 하는 것이고, https라면 443 포트를 listen 하는 것이다.

이렇게 HTTP나 HTTPS, REST, 웹서비스 등 표준 프로토콜을 사용하는 경우는 클라이언트/서버 관계만 정해지면 대부분 별 무리없이 통신에 성공한다. 그 외에 솔루션들 중에는 자신만의 통신 프로토콜을 정의해서 사용하는 경우가 있다. 이럴 때는 서버 역할을 하는 솔루션이나 서버 프로그램이 클라이언트 라이브러리를 제공하고, 클라이언트는 이 라이브러리를 이용해서 호출하기만 하면 내부적으로 구현된 프로토콜을 이용해 서버와 통신이 된다. 이런 경우 주의할 점은 솔루션에서 우리가 사용하는 프로그래밍 언어에 대한 클라이언트 라이브러리를 제공하고, 이 프로그래밍 언어의 버전에서 그 라이브러리를 사용할 수 있는지 확인하는 것이다. 보통의 경우 솔루션에서 라이브러리를 사용하기 위한 전제조건을 표시해 놓으니까 솔루션을 선정하거나 라이브러리를 사용하기 전에 반드시 확인해 두는 것이 좋다. JDBC나 ODBC 라이브러리를 통해 DB에 접속하는 경우가 이 통신방식의 대표적인 예가 될 것이다.

이런 통신이 들어가는 부분에 대해서는 나중에 꼭 PoC(Proof of Concept)를 통해서 문제가 없는지 확인해야 한다. 가능하면 개발 프레임워크 검증 전에 확인하는 것이 좋다. 경험상 HTTPS 등 SSL로 통신하는 경우, 같은 자바 기반의 JVM끼리 통신하더라도 JVM의 자바버전이 서로 다르면 Handshake 구동방식이 달라서 통신에 실패하는 경우가 있었다. 되도록 서버와 클라이언트가 같은 버전의 자바를 사용하는 것이 좋다. JDBC 등의 드라이버도 DB와 자바의 버전에 잘 맞는 것을 골라서 사용해야 한다. DB 드라이버 문제는 대부분 문제 없이 실행되다가 아주 드물게 발생해서 원인 찾기가 어려우니까 처음부터 신중하게 선택하는 것이 중요하다.

시스템에서 사용할 소프트웨어 사이에 통신관계에 따라 선을 잘 그어 놓으면 일단 소프트웨어 아키텍처 설계는 일단 완료되었다. 이제는 WAS서버 안에서 실제로 구동될 개발 프레임워크를 설계하고 구현해서 소프트웨어 아키텍처에서 그렸던 프로세스 간의 통신이 원활하게 이루어지는지 확인을 해야 한다. 

 

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

2. 요구사항 조사

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

4. 개발 프레임워크 설계

5. 로컬 개발환경 구성

6. 개발프레임워크 준비

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

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