출처: https://engineering.linecorp.com/ko/blog/detail/319

       http://bcho.tistory.com/948




- Monolithic Architecture: 하나의 애플리케이션 내에 서비스를 담는 개발 방법론으로서, 개발, 배포, 확장을 단순화하는 장점이 있다.



1. 정의:

   하나의 애플리케이션을 서비스 단위로 구분하여 하나의 기능에 대해 여러 서비스를 조합하여 제공하며 독립적으로 개발, 배포, 확장할 수 있는 개발 방법론.



2. 장점:

   - 코드 이해와 수정이 쉬워진다.

   - 어떤 기능에서 문제가 발생하더라도 다른 기능에 영향을 주지 않아 장애 처리가 쉬워진다.



3. 단점:

   - 성능 저하

     ㄴ서비스간의 호출을 API 통신을 이용하기 때문에 값을 json이나 xml에서 프로그래밍에서 사용하는 데이타 모델 (java object등)으로 변환하는 marshalling 오버헤드가 발생하고 호출을 위해서 이 메세지들이 네트워크를 통해서 전송되기 때문에 그만한 시간이 더 추가로 소요된다.


   - 메모리 요구량 증가

     ㄴ각 서비스를 독립된 서버에 분할 배치하기 때문에, 중복되는 모듈에 대해서 그만큼 메모리 사용량이 늘어난다.


   - 테스팅이 어려워진다.

     ㄴ서비스들이 각각 분리가 되어 있고, 다른 서비스에 대한 종속성을 가지고 있기 때문에, 특정 사용자 시나리오나 기능을 테스트하고자 할 경우 여러 서비스에 걸쳐서 테스트를 진행해야 하기 때문에 테스트 환경 구축이나 문제 발생시 분리된 여러개의 시스템을 동시에 봐야 하기 때문에 테스팅의 복잡도가 올라간다.


   - 운영이 어려워진다.

     서비스 별로 서로 다른 기술을 사용할 수 있으며, 시스템이 아주 잘게 서비스 단위로 쪼게 지기 때문에 운영을 해야할 대상 시스템의 개수가 늘어나고, 필요한 기술의 수도 늘어나게 된다.


   - 서비스 간의 트랜잭션 처리가 어려워진다.

     ㄴMonolithic Architecture에서는 RDBMS를 사용하면서 하나의 애플리케이션 내에서 트랜잭션이 문제가 있으면 쉽게 데이타베이스의 기능을 이용해서 rollback을 할 수 있었다. 여러개의 데이타베이스를 사용하더라도, 분산 트랜잭션을 지원하는 트랜잭션 코디네이터 (JTS – Java Transaction Service)등을 이용해서 쉽게 구현이 가능했는데, API 기반의 여러 서비스를 하나의 트랜잭션으로 묶는 것은 불가능 하다. 쉽게 예를 들어서 설명을 하면, 계좌에서 돈을 빼는 서비스와, 계좌에 돈을 넣는 서비스가 있다고 하자. 이 둘은 API를 expose했을 때, 계좌에서 돈을 뺀 후, 계좌에 돈을 넣기 전에 시스템이 장애가 나면, 뺀 돈은 없어지게 된다. Monolithic Architecture를 사용했을 경우에는 이러한 문제를 트랜잭션 레벨에서 롤백으로 쉽게 해결할 수 있지만 API 기반의 Microservice Architecture에서는 거의 불가능하다. 

  이러한 문제를 해결하기 위해서 몇가지 방안이 있는데,

  그 첫번째 방법으로는 아예 애플리케이션 디자인 단계에서 여러개의 API를 하나의 트랜잭션으로 묶는 분산 트랜잭션 시나리오 자체를 없애는 방안이다. 분산 트랜잭션이 아주 꼭 필요할 경우에는 차라리 모노리틱 아키텍쳐로 접근하는 것이 맞는 방법이다. 앞서도 언급했듯이 마이크로 서비스 아키텍쳐의 경우, 금융이나 제조와 같이 트랜잭션 보장이 중요한 엔터프라이즈 시스템보다는 대규모 처리가 필요한 B2C 형 서비스에 적합하기 때문에, 아키텍쳐 스타일 자체가 트랜잭션을 중요시 하는 시나리오에서는 적절하지 않다.

  그럼에도 불구하고, 트랜잭션 처리가 필요할 경우, 트랜잭션 실패시 이를 애플리케이션 적으로 처리해 줘야 하는 데, 이를 보상 트랜잭션(compensation transaction)이라고 한다. 앞의 계좌 이체 시나리오에서 돈을 뺀 후, 다른 계좌에 넣다가 에러가 났을 경우에, 명시적으로, 돈을 원래 계좌로 돌려주는 에러 처리 로직을 구현해야 한다.

  마지막 방법으로 복합 서비스 (composite service)라는 것을 만들어서 활용하는 방법이 있는데, 복합 서비스란 트랜잭션을 묶어야 하는 두개의 시스템을 트랜잭션을 지원하는 네이티브 프로토콜을 이용해서 구현한 다음 이를 API로 노출 시키는 방법이다.

두개의 데이타 베이스는 XA(eXtended Architecture)와 같은 분산 트랜잭션 프로토콜을 써서 서비스를 개발하거나 또는 SAP나 Oracle 아답터와 같이 트랜잭션을 지원하는 네이티브 아답터를 사용하는 방법이다. 기존에 SOA에서 많이 했던 접근방법이기는 하나, 복합 서비스를 사용할 경우, 복합서비스가 서로 다른 두개의 서비스에 걸쳐서 tightly coupled하게 존재하기 때문에, 마이크로 서비스 아키텍쳐의 isolation(상호 독립적)인 사상에 위배되고 서비스 변경시에 이 부분을  항상 고려해야 하기 때문에 아키텍쳐상의 유연성이 훼손되기 때문에 꼭 필요하지 않은 경우라면 사용하지 않는 것이 좋다.




'IT > Architecture' 카테고리의 다른 글

3-Tier Architecture  (0) 2020.12.18
모노리틱(Monolithic) vs 마이크로서비스(Microservices)  (0) 2020.05.27

>참고: http://www.dbguide.net/dbqna.db?cmd=view&boardUid=143789&boardConfigUid=31&boardStep=0&categoryUid=206


>참고: https://www.codeproject.com/Tips/81400/Useful-DateTime-Functions




-- 특정 월의 N번째 특정 요일에 해당하는 날짜 찾기

DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,[특정 요일을 구하는 경우의 N번째주에 존재할 수 있는 최대일수]-datepart(day,[MONTH]),[MONTH])), [DAY])

ㄴ [특정 요일을 구하는 경우의 N번째주에 존재할 수 있는 최대일수] 

ex1) 일요일 => 첫번째주:7, 두번째주:14, 세번째주:21, 네번째주:28 

ex2) 월요일 => 첫번째주:6, 두번째주:13, 세번째주:20, 네번째주:27 

ex3) 화요일 => 첫번째주:5, 두번째주:12, 세번째주:19, 네번째주:26 

ex4) 수요일 => 첫번째주:4, 두번째주:11, 세번째주:18, 네번째주:25

ex5) 목요일 => 첫번째주:3, 두번째주:10, 세번째주:17, 네번째주:24

ex6) 금요일 => 첫번째주:2, 두번째주:9, 세번째주:16, 네번째주:23

ex7) 토요일 => 첫번째주:1, 두번째주:8, 세번째주:15, 네번째주:22

ㄴ [MONTH]: 찾고자 하는 월의 날짜 (데이터타입은 datetime 또는 'yyyyMMdd')

ㄴ [DAY]: 찾고자 하는 요일의 값 (-1:일요일, 0:월요일, 1:화요일, 2:수요일, 3:목요일, 4:금요일, 5:토요일)



예) 

-- 이번달의 1~4번째 일요일에 해당하는 날짜 찾기

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,7-datepart(day,getdate()),getdate())), -1) -- 첫번째 일요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,14-datepart(day,getdate()),getdate())), -1) -- 두번째 일요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,21-datepart(day,getdate()),getdate())), -1) -- 세번재 일요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,28-datepart(day,getdate()),getdate())), -1) -- 네번째 일요일 날짜


-- 이번달의 1~4번째 화요일에 해당하는 날짜 찾기

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,5-datepart(day,getdate()),getdate())), -1) -- 첫번째 화요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,12-datepart(day,getdate()),getdate())), -1) -- 두번째 화요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,19-datepart(day,getdate()),getdate())), -1) -- 세번재 화요일 날짜

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,26-datepart(day,getdate()),getdate())), -1) -- 네번째 화요일 날짜



http://hashcode.co.kr/questions/887/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-builder%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94

'IT > Java' 카테고리의 다른 글

try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18
String to char[]  (0) 2018.02.24
Java 환경변수 설정 이유  (0) 2018.02.04
자바 I/O 파일 (made by Petr Mitrichev)  (0) 2018.02.04

MSSQL Cross Apply 의 활용 1 : 조인을 넘어서




 - 출처: http://blog.naver.com/PostView.nhn?blogId=valcione&logNo=220257164458&parentCategoryNo=&categoryNo=11&viewDate=&isShowPopularPosts=false&from=section

 





MSSQL Cross Apply 의 활용 2 : Pivot을 넘어서


 - 출처: http://blog.naver.com/PostView.nhn?blogId=valcione&logNo=220257173796&parentCategoryNo=&categoryNo=11&viewDate=&isShowPopularPosts=false&from=section






String str = "Hello World";
char[] charArray = str.toCharArray();

'IT > Java' 카테고리의 다른 글

e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08
Java 환경변수 설정 이유  (0) 2018.02.04
자바 I/O 파일 (made by Petr Mitrichev)  (0) 2018.02.04
애노테이션의 한계  (0) 2018.02.04

// 현재의 날짜(일월연) 가져오기

$now = time();

$currDate = date("dmy", $now);


// 현재의 요일 구분하기  (0~6)

if ( date('w') == 0 ) {       // when today is Sunday

} else if ( date('w') == 1 ) {      // when today is Monday


}

else {

}



// 현재의 날짜로부터 증감
// mktime( 시, 분, 초, 월, 일, 연 )
$day_before_yesterday = date("dmy", mktime(0,0,0,date("m"),date("d")-2,date("Y"))); // 2일전 날짜(일월연)

'IT > PHP' 카테고리의 다른 글

CGI, FastCGI, PHP-FPM 개념  (0) 2018.12.16
ftp를 이용한 원격 파일 업,다운로드  (0) 2018.02.14
PHP XML 파싱(Parsing) 간단 예제  (0) 2018.02.14

ftp를 이용한 원격 파일 업,다운로드

- 참고 : http://blog.habonyphp.com/entry/ftp-ftp%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9B%90%EA%B2%A9-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C#.WoO5lJa7qUl








// FTP 다운로드 로직

function FTPfileDownload($localfile, $remoteFile){


// B 호스트 정보

$ftp_server = "data.sample.com";

$ftp_server_port = 21;

$ftp_user_name = "user_name";

$ftp_user_pass = "12345678";


// B 호스트 접속

$conn_id = ftp_connect ( $ftp_server, $ftp_server_port );



if (! $conn_id) {

echo 'connection error!';

exit;

}



// B 호스트 로그인

$login_result = ftp_login ( $conn_id, $ftp_user_name, $ftp_user_pass );





if ( !$login_result ) {

echo 'login error!';

ftp_quit ( $conn_id );

exit;

}


ftp_pasv($conn_id, true);



// 원격으로 B 호스트에서 다운로드합니다.


// 임시파일 생성 및 쓰기모드로 열기

$fp = fopen ( $localfile, 'w' );





// 원격으로 파일을 가져옵니다.

$ret = ftp_nb_fget ( $conn_id, $fp, $remoteFile, FTP_BINARY );





while ( $ret == FTP_MOREDATA ) {

// 다운로드중 다른 작업을 작성합니다.

$ret = ftp_nb_continue ( $conn_id );

}



ftp_close ( $conn_id );

fclose ( $fp );


}

'IT > PHP' 카테고리의 다른 글

CGI, FastCGI, PHP-FPM 개념  (0) 2018.12.16
날짜 관련 소스 예제  (0) 2018.02.14
PHP XML 파싱(Parsing) 간단 예제  (0) 2018.02.14


PHP XML 파싱(Parsing) 간단 예제

 - 출처 : http://smart3.tistory.com/entry/PHP-XML-%ED%8C%8C%EC%8B%B1Parsing-%EA%B0%84%EB%8B%A8-%EC%98%88%EC%A0%9C


'IT > PHP' 카테고리의 다른 글

CGI, FastCGI, PHP-FPM 개념  (0) 2018.12.16
날짜 관련 소스 예제  (0) 2018.02.14
ftp를 이용한 원격 파일 업,다운로드  (0) 2018.02.14

Eclipse IDE를 이용한 워드프레스 개발환경 세팅

- 출처 : http://hwangc.com/wordpress-development-environment-settings-3/


'IT > Wordpress' 카테고리의 다른 글

Autoset 설치 및 환경설정  (0) 2018.02.14


 Autoset 설치


- 출처 : https://ko.wordpress.org/%EB%82%B4-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%97%90-%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0/



Autoset 환경설정


 - 출처 : http://zardkim.tistory.com/112



<참고사항>
- Autoset에서 프로젝트 경로 설정 시에는 프로젝트 경로에 한글이 없어야 함

'IT > Wordpress' 카테고리의 다른 글

Eclipse IDE를 이용한 워드프레스 개발환경 세팅  (0) 2018.02.14

+ Recent posts