반응형

요즘에는 기업과 기관 모두 데이터 관리, 서버 운영, 웹 호스팅, 애플리케이션 개발 및 배포에 클라우드 컴퓨팅을 널리 사용하고 있습니다. 클라우드 컴퓨팅은 IT 기반 인프라를 효율적으로 운영하고 확장할 수 있도록 하는 기술로, 비즈니스에 많은 이점을 제공합니다. 그 중에서도 AWS (Amazon Web Services)는 전 세계적으로 가장 크고 널리 사용되는 클라우드 플랫폼 중 하나로, 현대 비즈니스의 혁신을 지원합니다.

AWS란 무엇인가요?

AWS는 Amazon.com의 하위 기업으로, 클라우드 컴퓨팅 서비스를 제공합니다. 이 서비스는 데이터 센터를 보유하고 있는 대규모 클라우드 인프라를 기반으로 합니다. AWS는 IaaS(Infrastructure as a Service), PaaS(Platform as a Service), SaaS(Software as a Service) 및 FaaS(Function as a Service)와 같은 클라우드 컴퓨팅 서비스 모델을 제공하여 다양한 비즈니스 요구 사항을 충족시킵니다.

AWS의 주요 이점

확장성: AWS는 필요에 따라 컴퓨팅 리소스를 쉽게 확장할 수 있어, 트래픽 증가나 업무 확장 시 더 많은 리소스를 사용할 수 있습니다.

비용 효율성: AWS는 비즈니스에 필요한 정확한 리소스만 사용하게 하므로 비용을 절감하고 예산을 효율적으로 관리할 수 있습니다.

보안: AWS는 고급 보안 및 규정 준수를 위한 다양한 도구와 서비스를 제공하여 데이터 보안에 중점을 두고 있습니다.

다양한 서비스: AWS는 컴퓨팅, 스토리지, 데이터베이스, 인공 지능, 머신 러닝, 인터넷 of Things(IoT) 및 기타 다양한 서비스를 제공하여 다양한 비즈니스 요구 사항을 지원합니다.

글로벌 네트워크: AWS는 전 세계적으로 데이터 센터 및 엣지 로케이션을 보유하고 있으며, 고객이 글로벌로 서비스를 제공하고 확장할 수 있도록 지원합니다.

AWS를 활용한 성공 사례

AWS는 다양한 기업 및 기관에 의해 성공적으로 활용되고 있습니다. 예를 들어, Netflix는 AWS를 기반으로 스트리밍 서비스를 제공하며 글로벌 시장에서 성장하고 있으며, Airbnb는 AWS를 사용하여 수백만 명의 사용자에게 호스팅 서비스를 제공합니다.

마무리

AWS는 클라우드 컴퓨팅 분야에서 혁신적인 기술을 제공하고 비즈니스의 민첩성과 효율성을 향상시키는 데 중요한 역할을 합니다. 클라우드 컴퓨팅과 AWS의 성공적인 활용은 비즈니스 성과를 향상시키고 미래의 디지털 트랜스포메이션에 기여할 수 있습니다. 그렇기 때문에 IT 리더 및 기업은 AWS의 장점을 최대한 활용하고자 끊임없이 노력해야 합니다.

반응형
반응형

- 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원리입니다.
- 관리 가능하고, 재사용 가능한 코드를 만드는 기반이며, 가장 중요한 메커니즘은 추상화, 다형성이라고 할 수 있습니다.

 

 
## 용어 풀이
> **확장 이란 ?**
>
>새로운 타입을 추가함으로써 새로운 기능을 추가할 수 있다. 즉 확장이란 새로운 타입을 추가함으로써 새로운 기능(요구사항)을 구현한다. **확장에는 열려 있다는 것은 새로운 타입(클래스)을 추가함으로써 기능(요구사항)을 확장하는 것이다.**

> **변경 이란 ?**
>
> 확장이 발생했을 때 상위 레벨이 영향을 미치지 않아야 한다. **확장(새로운 클래스)이 발생했을 때 해당 코드를 호출하는 쪽에서 변경이 발생하지 않다면 변경에 닫혀 있다는 것이다.**

 

 


## OCP를 준수하는 방법

인터페이스와 추상 클래스 활용: 인터페이스와 추상 클래스를 사용하여 확장 가능한 구조를 정의합니다.

상속과 다형성 활용: 상속과 다형성을 통해 새로운 기능을 추가하고 기존 코드를 수정하지 않고도 다양한 형태의 객체를 처리할 수 있게 합니다.

의존성 역전 원칙(Dependency Inversion Principle - DIP) 준수: 상위 수준 모듈이 하위 수준 모듈에 의존하면 안 되며, 둘 모두 추상화에 의존해야 합니다. 이를 통해 확장에 열려 있고 변경에 닫힌 코드를 유지할 수 있습니다.

## OCP를 위반하는 방법

기능 추가 시 기존 코드 변경: 새로운 기능을 추가하려면 기존 코드를 수정해야 하는 경우 OCP를 위반합니다.

클래스 간 강한 결합: 클래스 간의 강한 결합으로 인해 새로운 기능을 추가하면 다른 클래스에 영향을 미치는 경우 OCP를 위반합니다.

조건문과 스위치문 지나치게 사용: 조건문이나 스위치문을 지나치게 사용하여 새로운 기능을 추가할 때마다 조건을 추가하면 OCP를 위반합니다.

## 예시

- OCP를 위반한 경우

public class Shape {
        private String type;
    
        public Shape(String type) {
            this.type = type;
        }
    
        public double calculateArea() {
            if (type.equals("Circle")) {
                double radius = 5.0; // 원의 반지름
                return Math.PI * radius * radius;
            } else if (type.equals("Rectangle")) {
                double width = 4.0; // 사각형의 너비
                double height = 6.0; // 사각형의 높이
                return width * height;
            }
            return 0.0; // 다른 도형은 계산하지 않음
        }
    }


  
- OCP를 준수한 경우
 

 public interface Shape {
        double calculateArea();
    }
    
    public class Circle implements Shape {
        private double radius;
    
        public Circle(double radius) {
            this.radius = radius;
        }
    
        @Override
        public double calculateArea() {
            return Math.PI * radius * radius;
        }
    }
    
    public class Rectangle implements Shape {
        private double width;
        private double height;
    
        public Rectangle(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        @Override
        public double calculateArea() {
            return width * height;
        }
    }
반응형

'Development > OOP' 카테고리의 다른 글

단일 책임 원칙 (Single Responsibility Principle)  (0) 2023.09.19
반응형

- 클래스나 모듈은 하나의 책임만 가져야 한다는 원칙을 나타냅니다.


- 자신의 책임에 집중하고 다른 관심사나 작업에 대한 처리를 다른 클래스나 모듈로 분리합니다.


- SRP를 위반한 경우

public class BankAccount {
        private String accountNumber;
        private double balance;
    
        public BankAccount(String accountNumber, double initialBalance) {
            this.accountNumber = accountNumber;
            this.balance = initialBalance;
        }
    
        public void deposit(double amount) {
            // 입금 로직
            balance += amount;
        }
    
        public void withdraw(double amount) {
            // 출금 로직
            balance -= amount;
        }
    
        public void transfer(BankAccount destinationAccount, double amount) {
            // 계좌 간 이체 로직
            destinationAccount.deposit(amount);
            this.withdraw(amount);
        }
    
        public void generateAccountStatement() {
            // 계좌 명세서 생성 및 출력 로직
        }
    }


위의 BankAccount 클래스는 하나의 클래스에서 다음과 같은 다양한 책임을 가지고 있습니다:

입금(deposit) 및 출금(withdraw) 로직 관리  

계좌 간 이체(transfer) 로직 관리  

계좌 명세서 생성 및 출력(generateAccountStatement) 로직 관리  

이러한 다양한 책임이 하나의 클래스에 혼재되어 있으므로 SRP를 위반하고 있습니다.



- SRP를 준수한 경우:

  public class BankAccount {
        private String accountNumber;
        private double balance;
    
        public BankAccount(String accountNumber, double initialBalance) {
            this.accountNumber = accountNumber;
            this.balance = initialBalance;
        }
    
        public void deposit(double amount) {
            // 입금 로직
            balance += amount;
        }
    
        public void withdraw(double amount) {
            // 출금 로직
            balance -= amount;
        }
    }
    
    public class AccountTransfer {
        public static void transfer(BankAccount sourceAccount, BankAccount destinationAccount, double amount) {
            // 계좌 간 이체 로직
            destinationAccount.deposit(amount);
            sourceAccount.withdraw(amount);
        }
    }
    
    public class AccountStatement {
        public static void generateAccountStatement(BankAccount account) {
            // 계좌 명세서 생성 및 출력 로직
        }
    }



위의 코드에서는 SRP를 준수하기 위해 다음과 같은 변경이 이루어졌습니다:

BankAccount 클래스는 입금과 출금과 같은 계좌 관리 책임만을 갖고 있습니다. 

AccountTransfer 클래스는 계좌 간 이체 책임만을 갖고 있습니다.

AccountStatement 클래스는 계좌 명세서 생성 및 출력 책임만을 갖고 있습니다.

반응형

'Development > OOP' 카테고리의 다른 글

개방폐쇄의 원칙 (Open Close Principle)  (0) 2023.09.20
반응형

DevOps: 개발과 운영의 융합을 통한 협업 및 자동화


DevOps는 소프트웨어 개발과 IT 운영 사이의 간극을 줄이고, 두 분야 간의 협업을 강화하여 더 빠르고 안정적인 소프트웨어 개발과 배포를 실현하는 방법론입니다. 이를 통해 개발과 운영 팀은 더욱 효율적으로 협력하며 고객에게 가치를 빠르게 제공할 수 있게 됩니다.

DevOps의 핵심 원칙:
- 지속적 통합 (Continuous Integration, CI): 개발자들이 작성한 코드를 빈번하게 통합하고 테스트하는 것을 의미합니다. 이를 통해 코드 충돌을 미리 파악하고 수정할 수 있습니다.

- 지속적 전달 (Continuous Delivery, CD): 코드 변경사항을 자동화된 프로세스로 빌드, 테스트하여 실행 가능한 상태로 유지하는 것을 말합니다.

- 지속적 배포 (Continuous Deployment, CD): 지속적 전달을 한 단계 더 나아가서, 테스트를 통과한 코드 변경사항을 자동으로 운영 환경에 배포합니다.

- 인프라스트럭처 코드 (Infrastructure as Code, IaC): 인프라를 코드로 관리하여 확장 및 축소, 설정 변경 등을 자동화하며 일관된 환경을 구축합니다.

- 자동화 (Automation): 반복적인 작업과 프로세스를 자동화하여 인간의 실수를 최소화하고 일관성을 유지합니다.

- 문화와 협력 강화: 개발자, 운영자 및 다른 관련 팀 간의 원활한 커뮤니케이션과 협업을 촉진합니다.

DevOps의 이점:
- 빠른 소프트웨어 제공: 지속적 전달과 배포를 통해 빠르게 업데이트를 고객에게 제공할 수 있습니다.

- 안정적인 배포: 자동화된 테스트와 모니터링을 통해 버그와 장애를 빠르게 발견하고 해결할 수 있습니다.

- 비용 절감: 자동화된 프로세스와 클라우드 컴퓨팅을 활용하여 운영 비용을 절감할 수 있습니다.

- 빠른 복구: 문제가 발생하더라도 빠른 복구와 롤백이 가능하여 서비스 중단 시간을 최소화합니다.

DevOps의 도전 과제:
- 문화 변화: 기존의 개발과 운영 문화를 변화시키기 위해서는 조직 내부에서의 문화 변화가 필요합니다.

- 보안과 규정 준수: 자동화된 프로세스에서도 보안과 규정 준수를 고려하며 적용해야 합니다.

- 기술적 복잡성: 다양한 도구와 기술을 효과적으로 통합하고 관리하는 것이 도전이 될 수 있습니다.

DevOps는 빠른 개발과 안정적인 운영을 결합하여 비즈니스의 경쟁력을 향상시키는 중요한 방법론입니다. 개발과 운영의 경계를 없애고, 자동화와 협업을 강화하여 소프트웨어 전달의 속도와 품질을 향상시키는 데에 큰 역할을 합니다.

 

Jenkins: 지속적 통합과 자동화 도구

Jenkins는 소프트웨어 개발 및 배포 프로세스를 자동화하여 효율적으로 관리할 수 있도록 도와주는 도구입니다. 지속적 통합과 지속적 전달을 실현하기 위해 사용되며, 코드 변경사항의 빠른 통합, 테스트, 빌드, 배포 등을 자동화하여 개발과 운영의 협업을 강화합니다.

주요 기능:
- 지속적 통합 (CI): 코드 변경사항이 버전 관리 시스템(Git, SVN 등)에 푸시되면 Jenkins는 자동으로 빌드 및 테스트를 실행하여 코드 품질을 평가합니다.

- 지속적 전달 (CD): 테스트 및 빌드가 성공하면 Jenkins는 빌드 결과물을 운영 환경에 전달하거나 배포하는 과정을 자동화합니다.

- 자동화된 배포: Jenkins는 다양한 환경에 대한 배포를 자동화하여 버전 업데이트 및 롤백을 쉽게 수행할 수 있습니다.

- 플러그인 지원: 다양한 플러그인을 지원하여 사용자의 필요에 따라 기능을 확장할 수 있습니다. 예를 들어, 테스트 도구, 린트 도구, 통합된 보고서 등을 사용할 수 있습니다.

- 자동화된 작업 스케줄링: 특정 시간 또는 이벤트에 따라 자동화된 작업을 스케줄링할 수 있습니다.

장점:
- 자동화된 통합과 배포: 코드 변경사항을 자동으로 빌드하고 배포하므로 통합 및 배포 작업에 대한 시간과 노력을 절약할 수 있습니다.

- 확장성: 다양한 플러그인과 확장 기능을 제공하여 다양한 요구사항에 대응할 수 있습니다.

- 툴 다양성: 다양한 개발 언어와 프레임워크를 지원하므로 다양한 프로젝트에서 활용 가능합니다.

 

 

반응형
반응형

미니필터 드라이버 서비스 정상 구동 -> 인증서 서명 + 마이크로소프트 교차 서명 반드시 필요

 

 

1. App Certification Kit 설치

(https://learn.microsoft.com/ko-kr/windows/uwp/debug-test-perf/windows-app-certification-kit)

2. CMD 관리자 모드 -> App Certification Kit 설치 경로

3. SignTool.exe (서명 도구) 이용하여 서명

C:\> signtoll.exe [COMMAND] [OPTIONS] [FILE_NAME | ....]

    [COMMAND] 

             - catdb : 카탈로그 파일 추가 혹은 제거

             - sign : 디지털 서명 수행

             - timestamp : 타임스탬프 기록

             - verify : 디지털 서명 확인

 

    [OPTIONS]

            - /ac :  서명 추가, 주 서명 없으면 이 서명을 기본 서명으로 대체

            - /n   :  서명 인증서의 주체 이름 지정

            - /fd  :  파일 다이제스트 알고리즘 지정 (default : sha1)

            - /tr  :  RFC 3161 타임스팸프 서버 URL 지정  

C:\> signtool.exe sign /v /ac "인증서파일" /n "주체이름" /fd "알고리즘" /tr "타임스탬프의 서버"  "드라이버파일명"

 

4. 캐비넷 (cab) 파일 생성을 위한 템플릿 지시문 파일 (test.ddf)

   Microsoft Partner Center 교차 서명을 위해 cab  파일 생성 (why? 서명된 드라이버 파일 업로드 규칙)

cabwiz.ddf
.Set CabinetFileCountThreshold=0    ; no files per cabinet threshold
.Set FolderFileCountThreshold=0     ; no files per folder threshold
.Set FolderSizeThreshold=0          ; no folder size threshold
.Set MaxCabinetSize=0               ; no max size for the cabinet
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0                  ; .cab 파일에 필요한 최대 크기의 공간을 잡는다.
.Set CompressionType=MSZIP
.Set Cabinet=on
.Set Compress=on
;Specify file name for new cab file
.Set CabinetNameTemplate=test.cab
; Specify the subdirectory for the files.  
; Your cab file should not have files at the root level,
; and each driver package must be in a separate subfolder.
.Set DestinationDir=test
;Specify files to be included in cab file
;파일에 포함될 파일들
D:\signing\test.inf
D:\signing\test.sys

5. cab 파일 생성 명령어 실행 

C:\> makecab -f test.ddf

 

6. cab 파일 SHA 256 서명

C:\> signtool.exe sign /ac "C:\MyEVCert.cer" /s MY /n "Company Name" /fd sha256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td sha256 /v "test.cab"

 

7. 마이크로소프트 파트너 센터 cab 파일 업로드 

 

8.  Product name 등록

 

9. 드라이버 환경 선택 (모두 선택)

 

10. 서명 완료후 More 버튼 클릭 

 

11. singed파일(Download signed files 버튼)

    다운로드 파일

        - 업로드 package(cab)파일 (압축 해제 : 사설 인증 서명된 드라이버 파일)

        - Download initial package 파일 ( 압축 해제 : 사설 인증 + MS 서명 = 교차 서명 된 드라이버 파일)

반응형

'Development > Window Driver' 카테고리의 다른 글

미니필터 드라이버란?  (0) 2022.12.12
반응형

미니필터 드라이버

  • 파일 시스템 이벤트 모니터링을 위한 드라이버
  • Windows 시스템 커널 레벨 수준 프로세스의 파일 시스템 요청을 모니터링
  • 필터 드라이버 로드 / 언로드 유리
  • 필요시 요청 차단 (프로세스 실행 차단)
  • 유저 모드 어플리케이션단 통신 

미니필터 컨셉

- 콜백 루틴 호출 : Minifilter A (attribute 365000) -> Minifilter B (attribute 325000) -> Minifilter C (attribute 305000)

- 콜랙 루틴 완료 호출 : 루틴 호출 역순

  1. I/O Manager 
    • 요청한 연산을 처리하는 드라이버를 파악하여 해당 드라이버에게 IRP(I/O Request Packet)을 전달
    • IRP : 데이터 구조체, I/O연산에 수행되어야 하는 연산/필요한 버퍼의 정보 포함
    • 드라이버 연산 결과를 유저 애플리케이션에 상태 및 데이터 반환
  2. Filter Manager
    • 파일 시스템 필터 드라이버에 필요한 기능 구현 및 노출
  3. File System Driver
    • 파일 시스템의 동작에 값을 추가 / 수정하는 드라이버
    • 파일 시스템 / 파일 시스템 볼륨에 대한 I/O 작업을 필터링

드라이버 확장자 

    - sys

 

미니필터 드라이버 상태 조회

C:/> sc query [driver_name]

 

미니 필터 등록 

    test.inf 파일 이용하여 미니필터 등록

    sc 명령어로 등록

sc create "서비스 이름" binpath= "서비스로 등록할 드라이버 경로" displayName= "test" start= demand type= kernel
  • start : 드라이버 부팅 방식
  • '= 인자값 ' : 사이에 한 칸 띄움

 

미니 필터 드라이버 시작

C:/> sc start [driver_name]

 

미니 필터 드라이버 중지

C:/> sc stop [driver_name]

 

미니 필터 드라이버 제거

C:/> sc delete [driver_name]
반응형

+ Recent posts