7장 : 서버 프로그램 구현(4과목)
1. 하드웨어 환경
- 클라이언트와 서버로 구성
- 클라이언트
- PC
- 스마트폰
- 클라이언트 환경 구성
- 서버에서 제공하는 서비스를 활용하기 위해 사용자와의 인터페이스를 제공하는 하드웨어
- PC, 웹 브라우저 화면, 모바일 앱 등
- 서버
- 서버 환경 구성
종류 | 설명 |
웹 서버 | 서비스의 속도 향상을 위해 정적 파일들을 제공하는 웹 서버 애플리케이션이 설치되는 하드웨어 (정적 파일 : HTML, CSS, 이미지 등) |
웹 애플리케이션 서버 | 동적 웹 서비스를 제공하기 위해 WAS와 서비스에 관련된 애플리케이션이 설치되는 하드웨어 |
데이터베이스 서버 | mySQL, Oracle 등 데이터베이스가 설치되는 하드웨어 |
파일 서버 | 파일을 저장하고 공유하기 위한 파일 저장 하드웨어 |
2. 웹 서버 (Web Server)
- 클라이언트로부터 직접 요청을 받아 처리하는 서버
- 저용량의 정적 파일을 제공
- 브라우저로 요청과 응답 을 처리하는 프로토콜인 HTTP/HTTPS를 지원
- HTML, CSS 등 정적 파일을 저장하고 관리
- 사용자가 적합한 권한을 갖고 접속하는지 확인하는 인증 기능을 지원
2-1. 웹 애플리케이션 서버 (Web Application Server)
- 사용자에게 동적 서비스를 제공
- 웹 서버로부터 요청
- 웹 서버와 데이터베이스 서버 사이에서 인터페이스 역할
2-2. 서버의 개발
- 서버의 개발이란, 웹 애플리케이션의 로직을 구현할 서버 프로그램을 제작하여, WAS에 탑재하는 것
- 서버 개발을 위해 다양한 프레임워크들이 존재하고, 프레임워크들은 언어에 종속적
3. 소프트웨어 환경
- 시스템 소프트웨어와 개발 소프트웨어로 구성
- 시스템 소프트웨어
종류 | 특성 | 예시 |
운영체제 | 하드웨어 플랫폼과 공통 시스템 서비스 제공 (상세 소프트웨어 명세는 벤더(Vendor)에서 제공) |
윈도우, 리눅스 등 |
JVM (Java Virtual Machine) |
Java 관련 응용 프로그램을 기동하기 위한 주체 | |
Web Server | 정적 웹 서비스를 수행하는 미들웨어 정적 파일을 제공 |
Apache, Nginx, IIS, GWS 등 |
WAS | 웹 애플리케이션을 수행하는 미들웨어 | Tomcat, Undertow 등 |
DBMS | 데이터베이스 소프트웨어 | Oracle, mySQL 등 |
- 개발 소프트웨어
종류 | 특성 | 예시 |
구현 도구 | 가장 많이 사용하는 도구 코드의 작성, 편집, 디버깅 등 수행 |
이클립스, 비쥬얼 스튜디오, 인텔리제이 등 |
테스트 도구 | 소프트웨어 품질을 높이기 위해 사용 코드 테스트, 테스트 결과 리포팅 및 분석 등 수행 |
xUnit, Spring Test 등 |
형상관리 도구 | 소스 코드, 산출물 등의 버전을 관리하기 위해 사용 | CVS, Subversion, Git 등 |
요구사항 관리도구 | 고객의 요구사항을 수집, 분석, 추적하기 쉽게 지원 | JFeature, OSRMT 등 |
설계/모델링 도구 | 논리적으로 기능을 결합하기 위해 UML 지원, DB 지원 등 설계 및 모델링을 지원하는 도구 |
ArgoUML, DB Desinger 등 |
빌드 자동화 도구 | 소스코드 파일들을 컴파일 후 여러 모듈을 묶어 실행 파일로 만드는 과정 빌드를 포함하여 테스트 및 배포를 자동화하는 도구 |
Ant, Make, Maven, Gradle, Jenkins 등 |
4. 프레임워크(Framework) 재확모역
- 특정 기능을 수행하기 위해 필요한 클래스나 인터페이스 등을 모아둔 집합체
- 재사용이 가능하도록 소프트웨어 구성에 필요한 기본 뼈대 제공
- 원하는 기능 구현에 집중하여 빠르게 개발할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것
- 서버 개발 프레임워크는 대부분 '모델-뷰-컨트롤러 패턴'을 기반
- 예 : Java 개발에서의 Spring, Python 개발에서의 Django 등
- 특성
- 재사용성: 재사용 가능한 모듈들을 제공함으로써 예산 절감, 생산성 향상, 품질 보증이 가능함
- 확장성: 다형성을 통한 인터페이스 확장이 가능하여 다양한 형태와 기능을 가진 애플리케이션 개발이 필요함
- 모듈화: 캡술화를 통해 모듈화를 강화하고 설계 및 구현의 변경에 따른 영향을 최소화함으로써 소프트웨어 품질을 향상시킴
- 제어의 역흐름: 개발자가 관리하고 통제해야 하는 객체들의 제어를 프레임워크에 넘김으로써 생산성을 향상시킴
5. 개발 언어의 선정 기준
- 적정성
- 효율성
- 이식성
- 친밀성
- 범용성
6. 소프트웨어 개발 보안
- 목표
- 기밀성: 인가된 사용자만 데이터에 접근할 수 있도록
- 무결성: 인가된 사용자만 데이터를 수정할 수 있도록
- 가용성: 인가된 사용자가 원할 때에는 언제라도 데이터를 사용할 수 있도록
- 점검 항목
- 세션 통제
- 입력 데이터 검증 및 표현
- 보안 기능
- 시간 및 상태
- 에러 처리
- 코드 오류
- 캡슐화
- API 오용
7. API (Application Programming Interface)
- 라이브러리를 사용할 수 있도록 미리 정의해 놓은 인터페이스
8. 배치 프로그램 (Batch Program, 일괄 처리 프로그램)
- 사용자와의 상호 작용 없이, 여러 작업들을 미리 정해진 순서에 따라 일괄적으로 처리하는 것
- 대용량의 데이터가 주기적으로 교환되는 업무에 주로 사용
- 주로 야간이나 새벽에 수행되도록 설정
- 수행 주기에 따라,
- 정기 배치 : 정해진 기간에 정기적으로 수행
- 이벤트성 배치 : 조건이 충족될 때만 수행
- On-Demand 배치 : 요청 시 수행
- 필수 요소
- 대용량 데이터: 대용량 데이터 처리가 가능해야 함
- 자동화: 심각한 오류를 제외하고 사용자의 개입 없이 동작해야 함
- 견고성: 유효하지 않은 데이터의 경우도 처리해서 비정상적인 동작 중단이 없어야 함
- 안정성, 신뢰성: 문제 발생 시 추적이 가능해야 함
- 성능: 주어진 시간 내에 처리 완료해야 하고 다른 애플리케이션 방해하면 안 됨
9. 배치 스케줄러 (Batch Scheduler)
- 일괄 처리 작업이 설정된 주기에 맞춰, 자동으로 수행되도록 지원해주는 도구
- 종류 : 스프링 배치(Spring Batch), Quartz
10. 형상관리 (SCM, Software Configuration Management)
- 소프트웨어의 개발 과정에서 발생하는 산출물을 관리하는 활동
- 변경사항의 파악, 제어, 담당자에게 통보 등 수행
10-1. 형상관리의 특징
- 프로젝트 생명주기의 전 단계에서 수행하는 활동
- 유지 보수 단계에서도 수행
- 개발 비용을 줄이고, 문제점 요소를 최소화하는 것을 목적으로 함
10-2. 형상관리의 절차
과정 | 설명 |
형상 식별 | 형상관리의 대상 식별, 이름과 관리 번호 부여, 계층 구조로 구분하는 등의 베이스라인을 설정 |
형상 통제 | 변경 요구를 검토, 승인하여 적절히 통제함 |
형상 감사 | 베이스라인의 무결성을 평가하기 위해 확인, 검증 과정을 통해 공식적으로 승인하는 작업 |
형상 기록 | 제대로 잘 반영되고 있는지 보고하는 절차, 보고서를 작성 |
11. 공통 모듈
- 정보 시스템의 구축 시, 자주 사용하는 기능들
- 재사용이 가능하게 패키지로 제공하는 독립된 모듈
12. 재사용 (Reuse)
- 검증된 기능을 파악하고 재구성하여 시스템에 응용하기 위한 최적화 작업
재사용 종류 | 설명 |
함수와 객체 재사용 | 클래스 또는 함수 단위로 구현한 소스코드를 재사용 |
컴포넌트 재사용 | 컴포넌트 단위로 재사용 컴포넌트의 인터페이스를 통해 통신함 |
애플리케이션 재사용 | 공통된 기능을 제공하도록 구현된 애플리케이션의 재사용 |
13. CBD (Component Based Development)
- 재사용 가능한 컴포넌트 개발 또는 상용 컴포넌트를 조합하여, 응용 시스템을 구축하는 방법론
14. 소프트웨어 모듈 응집도 (Cohesion)
- 모듈 내부 처리 요소 간 기능적 연관도를 나타내는 척도
- 응집도가 높을수록 필요한 요소들로 구성되어 있음
- 응집도가 낮을수록 관련이 적은 요소들로 구성되어 있음
유형 | 설명 | 정도 |
기능적 응집도 | 하나의 모듈에서 하나의 기능만 수행 구조도 최하위 모듈에서 많이 발견됨 |
높음 |
순차적 응집도 | 모듈의 결과 값을 다른 모듈의 입력 값으로 사용 예 : 행렬 입력 후, 그 행렬의 역행렬을 구해서 출력 |
|
통신적(교환적) 응집도 | 동일한 입력과 출력을 사용, 다른 기능을 수행 예 : 같은 입력 값을 이용하여 A를 계산한 후, B를 계산 |
|
절차적 응집도 | 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행 예 : Restart 루틴의 경우, 총계를 출력한 후 화면을 지우고 메뉴를 표시함 |
|
시간적 응집도 | 같은 시간대에 처리해야 하는 활동들을 한 모듈에서 수행 예 : 초기지 설정, 종료 처리 등 |
|
논리적 응집도 | 유사한 성격 또는 특정 형태로 분류되는 처리 요소들을 한 모듈에서 수행 예 : 오류 처리 등 |
|
우연적 응집도 | 관련 없는 작업을 한 모듈에 모은 경우 모듈화의 장점이 없고, 유지 보수가 어려움 |
낮음 |
15. 소프트웨어 모듈 결합도 (Coupling)
- 모듈 간 연관도를 나타내는 척도
- 결합도가 낮을수록 관련이 적어지고, 모듈의 독립성이 높아져 모듈 간 영향이 적어짐
유형 | 설명 | 정도 |
내용 결합도 | 모듈 내부의 변수 또는 제어 정보를 다른 모듈에서 사용 | 높음 |
공통 결합도 | 모듈 밖에서 선언되는 전역 변수를 사용 | |
외부 결합도 | 다수의 모듈이 모듈 밖의 데이터, 프로토콜, 인터페이스를 사용 | |
제어 결합도 | 제어되는 값 뿐만 아니라 제어용 신호를 주고받음 | |
스탬프 결합도 | 배열, 오프젝트, 스트럭처 등을 교환함 (변수 말고 다른 거(ex:구조) 교환하는 꼴) | |
자료 결합도 | 모듈들이 변수를 교환하여 상호 작용이 일어남 | 낮음 |
16. 테스트 케이스
- 요구사항을 준수하는지 검증하기 위하여 테스트 조건을 명세한 것
- 종류
- 명세 기반 기법 (BlackBox Test)
- 구조 기반 기법 (WhiteBox Test)
- 경험 기반 기법
17. DAO/DTO/VO
- 영속 계층(Persistence Layer)에서 사용되는 특정 패턴을 통해 구현되는 Java Bean
종류 | 설명 |
DAO (Data Access Object) |
DB를 사용해 데이터를 조회, 조작하는 오브젝트 DB의 세부 내용을 노출하지 않고 특정 데이터 조작 기능을 제공함 |
DTO (Data Transfer Object) |
프로세스 사이에서 데이터를 전송하는 객체 많은 프로세스 간 데이터 전송 시 데이터를 모아 한 번만 호출함 가변 클래스임 (DTO는 데이터의 저장 및 회수만 가능하다는 점에서 DAO와 다르다.) |
VO (Value Object) |
Entity를 의미하는 작은 객체 DTO와 비슷하지만, read only 속성을 가짐 불변 클래스임 |
18. 소프트웨어 테스트
- 구현된 애플리케이션이나 시스템을 사용자의 요구사항이 만족되었는지 확인하기 위하여 기능 및 비기능 요소의 결함을 찾아내는 활동
- 테스트 원칙
- 개발자가 자신이 개발한 프로그램 및 소스코드를 테스팅하지 않음
- 낚시의 법칙, 파레토의 법칙 등의 효율적인 결함 제거 법칙을 사용
- 낚시의 법칙: 낚시를 즐기는 사람들은 경험적으로 어느 자리에서 물고기가 많이 잡히는지 알고 있듯 소프트웨어의 결함도 특정 라이브러리, 모듈 등에서 많이 일어난다는 법칙
- 파레토 법칙: 전체 테스트 중 20%의 부분(코드)에서 80%의 영향력(오류)가 생김
- 완벽한 소프트웨어 테스팅은 불가능
- 테스트는 계획 단계부터
- 살충제 패러독스: 동일한 테스트 케이스로 반복하여 테스트를 진행하다 보면 더 이상 결함을 찾을 수 없으므로 테스트 케이스에도 꾸준히 개선과 점검이이 필요함
- 오류-부재의 궤변: 오류를 발견하고 잘 제거한 코드라 하더라도 사용자의 요구사항을 만족하지 못하면 품질이 좋다고 할 수 없음
19. 디버그(Debug)와 디버거(Debugger)
- 디버그 (Debug) : 컴퓨터 프로그램의 논리적인 오류(Bug)를 찾아내는 과정
- 디버거 (Debugger) : 버그를 찾고 수정하기 위한 필수적인 도구