[최적화]
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) 사용 |
'정보처리기사 > 프로그래밍 언어 응용' 카테고리의 다른 글
프로그래밍 언어 응용(2) (0) | 2022.02.23 |
---|---|
프로그래밍 언어 응용(1) (정처기 공부용) (0) | 2022.02.22 |