개발 환경 구축
- 하드웨어 환경
- 서버 종류
- 웹 서버(Web Server) : 저용량 정적 파일 제공
- 웹 애플리케이션 서버(WAS, Web Application Server) : 동적 서비스, 서버 간 인터페이스 역할
- 데이터베이스 서버(Database Server) : 데이터베이스와 DBMS
- 파일 서버(File Server) : 서비스 제공 목적 등의 파일 저장
- 웹 서버의 기능
- HTTP/HTTPS 지원 : 브라우저 요청/응답 프로토콜
- 통신 기록
- 정적 파일 관리
- 대역폭 제한: 트래픽 포화 방지
- 가상 호스팅
- 인증(Authentication)
소프트웨어 아키텍처
- 소프트웨어를 구성하는 구성 요소 간의 관계, 특성 등을 표현하는 시스템 구조
- 소프트웨어 아키텍쳐 4+1뷰
- 유스케이스: 아키텍처를 도출하고 설계, 다른 뷰 검증, 사용자/설계자/개발자/테스트 관점
- 논리: 기능적 요구사항, 설계자/개발자 관점
- 프로세스: 비기능적 요구사항, 효율적인 사용/비동기 처리 등, 개발자 관점
- 구현: 소프트웨어 모듈 구성, 컴포넌트 구조와 의존성
- 배포: 컴포넌트가 어떻게 배치되는지
- 모듈화(Modularity)
- 시스템 기능을 모듈 단위로 분리하여 관리함
- 모듈 크기가 작으면 관리 비용이 증가, 크면 개발 비용이 증가
- 추상화(Abstraction)
- 전체적이고 포괄적인 개념을 먼저 설계 후 구체화함
- 단계적 분해(Stepwise Refinement)
- 상위 개념으로부터 하위 개념으로 구체화시키는 분할 기법(포괄 -> 구체화)
- 정보 은닉(Information Hiding)
- 모듈 내부에 포함된 정보를 감추어 다른 모듈이 접근하거나 변경하지 못하도록 함
- 상위 설계(아키텍처 설계)
- 시스템의 전체적인 구조 (ex. 구조, 데이터베이스, 인터페이스 등)
- 하위 설계(모듈 설계)
- 시스템 내부 구조 및 행위 (ex. 컴포넌트, 자료구조, 알고리즘 등)
소프트웨어 아키텍처 패턴
- 아키텍처를 설계할 때 참조할 수 있는 표준 모델 또는 샘플
- 주요 아키텍처 패턴: 레이어, 클라이언트-서버, 파이프-필터, 모델-뷰-컨트롤러 패턴
- 레이어 패턴(Layers Pattern)
- 시스템을 계층으로 구분하여 구성하는 패턴
- 상위 계층은 서비스 제공자, 하위 계층은 클라이언트
- 클라이언트-서버 패턴(Client-Server Pattern)
- 하나의 서버 컴포넌트와 다수의 클라이언트 컴포넌트로 구성되는 패턴
- 서버에 요청하면 클라이언트가 응답을 받아 제공하는 방식
- 파이프-필터 패턴(Pipe-Filter Pattern)
- 데이터 전송 절차를 각 필터로 캡슐화하고 파이프를 통해 전송하는 패턴
- 데이터 변환, 버퍼링, 동기화 등, 대표적으로 UNIX Shell
- MVC 패턴(Model-View-Controller Pattern)
- 사용자의 요청을 받은 컨트롤러가 모델을 통해 핵심 기능과 데이터를 관리하고, 뷰로 출력하는 패턴
객체 지향(Object-Oriented)
- 객체 지향의 구성 요소
- 객체(Object)
- 클래스(Class)
- 메시지(Message)
- 객체 지향의 특징
- 캡슐화(Encapsulation)
- 인터페이스를 제외한 세부 내용을 은닉함, 객체 간 결합도 낮아짐
- 상속(Inheritance)
- 다형성(Polymorphism)
- 연관성(Relationship)
- 연관화(Association), 집단화(Aggregation), 분류화(Classification), 일반화(Generalization), 상세화(Specialization)
- 객체 지향 분석의 방법론
- 럼바우(Rumbaugh) 모델링
- 그래픽 표기법을 이용하여 모델링하는 기법, 객체 모델링 기법(OMT)
- 객체 모델링: 정보 모델링, 객체들 간의 관계, 속성 등을 규정하여 객체 다이어그램으로 표시
- 동적 모델링: 상태 다이어그램을 통해 시간의 흐름에 따른 제어 흐름, 상호 작용 등의 동적 행위 표현
- 기능 모델링: 자료 흐름도(DFD)를 통해 프로세스 간 자료 흐름을 중심으로 처리 과정 표시
- 객체 지향 설계 원칙(SOLID)
- 단일 책임 원칙(SRP)
- 개방 폐쇄 원칙(OCP) : 기존 코드를 변경하지 않고 기능을 추가할 수 있도록 설계해야 함
- 리스코프 치환 원칙(LSP) : 자식 클래스는 부모 클래스의 기능을 수행할 수 있어야 함
- 인터페이스 분리 원칙(ISP) : 사용하지 않는 인터페이스와 의존하거나 영향을 받지 않도록 해야 함
- 의존 역전 원칙(DIP) : 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 추상성이 높은 클래스와 의존 관계를 맺으면서 관계를 느슨하게 만듦
모듈
- 모듈 독립성
- 독립성을 높이기 위해 결합도는 낮게, 응집도는 높게, 모듈 크기는 작게 만들어야 함
- 결합도(Coupling)
- 모듈 간 상호 의존하는 정도, 연관 관계
- 결합도가 낮을수록 품질이 높고, 높을수록 품질이 낮음
- 내용 > 공통 > 외부 > 제어 > 스탬프 > 자료 결합도 순으로 결합도 낮음
- 내용(Content) : 다른 모듈 내부의 변수나 기능을 직접 사용
- 공통(Common) : 모듈 밖에 선언된 전역 변수를 참조하고 공유
- 외부(External): 외부에서 도입된 데이터 포맷, 통신 프로토콜 등을 공유
- 제어(Control): 제어 신호나 제어 요소를 전달하고, 처리 명령을 내리는 권리 전도 현상
- 스탬프(Stamp): 모듈 간의 인터페이스로 배열이나 객체, 구조 등이 전달
- 자료(Data): 모듈 간 인터페이스가 자료 요소로만 구성됨
- 응집도(Cohesion)
- 모듈 내부의 요소들이 서로 연관된 정도
- 응집도가 높을수록 품질이 높고, 낮을수록 품질이 낮다
- 우연 > 논리 > 시간 > 절차 > 통신 > 순차 > 기능 순으로 응집도 높음
- 우연적(Coincidental): 각 구성요소가 연관이 없음
- 논리적(Logical): 유사한 성격을 갖거나 특정 형태로 분류되는 요소들이 한 모듈에서 처리됨
- 시간적(Temporal): 특정 시간에 처리
- 절차적(Procedural): 구성 요소들이 순차적으로 수행
- 통신/교환적(Communication): 동일한 입출력
- 순차적(Sequential): 모듈 내에서 나온 출력값을 다른 활동이 사용할 경우
- 기능적(Functional): 단일한 목적을 위해 수행되는 경우
- 팬인(Fan-In) / 팬아웃(Fan-Out)
- 팬인: 제어하는 모듈의 수
- 팬아웃: 제어되는 모듈의 수
- 팬인이 높을수록 재사용 측면에서 잘 설계됨
- 단일 장애점(SPOF, 구성 요소 중 하나가 고장나면 전체 시스템이 중단됨)이 발생할 수 있음
단위 모듈(Unit Module)
- 한 가지 기능을 수행하는 모듈, 단위 기능
- IPC(Inter-Process Communication)
- 모듈 간 통신 방식을 구현하기 위한 프로그래밍 인터페이스 집합
- 대표 메소드 5가지
- Shared Memory
- Socket
- Semaphores : 공유 자원 접근 제어
- Pipes & Named Pipes
- Message Queueing
- 단위 모듈 테스트(Unit Test)
- 단위 기능으로 구현된 모듈이 정확히 수행하는지 검증
- 테스트 케이스(Test Case)
- 구현된 소프트웨어가 사용자의 요구사항을 준수했는지 확인하기 위한 테스트 항목 명세서
- 구성 요소(ISO/IEC/IEEE 29119-3 표준)
- 식별자(Identifier)
- 테스트 항목(Test Item) : 테스트 대상
- 입력 명세(Input Specification) : 입력 데이터, 테스트 조건
- 출력 명세(Output Specification) : 예상 결과
- 환경 설정(Environment Needs)
- 특수 절차 요구(Special Procedure Requirement)
- 의존성 기술(Inter-case Dependencies)
- 공통 모듈
- 공통으로 여러 사용할 수 있는 모듈
- 공통 모듈 명세 기법의 종류
- 재사용(Reuse)
- 개발된 기능을 새로운 시스템이나 기능 개발에 재사용하도록 최적화함
- 효과적인 모듈 설계 방안
- 결합도는 줄이고, 응집도는 높여서 모듈의 독립성과 재사용 높임
- 복잡도와 중복성을 줄이고, 일관성을 유지시킴
디자인 패턴(Design Pattern)
- 모듈 간 관계 및 인터페이스 설계 시 참조할 수 있는 예제
- GOF의 디자인 패턴
- 생성 패턴(BAFPS)
- Builder
- 복잡한 인스턴스를 조립하여 복합 객체 생성
- 생성 과정과 표현 방법 분리
- Abstract Factory
- 서로 연관되거나 의존적인 객체들을 조합하여 인터페이스를 통해 그룹 및 추상적으로 표현
- Factory Method
- 상위 클래스에서 인터페이스 정의, 하위 클래스에서 인스턴스 생성/오버로딩
- 가상 생성자(Virtual Construtor)
- Prototype
- Singleton
- 하나의 객체를 생성하여 다른 객체에서 참조함, 인스턴스 하나 보장
- 구조 패턴(ABCDFFP)
- Adapter
- 재사용하도록 중간에서 호환성 없는 클래스들의 인터페이스를 변환
- 상속 클래스 패턴과 위임 인스턴스 패턴 두 가지 형태 사용
- Bridge
- 기능 클래스 계층과 구현 클래스 계층을 분리하여 구현
- 구현뿐만 아니라, 추상화된 부분을 변경하여 독립적으로 확장 가능
- Composite
- 트리 구조 구성, 부분-전체 계층 표현
- 복합 객체 안에 복합 객체 포함하는 구조 가능
- Decorator
- 다른 객체들을 덧붙이는 방식으로 객체 간의 결합을 통해 확장 가능
- 상속 대체
- Facade
- 복잡한 시스템에서 서브 클래스들 간 단순 통합 인터페이스 제공하여 결합도 낮춤(wrapper 사용)
- Flyweight
- Proxy
- 여러 객체 사이에서 인터페이스 역할하는 대리 객체 수행
- 대용량 메모리의 객체 접근 등
- 행위 패턴(MOSSTVCMI)
- Mediator
- Observer
- 한 객체의 상태가 변화하면 다른 객체들에게 전달
- 느슨한 결합
- State
- 객체의 상태에 따라 동일한 동작을 다르게 처리할 때, 행위 내용 변경
- 원시코드 수정 최소화
- 유지보수 편의성
- Strategy
- 동일한 알고리즘을 캡슐화하여 상호 교환할 수 있도록 정의
- Template Method
- 상위 구조는 바꾸지 않고 기능의 골격을 제공하고, 하위 클래스에서 세부 처리 구체화
- 코드를 줄이고 유지보수 용이
- Visitor
- 처리 기능을 별도로 분리하고, 각 클래스를 방문하여 수행함
- Command
- 요청을 객체 형태로 캡슐화하여 저장
- 각종 명령어들을 추상 클래스와 구체 클래스로 분리함
- Memento
- 특정 시점에서의 객체 내부 상태를 객체화
- 되돌리기 가능(백업), undo 요청
- Interpreter
- 언어나 문법 표현을 정의, SQL 또는 통신 프로토콜
- Iterator
- 내부 구조를 노출하지 않고, 복합 객체의 원소를 순차적으로 접근 가능
개발 지원 도구
- 통합 개발 환경(IDE)
- 개발에 필요한 편집기(Editor) / 컴파일러 / 디버거 등을 하나의 인터페이스로 제공하는 환경
- 빌드 도구
- 소스 코드 파일들을 컴퓨터에서 실행할 수 있는 소프트웨어로 변환하는 과정
- 빌드 도구
- Ant : 자바 프로젝트의 공식적인 빌드 도구
- Maven : Dependency 설정
- Gradle : Groovy 기반 빌드 스크립트
소프트웨어 개발 보안
- 소프트웨어 개발 과정에서 발생할 수 있는 보안 취약점을 최소화하고 안전한 개발을 위한 활동
- 보안 요소
- 기밀성(Confidentiality) : 접근 및 노출 차단
- 무결성(Integrity) : 고의 훼손/파괴 불가
- 가용성(Availability) : 지속 사용 보장
배치 프로그램(Batch Program)
- 정해진 일련의 순서에 따라 일괄적으로 특정 작업들을 처리하도록 만든 프로그램
- 필수 요소
- 대용량 데이터
- 자동화
- 견고성
- 안정성 / 신뢰성
- 성능
- 배치 스케줄러(Batch Scheduler)
- 설정된 주기에 맞춰 자동으로 수행되도록 지원하는 배치 프로그램, 잡 스케줄러
- 종류: 스프링 배치, Quartz, Cron
- crontab : [분][시] [일][월] [요일][명령어]