마이크로서비스가 수많은 선택의 기회를 제공하면서 변화의 속도가 빨라지고 아키텍처가 수용할 수 있는 환경이 더 유연해 지고있다. 이에 따른 아키텍트의 역할변화에 대해 알아보자.

부정확한 비교

아키텍트는 다르사람이 해석하고 실행할 수 있도록 세부 계획을 세우는 것이다. 예술가와 엔지니어의 균형감각을 유지하면서 물리적으로 불가능하다는 구조 공학자의 간헐적인 반대를 제외한 다른 관점들을 통합하여 단일한 비전이 정상적으로 형성되도록 감독하는 것이다. 아이티 업계의 이러한 관점은 고된 업무로 이어진다. 알 수 없는 미래에 대한 근본적인 고민 없이 완벽한 시스템 구축을 증명하려는 관점에서 작성된 끝없는 설계도와 문서 작업이 바로 그것이다. 이를 해결하기 위한 최선의 방안은 우리의 입장에서 아키텍트의 의미를 재정의 하는 것이다.

아키텍트에 대한 진화적 관점

아키텍트는 아ㅠ으로 발생할 모든 일을 예측할 수 없는 만큼, 모든 사태에 대해 미리 계획하기 보다는 과욕을 부리려는 충동을 절제하고 변화를 받아들이도록 해야 한다. 아키텍트가 만드는 시스템은 단지 사용자만을 수용하는 것이 아니며, 그곳에서 일하는 개발자와 운영자, 시스템을 변경한느 업무를 가진 모든 사람까지 수용해야한다. 또한 도시 설계자로서의 아키텍트는 방향 자체는 개괄적으로 설정하되, 특정 경우의 세부 구현에 대해서만 매우 구체적으로 관여해야 한다. 시스템이 현재의 목적에 들어맞을 뿐만 아니라 미래의 플랫폼으로서 적합하다는 것을 보장해야 하고, 사용자와 개발자가 똑같이 행복해지도록 해야 한다.

구역화

아키텍트는 구역 내의 일보다 구역 사이에서 발생하는 일을 더 걱정해야 한다. 즉 서비스 간 통신 방법에 대해 고민하거나 시스템의 전반적인 상태를 모니터링하는 데 더 많은 시간을 할애해야 한다. 

원시적인 접근법

4.1 전략적 목표 : 높은 수준의 목표. 기술이 전혀 포함되지 않을 가능성이 큰 만큼 회사 또는 사업 부서 수준에서 정의 

4.2 원칙 : 더 큰 목표를 위해 해야 할 일을 정렬하는 규칙 

4.3 실천 사항 : 업무 수행을 위한 자세하고도 실질적인 지침. 기술 명세적이며 구체적이어야 한다. 

4.4 원칙과 실천 사항의 결합 

필수 기준

5.1 모니터링 : 서비스 간 경계를 넘어 시스템 상태를 일관되게 살펴볼 수 있어야 한다. 서비스 세부 상태가 아닌 시스템 전체 상태를 볼 수 있어야 한다. 

5.2 인터페이스 : 인터페이스 기술의 개수는 최소한으로 유지하는 편이 좋다.

5.3 아키텍처 안정성 : 오동작하는 하나의 서비스가 전체를 망가뜨리게 해서는 안되며, 서비스들이 비정상적인 하위 호출로부터 자신을 잘 보호하도록 해야 한다. 

코드를 통한 통제

실제 사용하는 서비스중 본보기가 될만한 서비스템플릿을 제공하는 것이 좋다. 

기술 부채

조직에 따라 아키텍트가 관대한 지침을 제공하고, 팀 스스로 부채를 찾아내서 상환하는 방법을 결정할 수 있다.  

예외 처리

충분히 많은 예외가 발견된다면 결과적으로 현실을 재인식시킬 수 있도록 원칙과 실천사항을 변경하는 것이 타당할 수 있다. 나중에 참조할 수 있도록 기록해둘 만하다. 

중앙에서의 거버넌스와 지휘

아키텍트의 업무 중 하나가 기술 비전을 결정하는 것이라면, 거버넌스는 우리가 구축하는 결과물이 해당 비전과 일치함을 보장하고, 필요할 경우 비전을 진화시키는 것이다. 

팀 만들기 

사람들이 더 많은 책무를 맡기 전에 개별 서비스의 소유권을 부여함으로써 거들을 성장시키는 것은 그들 자신의 경력 목표를 성취하도록 돕는 훌륭한 방법이다. 

마이크로서비스 아키텍처는 최근 분산 컴퓨팅과 클라우드 기반 서비스가 일반화 되면서 데브옵스 기반 개발 문화의 변화와 필연적으로 조우한다. 마이크로 서비스는 분산 시스템에 대한 접근 방식으로 각자의 생명주기를 가지고 협력하는 세분화한 서비스 사용을 장려한다.  미시적인 컴퓨터 프로그래밍 부문에서 리팩토링이 기술 부채를 줄이는 수단이라면, 거시적인 서비스 개발과 운영부문에서는 마이크로서비스가 기술 부채를 줄이는 강력한 수단이다.


1. 마이크로서비스란 

: 작고 자율적으로 협업하는 서비스 

1.1 작고, 한 가지 일을 잘하는 데 주력

코드베이스는 새로운 기능을 추가하면서 성장하지만 시간이 지날수록 방대해져서 어디를 변경해야 할지 파악하기 어려워지며, 중간 경계의 어딘가가 빈번히 무너지기 시작하고, 버그를 고치거나 어려운 구현을 하는 과정에서 유사한 기능과 연관된 코드가 곳곳으로 퍼저나간다. 모놀리식 시스템에서 코드를 더 응집하고, 추상화 또는 모듈화 해야한다. 응집력, 즉 관련된 코드들을 함께 그룹화하려는 힘은 마이크로서비스의 중요한 개념이다. 같은 이유로 변경되는 것들은 한데 모으고, 서로 다른 이유로 변경되는 것들은 분리하라는 단일 책임을 강조한다.

그렇다면 얼마나 작아야 하는 것인가? 충분히 작아서 더 이상 작아질 수 없는 크기이다. 서비스가 작아질수록 마이크로서비스 아키텍처의 혜택과 단점은 더 극대화 되며, 서비스를 작게 만들수록 상호의존성에 대한 문제는 줄어든다. 

1.2 자율성 

서비스 간의 분산도를 높이고 이 서비스 들은 독립적으로 변경, 배포 될 수 있어야 한다. 황금률은 다른 변경 없이 특정 서비스만 변경하고 배포할 수 있는가? 이다. 구현 방식에 영향을 받지 않는 좋은 API가 중요하다. 


2. 주요혜택

2.1 기술 이기종성

다수의 협업 서비스로 구성된 시스템에서는 각 서비스가 다른 기술을 사용하도록 결정할 수 있다. 

2.2 회복성

한 시스템의 컴포넌트에 장애가 발생하더라도 그 장애가 전파되지 않는다면 해당 문제를 격리하고 나머지 시스템을 계속 작동시킬 수 있다. 

2.3 확장성

작은 서비스들로 구성되어 있다면 필요한 서비스만 골라 확장시킬 수 있다.

2.4 배포 용이성

배포시에도 나머지 시스템과 독립적으로 배포, 수정이 가능하다. 

2.5 조직 부합성

아키텍처를 조직 구조에 맞게 더 적절히 정렬할 수 있고 최적의 팀 크기와 생산성을 위해 하나의 코드베이스에서 일하는 인원을 최소화할 수 있다. 

2.6 조합성

다양한 방법과 목적으로 우리가 제공하는 기능이 소비되도록 할 수있다. 기능을 재사용할 기회가 많다. 데스크탑 웹사이트나 모바일 어플리케이션에 국한해서 생각하는 시대는 지났다. 이제 우리는 웹, 네이티브 앱, 모바일 앱, 테블릿 앱이나 웨어러블 장치를 위한 기능들을 함께 엮을 무궁무진한 방법을 고민해야 한다. 조직이 고객과의 좁은 채널에서 멋어나 곡앵이 직접 참여하는 더 포괄적인 개념을 고려하게 된 만큼 이를 지원할 수 있는 아키텍처가 필요하다. 

2.7 대체 가능성을 위한 최적화 

마이크로서비스 방식을 사용한느 팀은 필요할 경우 서비스를 완전히 재작성하는 것을 편하게 생각하며, 서비스가 더 이상 필요치 않으면 쉽게 제거할 수 있다. 코드베이스가 단지 볓 백 줄 규모일 때 개발자들은 자기가 쓴 코드이더라도 집착하지 않으며 교체 비용 또한 매우 적다. 


3. 서비스 지향 아키텍처란

서비스의 최종 능력 집합을 제공하는 여러 서비스가 서로 협업하도록 하는 설계 접근 방식이다. 여기서 서비스린 일반적으로 완전히 분리된 운영시스템의 프로세스를 의미하며, 서비스 간 통신은 네트워크 호출로 이루어진다. 마이크로서비스는 서비스 지향 아키텍저에 대한 특정 접근법으로 보아야 한다. 


4. 기타 분해 기술

4.1 공유 라이브러리

4.2 모듈 



SELECT 문에서 행 제한

WHERE 절을 사용하여 반환되는 행을 제한

컬럼 별칭, 그룹함수 사용 불가

문자열 및 날짜/시간 비교 

 문자열 : 대소문자 구별 O

 날짜/시간 : 대소문자 구별 X, 세션의 날짜 형식에 맞춰 자동 변환 시도, 

- TO_DATE : 세션의 날짜 형식과 무관하게 날짜 표현 가능 

- 날짜 리터럴 사용: 세션의 날짜 형식과 무관하게 날짜 표현 가능 

- 세션의 날짜/시간 형식 확인 쿼리 

SELECT * 

      FROM nls_session_paameters

WHERE parameter LIKE '%FORMAT%';

- 세션의 날짜/시간 형식 변환

- 문자열 비교는 첫번째 숫자의 알파벳 순서를 비교함 

<> 같지않음 / BETWEEN ~ AND ~ / IN (or조건) / IS NULL / %(0개이상의문자) _(암거나하나의문자)  

- A_A 를 검색하려면?

      WHERE c1 LIKE 'A!_A' ESCAPE '!';  _에서 탈출 

 1. 오라클데이터베이스 11g XE
- RDBMS, ORDBMS
  유저 정의의 데이터 유형 및 객체 
- EX(Express Edition)
  오라클에서 제공하는 다양한 데이터베이스중 소규모 입문용 버전
- 다운로드 (이미있음) 

■ 2. 오라클데이터베이스 Client Program
- SQL Plus
- SQL Developer (Toad로 대신하기)

■ 3. SELECT
- 사용하는 이유 : 데이터를 보려고.. 하면 아쉬움 
- 정의 : 재료 집합으로부터 [원하는 결과 집합을 : WHAT]  [정의, 요청, 기술, 묘사 : HOW ] 하는 SQL 문장
- 기본구조 
  5) SELECT (WHAT 정의 : how)  
     *(asterisk), 컬럼, 수식, SQ(scalar sq)
  1) FROM (재료집합 정의) 
     T테이블, V뷰가테이블로부터정의됨, SQ(Inline View)서브쿼리임시뷰, 
      MV(객체화된뷰데이터를별도로저장하는뷰), JOIN(둘이상의재료집합을결합하여새로운재료집합만듬) 등 
  2) WHERE (Filtering Rows) 후보행, 로우를 필터링
     조건식(Predicate) : True일때만 통과 (True False Null)
  3) GROUP BY (무리짓기) 
     기준값(컬럼, 수식) : 같은 값을 갖는 행을 한묶음 으로 
  4) HAVING (Filtering Groups) 그룹 전체에 대해서, 그룹을 필터링, 조건에 만족하는 그룹의 모든 로우
     조건식(Predicate) : True일때만 통과 (True False Null) 
  6) ORDER BY (결과집합 정렬)
      값(컬럼, 수식, 컬럼 별칭 alias), 오름/내림차순, 널처리 (뒤에 위치 시킨다던지)

■ 4. 테이블 
- 의미 
  같은 성질(컬럼)을 저장하는 데이터의 집합, 테이터를 저장하는 기본 데이터베이스 객체
  ** 데이블을 사용하기 전 테이블의 구조를 이해하는 것은 정말로 중요
- 구조
   테이블을 구성하는 컬럼(에 관한 정보)
   구조 확인 desc [테이블이름], SQL Developer의 connection navigator 에서 table 노트 확장 

SELECT문


■ 1. SQL 작성 지침 
- 대소문자 구별안함, 들여쓰기 

■ 2. SQL문의 기본 구조 


■ 3. 원하는 것 정의/요청 하기
- 정의/요청 위치
   SELECT절과 FROM절 사이, select-list : 원하는 것(what)을 요구사항에 맞게(how) 정의하여 나열 
- select-list에 가능한 요소
   *(아스타), 테이블명.* : 모든컬럼 
   컬럼, 리터럴, 수식, 함수, 스칼라 서브쿼리 > 값 
- EX 모든 부서에 대한 전체 정보를 일련번호를 붙여서 출력하세요
   SELECT ROWNUM, departments.*
   FROM 부서 테이블
- 식별자(identifier)
   데이터베이스 객체이름, 컬럼이름, 컬러별칭 
- 식별자 이름 지정 규칙
   영문자로 시작, 30 byte 이하, #, $, _을 제외한 특수문자 불가, 키워드/예약어 불가
   예외: quoted name 방식 CREATE TABLE "from" (no NUMBER); 여기선 대소문자 구분, "" 로 사용해야함

■ 4. 컬럼 별칭(column alias)
- 용도
   Column heading(필드 이름 아닌 select에서 정의 한 컬럼 이름)이 너무 길거나 특수문자 포함
   계산식에서 유용, 뷰 정의시 CTAS 방식으로 테이블 생서이 유용    
- 정의방식(3)
   한 칸 띄움, AS 키워드, 큰 따옴 표 
- 제한
   정의는 SELECT 절에서,
   사용은 ORDER BY절에서 (from, where, group by, having, select 절에서는 사용 불가) 
   1~6 순서 생각하면 됨.
   
▶5. DISTINCT(중복된 값을 하나만 고려)
SELECT job_id
 FROM employees;

SELECT DISTINCT job_id
 FROM emplyees;

SELECT job_id
 FROM employees
GROUP BY job_id;

[사원들의] 커미션 비율을 중복없이 출력하세요
SELECT DISTINCT 커미션 비율
 FROM 사원 테이블

[부서별 사원의] 직무를 중복없이 출력하세요
SELECT DISTINCT department_id, job_id (전체에 대한 DISTINCT)
 FROM 사원 테이블 
요거 조회 결과 이해하기!
 


+ Recent posts