[최적화]

1. 패턴

(1) 싱글톤(Singleton)

  • 설정 파일의 특정 값과 같이 동일한 인스턴스를 참조할 때 하나의 인스턴스만 생성하여 처리함으로 자원을 효율적으로 사용 가능하다.
  • 소스코드를 참조하여 하나의 인스턴스로 처리가 가능한 경우에 적용한다.

(2) 스트래티지 패턴(Strategy Pattern)

  • 사용자가 자신에게 맞는 전략을 취사선택하여 로직을 수행할 수 있는 방법
  • 향후 확장성에 대한 고려가 필요한 경우 소스코드를 참조하여 적용

(3) 디자인 패턴의 종류와 설명

구분 종류 설명
생성 패턴
Creational
 Patterns

[FPS_BAF]
Factory Method 어떤 클래스의 인스턴스를 만들지 서브클래스에서 결정하도록 책임 위임
Abstract Factory 관련 있는 객체들을 모아 팩토리로 만들고 조건에 따라 선택하게 함
Builder 객체의 생성 단계를 캡슐화하여 구축 공정을 동일하게 이용하도록 함
Prototype 원형이 되는 객체를 복제하여 새로운 객체를 생성
Singleton 인스턴스를 한 번만 생성하여 메모리에 저장하여 사용함으로 하나의 인스턴스를 보장
구조 패턴
Structural
 Patterns

[ABCD'E'FP]
Adapter 서로 다른 인터페이스를 가진 클래스를 함께 사용할 수 있도록 
Bridge 기능과 구현을 분리하여 독립적으로 변형과 확장이 가능하도록 결합도를 낮춤
Composite 여러 개의 객체들로 구성된 복합/단일 객체를 클라이언트에서 동일하게 사용
Decorator 객체에 추가적인 기능을 유연하게 확장
Facade 복잡한 클래스들을 묶어 통합된 인터페이스를 제공
Proxy 실제 객체가 아닌 가상 객체를 통해 기능을 처리
행위 패턴
Behavioral
 Patterns

[나머지]
Interpreter 문법 규칙을 정의하고 해석
Template 공통 메소드를 상위 클래스에서 정의, 세부사항은 하위 클래스에서 구현
Command 요청을 캡슐화하여 여러 기능 실행
Iterator 컬렉션의 구현은 노출시키지 않고 요소들에 접근 가능
Mediator 객체들 간 상호작용 행위를 캡슐화하여 관리
Memento 객체의 상태정보를 저장하고 원하는 시점의 이전 상태로 복원 가능
Observer 객체의 상태가 업데이트되면 객체에 의존하는 다른 객체에 알리고 자동으로 내용 갱신
Strategy 행위를 클래스로 캡슐화하여 필요에 따라 동적으로 대체가 가능
Visitor 데이터와 구조를 분리하여 구조를 수정하지 않고 새로운 기능 추가 가능

 

2. 프로그래밍 언어 특성에 따른 보안 취약점 검토 및 최적화

(1) 입력 데이터 검증 및 표현 측면의 보안 약점 확인 및 최적화

SQL 삽입 공격  - 공격자가 form 및 URL 입력란에 SQL문을 삽입하여 DB 조회 및 조작 할 수 있음
 - preparedStatement를 사용하고 입력값에 대해 SQL 구문 / 특수문자 / 길이 제한 등 필터링 적용
경로 조작 및
자원 삽입 공격
 - 검증되지 않은 입력값 허용하는 경우 악의적 코드 실행 또는 시스템 자원 무단 접근 가능
 - 자원 식별자(IP, Port, Directory)와 같은 중요 정보는 외부에서 입력받지 않고 처리
 - 다른 경로 파일을 접근이 가능할 수 있는 위험한 문자열 (", /, \)을 제거
파일 업로드  - 파일의 확장자와 형식에 댛나 검증 없이 업로드하는 경우 .exe 같은 실행파일은 위협이 될 수 있음.
 - 확장자와 형식을 확인하여 업로드가 가능하도록 개선
정수 오버플로  - 정수형 변수에 저정된 값이 허용된 정수값 범위를 벗어나 프로그램이 예기치 않게 동작 가능
 - data type의 범위에 있는지 사전체크

 

(2) 보안 기능 측면의 보안 약점 확인 및 최적화

  • 중요 정보를 적절한 인증 없이 조회 및 변경 가능한 취약점 존재 여부 확인 후 인증 추가
  • 개인정보 및 비밀번호 등 중요 정보 전송 또는 저장 시 암호화하지 않아 노출되는 취약점 존재 파악 후 암호화처리
  • 소스코드에 중요정보를 직접 코딩한 경우 코드 유출시 정보 노출 및 변경 어려운 취약점 존지 확인 후 관리 및 개선
  • 인증 시도 수를 제한하지 않아 공격자가 반복적으로 임의 값을 입력하여 계정 권한을 획득 가능한지 파악 후 제한

 

(3) 에러 처리 / 코드 오류 에서 발생할 수 있는 보안 약점 확인 및 최적화

  • 오류 메시지나 스택 정보에 시스템 내부구조가 포함되어 민감한 정보
  • 디버깅 정보가 메시지를 통해 노출되는 취약점 존재 확인 후 개선
  • 시스템 오류 상황 처리하지 않아 실행정지 등 의도치 않은 상황이 발생 가능한 취약점 파악 후 개선

 

(4) 언어 특성에 따라 발생할 수 있는 성능과 가용성 문제

  • 데이터 전송 속도 확인 및 최적화
  • 클라이언트 처리속도 확인 및 최적화
  • 데이터베이스로부터 조회되는 속도 확인
  • 가용 자원의 현황과 프로그램 구동 시의 점유율을 확인하여 최적화
CPU 연산 / 조건 / 반복 / 암,복호화 드으이 코드를 검토 후 최적화
메모리 자원 반환 / 연산 / 조건 / 불필요한 객체 제거 등 검토 후 최적화
디스크 용량  불필요한 로그나 파일 생성 등 검토 후 최적화

 

(5) 소스코드 품질 측면에서의 최적화

  • 프로그램 명명 가이드 기준 (패키지명 / 파일명 / 변수명 / 메소드명)
  • 프로그램 코딩 가이드 기준 (주석문 / 들였긔 / 선언문 / 블록_Block Statement)
  • 불필요한 코드가 존재하는지 파악 (필요한가 / 중복됐나 / 복잡한가)
  • 정적 분석 도구 활용하여 최적화 수행 (PMD 수행)

 


[라이브러리]

1. 라이브러리

(1) 개념과 목적

  • Library, 도서관을 의미
  • 코드의 재사용 및 부품화 / 기술 유출 방지를 위해 하나 이상의 Subroutine 혹은 함수들의 집합
  • 일반적으로 컴파일되어 실행이 가능한 Object Code 형태로 제공됨

(2) 구성

  • 도움말: 라이브러리에 대한 설명 및 사용 방법 등에 대한 도움말 문서
  • 설치파일: 라이브러리를 연동하기 위해 제공되는 설치 파일
  • 예시코드: 애플리케이션 구현 시 라이브러리를 쉽게 연동할 수 있도록 제공되는 샘플 코드

 

2. 라이브러리 유형

(1) 별도 설치 여부

표준 라이브러리
(Standard Library)
 - 프로그래밍 언어와 함께 제공되는 라이브러리
 - 표준 라이브러리 사용 시 별도의 파일 설치 없이 다양한 기능 이용 가능
 - 기본 기능 이외에 날짜와 시간 등 다양한 추가 기능 이용할 수 있는 API 제공
외부 라이브러리
(3rd Party Library)
 - 별도의 파일 설치하여 사용할 수 있는 라이브러리
 - 누구나 개발하여 사용, 공유할 수 있고 관련 커뮤니티나 검색 등을 이용해 공유된 라이브러리 사용가능

 

(2) 코드 결합 방식

정적 라이브러리
(Static Library)
 - 프로그램 빌드할 때 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식
 - 컴파일러가 원시 소스를 컴파일할 때 참조되는 모듈
 - 동작 코드가 실행 바이너리에 포함되 별도의 추가 작업 없이 독립적으로 라이브러리 함수 사용 가능
동적 라이브러리
(Dynamic Library)
 - 공통적으로 필요한 기능을 프로그램과 분리하여 필요시에만 호출하여 사용할 수 있도록 만든 라이브러리
 - 필요할 때만 해당 라이브러리를 메모리로 불러들일 수 있으며
 - 실행 파일의 크기를 줄일 수 있고 사용이 끝나면 메모리에서 제거되어 효율적인 메모리 사용이 가능
 - Windows : .dll // Linux : .so

 

3. 라이브러리, 프레임워크, 아키텍처, 플랫폼

항목 설명 예시
Library 코드 재사용 및 부품화를 위해 필요한 기능에서 호출하여
사용할 수 있도록 제공되는 모듈의 집합
jQuery / DLL / Class / Jar
Framework 응용프로그램 표준 구조를 구현하기위한 클래스와 라이브러리의 모임 Spring, Django
Architecture 여러 가지 컴퓨터 구성요소들에 대한 전반적인 기계적 구조와 설계 방법 모노리틱 아키텍처 / MSA
Platform  - 여러 기능을 제공해주는 프로그램 실행이 가능한 공통 실행환경
 - 플랫폼 위에 다른 플랫폼 존재 가능
Window / Linux / JVM

+++

[JAVA 대표 외부 라이브러리 종류 및 역할]

종류 역할
Apache Commons  - 자바로 구현된 라이브러리를 모은 프로젝트
 - Codec / Compress / Collections / CSV / IO / Lang / Logging 
Google Guava  - Apache Commons와 유사한 모듈식
 - Collection, IO, 캐싱, 해싱 등 많은 독립 라이브러리 제공
Jackson  - Java Object를 JSON으로 변환하거나 반대로 변환
 - XML / YAML / CSV 등 다양한 형식의 데이터 지원
Log  - 대표적인 로깅 라이브러리, 비동기 로깅을 통한 성능 향상 및 플러그인 아키텍처, 클라우드 지원
Mockito  - 동작 제어가 가능한 가짜 객체(Mock)를 지원하는 테스트 프레임워크
Hibernate  - JAVA 클래스를 DB 테이블 / 컬렉션과 매핑

+++

 

4. 외부 라이브러리 - 라이선스별 정책 비교

라이선스 무료이용 배포허용 소스코드 수정 2차 저작물 
재공개
독점 SW와 
결합
GPL O O O O X
LGPL O O O O O
MPL O O O O O
BSD License O O O X O
Apache License O O O X O

[주요 라이선스 유형]

라이선스 설명
GNU GPL 2.0
General Public License)
 - 자유 SW 재단에서 만든 라이선스로 GNU 프로젝트에서 배포한 프로그램을 사용하기 위해 작성
 - 가장 많이 알려져 있고 의무사항도 타 라이선스에 비해 엄격한 편
 - 배포 시 저작권 표시 및 보증책임이 없다는 표시, GPL에 의해 배포된다는 사실 명시 필요
GNU Lesser GPL 
(LGPL) 2.1
 - 라이브러리와 모듈로의 링크 허용한 라이선스
 - 배포 시 저작권 표시, 보증책임 없다는 표시 및 LGPL에 의해 배포된다는 사실 명시 필요
BSD Licence
(Berkeley SW Distribution)
 - GPL / LGPL보다 덜 제한적이라 허용 범위가 넓고 소스코드 공개 의무가 없음
 - 수정 프로그램에 댛나 소스코드 공개 요구 하지 않기에 상용 SW에 무제한 사용 가능
Apache License  - 아파치 재단 (ASF)의 모든 SW에 적용되며 BSD 라이선스와 비슷하여 소스코드 공개 의무 없음
 - "Apache"라는 이름에 대한 상표권을 침해하지 않아야 한다는 조항이 명시적으로 포함
MIT License  - 미국 MIT에서 SW공학도들을 돕기 위해 개발한 라이선스
 - SW를 누구라도 무상으로 제한 없이 취급 가능 

 

5. 모듈과 패키지

구분 설명 사용법
모듈  - 한 개의 파일에서 기능을 제공 import (모듈명)
패키지  - 여러 개의 모듈을 한 개의 폴더에 묶어서 기능을 제공.
 - 패키지명과 모듈명을 import하여 불러올 수 있음
import (패키지명).(모듈명)

 

6. 빌드 도구

(1) 빌드 도구

  • 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 SW 가공물로 변환하는 과정
  • 이런 프로젝트의 생성과 빌드, 배포 등의 작업을 위한 도구를 의미

(2) 빌드 도구 비교

구분 특징
Ant  - XML 기반의 빌드 스크립트 작성, 자유롭게 빌드 단위 지정
 - 간단하고 사용하기 쉬움
 - 큰 프로젝트의 경우 스크립트 관리나 빌드 과정이 복잡
 - 생명주기를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의
Maven  - XML 기반으로 작성되며 생명주기와 POM(Project Object Model) 개념 도입
 - pom.xml 파일을 이용해 dependency를 추가하고 삭제하여 라이브러리 관리
Gradel  - Ant와 Maven의 장점을 모아 작성되었으며 의존성 관리를 위한 다양한 방법 제공
 - 빌드 스크립트를 XML이 아닌 JVM에서 실행되는 스크립트 언어인 그루비(Groovy) 사용

 

+ Recent posts