반응형

SW 2377

C++ : std::array : 개념, 장점, 단점, 필요성, 활용성, 예제, 구현

std::array 요소 수를 기억하지 않습니다. 단순히 C 스타일 배열을 추상화한 것이라 생각하면 좋습니다. 요소 수를 기억하지 못하므로 std::array가 아쉬울 수 있습니다. 아마 std::algorithm을 쓸 수 있고, 반복자를 쓸 수 있어서 나온 것일까요. 현재 사이즈를 접근할 필요가 없고, 고정형 크기의 배열이 필요하다면 선택지로 사용할 수 있는 컨테이너라는 생각이 들었습니다. 다만 프로젝트에서 그러한 경우가 그렇게 많지 않을 것으로 생각이 되었는데, 만약 그러한 상황이어도 굳이, 익숙하지 않은 array를 꺼내지 않아도 얼마든지 다른 방법으로도 충분히 해결 가능합니다. 이러한 컨테이너가 있다는 것을 기억해두고 좋은 기회가 오면 활용해보는 것도 좋을 것 같습니다. #include int m..

SW/C++ 2020.05.03

마이크로서비스 : 기반 서비스의 종류 : 두번쨰 이야기

인증, 인가 API 게이트웨이에서 인증 인가를 처리할 수 있습니다. 그런데 그것은 자체 기능으로 처리하지 않고 OAuth 서비스를 사용합니다. OAuth는 각각의 리소스 서비스가 자체적으로 인증 인가를 처리하는 것이 비효율적이고 독립성을 떨어뜨리기 때문에 등장한 서비스입니다. 동작 메커니즘을 살펴보면 우선 사용자가 API 게이트웨이를 통해 OAuth에게 각 서비스 리소스에 액세스할 권한이 있는지 요청합니다. 그럼 OAuth 서비스는 인증된 사용자인지 이 리소스에 권한이 있는지 확인하고 그것이 확인됐다면 리소스에 접근 가능한 증명서인 액세스 토큰을 발급해 줍니다. 그러면 API 게이트웨이는 다시 요청을 준비하고 각각의 리소스 서비스는 이런 리퀘스트가 액세스 토큰이 있는지 판단하여 리소스를 허용하는 것입니다..

마이크로서비스 : 기반 서비스의 종류 : 첫번쨰 이야기

마이크로 서비스의 역사 우선 기반 서비스가 어떠한 과정을 거쳐서 발전되었는지 마이크로서비스 발전 과정을 살펴보도록 하겠습니다. 그때부터 소프트웨어 업계가 거대한 계획이나 프로세스 대신 빠른 실패와 피드백을 기반으로 하는 실용적인 실천 방법을 선호하게 되었습니다. 우선 AWS가 IaaS 개념으로 2006년도에 EC2를 발표했고 넷플릭스가 스트리밍 사업을 시작하고 아마존의 클라우드 서비스인 AWS로 시스템을 이동하기 시작했습니다. 그러다가 데이터베이스 스토리지가 한 번 크게 망가져서 서비스가 큰 장애를 겪게 됩니다. 이걸 계기로 넷플릭스는 큰 덩어리의 모노리식 시스템에서 마이크로서비스 기반의 시스템으로의 전환을 시작했다고 합니다. 그런데 넷플릭스는 그런 마이크로서비스 기반 시스템을 만들고 운영하면서 여러 어..

C++ : unordered_set : 개념, 차이점, 장점, 예제, 구현

set 자동 정렬되는 컨테이너입니다. 키들을 저장하고, 이진 탐색 트리를 기반으로 합니다. 탐색 시간은 O( log n ) 입니다. 삽입과 제거가 빈번해지면 느립니다. undorderd_set std::map과 동일한 문제로 나오게 되었습니다. 자동 정렬되지 않는 set이라고 생각하면 됩니다. 해쉬 테이블 기반으로 합니다. 탐색시간이 O(1) 이며 최악의 경우 O(n) 입니다. 버킷 때문에 메모리 사용량이 증가할 수 있습니다. #include #include #include #include #include "SpeedTestExample.h" using namespace std; namespace samples { void SpeedTestExample() { // RUN THIS EXAMPLE IN R..

SW/C++ 2020.05.01

마이크로 서비스 : 외부 아키텍처 : 인프라, 플랫폼, DevOps : 개념, 정의, 개요

인프라 영역 MSA에서 인프라 영역은 클라우드 환경을 의미합니다. 인프라로서의 서비스, 즉 IaaS, 플랫폼으로서의 서비스, 즉 Paas로 나눠집니다. 힘들게 구축했던 인프라를 세계적인 플랫폼 사업자들이 자동화된 기능으로 제공합니다. 예를 들면 시스템의 자원 구성, 할당, 관리, 모니터링 등 일련의 작업들을 몇 번 만의 버튼 클릭만으로 자동화, 시각화해서 제공하고 있습니다. 인프라 영역에서 클라우드 사업자가 제공하는 IaaS를 선택할지, 기존 베어 메탈 장비나 가상 머신인 VM을 선택할지 결정해야 합니다. 그다음 위에 플랫폼 영역에서는 마찬가지로 클라우드 사업자가 제공하는 Paas를 선택할지 또는 직접 오픈 소스로 프라이빗한 Paas를 구축할지 결정해야 합니다. 각각의 관계가 어떤 것을 선택할지라도 유연..

C++ : unordered_map : 개념, 장점, 예제, 구현

unordered_map std::map은 자동으로 정렬되는 컨테이너입니다. 그래서 요서 삽입, 제거가 빈번할 경우에는 성능이 저하됩니다. 그래서 그부분을 해결하기 위해 나온 것이 unordered_map입니다. #include #include #include int main() { std::unordered_map scores; scores["nana"] = 60; scores["mocha"] = 70; scores["coco"] = 100; for (auto it = scores.begin(); it != scores.end(); ++it) { std::cout first

SW/C++ 2020.04.30

Java : Spring : Bean : Setter 메서드를 통한 의존성 주입 : 예제, 구현

Setter 메서드를 통한 주입 Bean을 정의할 떄 Bean 객체가 있을 기본 값을 생성자가 아닌 Setter 메서드를 통해 주입할 수 있습니다. TestBean package kr.co.softcampus.beans; public class TestBean { private int data1; private double data2; private boolean data3; private String data4; private DataBean data5; private DataBean data6; public int getData1() { return data1; } public void setData1(int data1) { this.data1 = data1; } public double getDat..

SW/Java 2020.04.29

C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현

람다식의 장점 간단한 함수를 빠르게 만들어 구현할 수 있습니다. 람다식의 단점 디버깅하기 힘들어질 수 있습니다. 함수 재사용성이 낮아집니다. 사람들은 보통 함수를 새로 만들기 전에 클래스에 있는 기존 함수를 찾아봅니다. 람다 함수는 눈에 잘 띄지 않아서 못찾을 가능성이 높습니다. 그럼 코드 중복이 발생하게 되는 것입니다. 베스트 프랙티스 기본적으로 이름 있는 함수를 씁니다. 자잘한 함수는 람다로 써도 괜찮습니다. 허나 재사용할 수 있는 함수를 찾기는 어렵습니다. 정렬 함수 처럼 stl 컨테이너에 매개변수로 전달할 함수들도 좋은 후보입니다. qsort()에 함수 포인터 넘겨주기보다는 람다가 확실히 더 좋습니다. #include #include #include "LambdaExpressionsExample...

SW/C++ 2020.04.29

마이크로서비스 : 내부/외부 아키텍처 : 의미, 개념, 정의, 개요

소프트웨어 아키텍처의 의미 소프트웨어 아키텍처는 소프트웨어를 구성하는 요소와 그 구성요소 간의 관계를 정의하는 것입니다. 아키텍처링은 시스템 구축을 위한 여러 가지 비기능 요건, 예를 들면 문제 영역이 되는 성능, 가용성, 보안, 유지보수성, 확장성 등을 만족하도록 여러 가지 해법을 정의하는 과정입니다. 특히 마이크로서비스 아키텍처는 클라우드라는 가상의 인프라를 활용하여 구조화하는 것이기 때문에 클라우드의 특징을 고려하여 설계되어야 합니다. 클라우드 인프라 및 마이크로서비스 기반 시스템의 장점은 변화무쌍한 비즈니스 환경에 대응할 수 있는 대체성과 확장성이 있기 때문에 아키텍처도 변화에 대응할 수 있는 유연성과 확장성을 반드시 갖춰야 합니다. MSA 내부/외부 아키텍처 다음은 일반적인 마이크로서비스 아키텍..

C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법

람다식이란 이름이 없는 함수개체, 내포되는 함수를 의미합니다. []() -> { // body } 람다 식을 품는 법위 안에 있는 변수를 람다 식에 넘겨줄 떄 사용합니다. 캡처의 종류 [] : 비어 있으므로, 캡처하지 않습니다. = : 값에 의한 캡처, 모든 외부 변수를 캡처합니다. 람다 식 안에서 수정할 수는 없습니다. & : 참조에 의한 캡처입니다. 모든 외부 변수를 캡처합니다. : 특정 변수를 값으로 캡처합니다. 람다 식 안에서 수정할 수 없습니다. & : 특정 변수를 참조로 캡처합니다. int main (){ float score1 = 80.f; float score2 = 20.f; auto max = [=](){ return score1 > score2 ? score1 : score2; } st..

SW/C++ 2020.04.28

소프트웨어 아키텍처 : 품질 속성 설계 전략 원리 : 개념, 개요, 정의

품질속성 설계전략의 원리 아키텍처 패턴은 자주 발생하는 아키텍처 설계 문제에 대한 준비된 해결 방법이므로 대개의 경우 특정한 품질을 확보하는 문제에 대한 해결 방법을 제시하지 않습니다. 패턴을 통하여 품질 개선 효과가 얻어질 수도 있으나 그것이 만족스럽지 않을 수 있습니다. 또한 마땅히 적용할 패턴이 없는 상황에서 어떤 품질을 확보해야 하는 문제가 대두될 수도 있습니다. 품질속성 설계전략은 특정한 품질속성 응답을 제어하는 데 효과가 있는 설계 전략입니다. 품질 속성의 분류 성능, 상호 운영성, 변경 용이성, 가용성, 보안성, 시험 용이성 및 사용 용이성의 7개 품질속성에 대한 설계전략 도출지침이 있습니다. 이들 중 성능을 예로 하여 품질속성 설계전략이 무엇인지를 알아봅니다. 성능 설계 전략 성능은 시간에..

C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점

constexpr 컴파일 시에 값 평가를 강제하기 위해서 템플릿 메타프로그래밍을 남용하였습니다. 이러지 않아도 컴파일러가 자발적으로 그렇게 해주는 경우도 있긴하였습니다. constexpr가 프로그래머의 의도를 보여주는 더 좋은 방법이라 할 수 있습니다.컴파일 도중에 값을 평가하는 것을 컴파일러에게 알려줍니다. 컴파일러가 컴파일 도중에 변수들을 결정지어 줍니다. 함수는 최대한 노력을 합니다. constexpr int Factorial ( int n){ return n = 1 ? 1 : n * Factorial(n -1); } int main () { int value = 3; int result1 = Factorial(value); constexpr int result2 = Factorial(value);..

SW/C++ 2020.04.27

소프트웨어 아키텍처 : 아키텍처 패턴 원리 : 개념, 정의, 개요

아키텍처 패턴 원리 테일러는 아키텍처 패턴을 반복적으로 발생하는 설계 문제에 적용될 수 있는 아키텍처 설계 결정으로 정의하였습니다. 그리고, 아키텍처 패턴의 급증으로 문제가 발생하는 여러 가지 다른 소프트웨어 개발 상황에 다뤄질 수 있도록 일반화되어 있다는 점을 강조하였습니다. 아키텍처 패턴의 표현 아키텍처 패턴을 기술하기 위하여는 패턴이 사용되는 문맥, 패턴이 해결해야 하는 문제와 그 해결 방법 외에도 패턴의 이름과 패턴의 사용에 따른 파급효과를 기술하여야 합니다. 아키텍처 패턴의 예 소프트웨어 시스템 개발에 자주 쓰이는 아키텍처 패턴의 예로 Three Tiers 아키텍처 패턴이 있습니다. 이 패턴에서 컴포넌트는 Front Tier 컴포넌트, Middle Tier 컴포넌트 Backend Tier 컴포넌..

C++ : 이동대입연산자 : 개념, 예제, 활용방법

이동 대입 연산자 & ::operator=(&&) 이동 생성자와 같은 개념입니다. 다른 개체 멤버 변수들의 소유권을 가져옵니다. 이것도 메모리 재할당을 하지 않습니다. 또 얕은 복사입니다. STL 컨테이너용 이동 문법 C++11 이후로, STL 컨테이너에 이동생성자와 이동 대입이 생겼습니다. 그래서 따로 구현할 필요가 없어졌습니다. rvalue 최적화 새로운 프로그래밍 유행어 중 하나입니다. 이동생성자와 이동 대입 연산자는 유효한 내용입니다. 그러나 포인터 대신 개체 자체를 반환하는 함수에서 rvalue를 반환하는 것은 실제로는 매우 느리다고 합니다. 반환 값 최적화라고 하는 컴파일러 최적화를 깨뜨립니다. 가장 좋은 방법은 기본적으로 그냥 개체를 반환해야 합니다. 더 빠라진다고 입증된 경우에만 함수가 r..

SW/C++ 2020.04.26

아키텍처 : 설계의 일반 원리 : 개념, 개요, 정의

설계의 일반 원리 아래 그림은 문제해결에 사용되는 일반적인 접근 방법의 종류를 보여줍니다. 먼저 주어진 문제를 이미 해결책이 알려져 있는 문제로 변형하는 방법입니다. 이런 방법은 그 해결책을 원래의 문제에 대한 직접적인 해결책으로 쉽게 변형할 수 있으면 원래의 문제를 해결하기 위한 좋은 방법이 됩니다. 그림의 위 부분은 이 경우를 보여줍니다. 이미 존재하는 해결책을 이용할 수 없는 경우 원래의 문제를 더 쉬운 문제들로 나누어 해결할 수 있다면, 그 하위 문제들에 대한 해결책들을 합성하여 원래의 문제에 대한 해결책을 만들 수 있습니다. 위 그림의 중간 부분은 이 경우를 보여줍니다. 만일 문제 해결에 기존의 해결책을 활용할 수 있으면 기존의 해결책을 사용할 수 없는 부분에 대해서만 새로이 해결책을 만들고, ..

C++ : lvalue, rvalue, move, 이동생성자 : 개념, 장점, 필요성

lvalue 단일 식을 넘어 지속되는 개체를 의미합니다. 주소가 있으며, 이름이 있는 변수입니다. const 변수, 배열 변수, 비트 필드, 공용 구조체, 클래스 멤버, 좌측 값 참조로 반환하는 함수 호출, 문자열 리터럴 등을 의미합니다. 대부분 지금까지 익숙한 것들을 lvalue라고 생각하면 됩니다. rvalue lvalue가 아닌 개체라고도 할 수 있습니다. 사용되는 단일 식을 넘어 지속되지 않는 일시적인 값을 의미합니다. 주소가 없는 개체, 리터럴(문자열 리터럴 제외), 참조로 반환하지 않는 함수 호출, i++, i-- 등 기본으로 지원되는 산술식, 논리식, 비교식 등이 있습니다. 추가적으로 람다, 열거형들이 그 예라 할 수 있습니다. C++에서 어떻게 복사를 막을 수 있을까요? rvalue 참조와..

SW/C++ 2020.04.25

소프트웨어 아키텍처 설계 원리 : 아키텍처 설계 절차 원리

아키텍트 설계 절차 원리 아키텍처 설계의 출발점은 소프트웨어 시스템의 요구사항들입니다. 소프트웨어 개발의 폭포수 모델은 요구사항 분석이 끝나고 설계가 시작되는 것으로 소프트웨어 개발 프로세스를 설명하지만, 이는 논리적인 순서이고, 실제로는 요구사항 분석과 아키텍처 설계는 서로 얽혀서 상당 부분 동시적으로 진행되는 활동입니다. 초기 단계의 요구사항으로부터 초기 아키텍처가 만들어지면 이는 더 많은 구체적인 요구사항을 파악하는 데 이용됩니다. 이는 다시 아키텍처를 더 구체화하는 데 이용되고, 이 과정이 반복되면 요구사항 명세와 아키텍처가 만들어집니다. 요구사항 분석과 아키텍처 설계가 동시에 이루어지는 이유는 요구사항의 변경 및 추가가 수시로 일어납니다. 상용 소프트웨어 컴포넌트나 오픈소스 코드를 개발에 사용할..

C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스

템플릿 특수화 특정한 템플릿 매개변수를 받로록 템플릿 코드를 커스터마이즈를 할 수 있습니다. std::vector에 좋은 예제가 있습니다. 제너릭한 벡터와 다르게 bool 형은 다르게 구현이 되어 있습니다. 제네릭 템플릿이 어느 형에나 적용되어 있습니다. 단 특정형에 특수화된 템플릿이 있다면, 그 특수화된 템플릿이 적용됩니다. 그러나 자주 사용되지는 않습니다. 하지만 std::vector에서는 bool형에 대한 특수화는 가치가 있습니다. 그 이유는 메모리를 더욱 효율적으로 활용하도록 구성할 수 있기 떄문입니다. 전체 템플릿 특수화 template VAL Power(const VAL value, EXP exponent) {} template float Power(float value, float exp) ..

SW/C++ 2020.04.24

소프트웨어 아키텍처 관점과 뷰 : 정의, 개념, 종류, 개요

관점과 뷰 소프트웨어 시스템은 자체는 무엇인지 특징 짓기 어렵습니다. 그러나 특정한 시각을 갖고 그 시각이 집중하여 보려 하면 복잡한 소프트웨어 시스템도 그 방향에서의 모습을 보입니다. 이렇게 소프트웨어 시스템을 포착하기 위한 시각을 관점이라고 하고 그 관점에서 본 시스템의 모습을 뷰라고 합니다. 소프트웨어 시스템 그 자체는 볼 수 없지만 슬라이드의 사진에서와 같이 적절한 관점들과 그 관점들에서 본 뷰들로 소프트웨어 시스템의 아키텍처를 가시화시킬 수 있습니다. 관점 시스템이 관심을 갖는 이해당사자에 따라 관점이 달라지고 이들 숫자만큼 다양하다고 원칙적으로 이 질문에 답할 수 있습니다. 그러나 실제로는 많은 가능한 관점 중에서도 소프트웨어 개발을 위해 특히 중요하여 일반적으로 많이 이용되는 관점들이 있습니..

반응형