에버노트 원본: https://www.evernote.com/l/ABqNPV5LBCVPZ5ptuQSNUrtepNsGMr_IPGI 

 
1. 시나리오
 
다음과 같은 시나리오를 Drools BRMS 및 Fusion(CEP)로 구현하였다.
 
  • 온도, 연기 센서에서 데이터를 수집
  • 2초 사이에 두 개의 센서가 동시에 온도는 80도를 넘고, 연기 센서는 18을 넘어선 경우 화재로 감지
  • 화재가 감지되면 팬 Actuator를 가동
  • 온도가 다시 40도 미만, 연기 센서의 수치가 10 미만으로 2초간 지속되면 화재가 종료된 것으로 감지
  • 온도 센서만 80도를 넘어서면 고온 경고
  • 연기 센서만 18을 넘어서면 연기 경고
 
다음은 별도로 구현하는 것으로 가정하였다.
 
  • 센서 데이터 수집: 아두이노에 센서를 장착하여 수집
  • 수집된 센서 데이터 입력: 센서 데이터는 REST API를 통해 입력 됨
  • Actuator 가동은 별도의 REST API를 통해 기기로 전달
 
따라서 이 예제에서는 REST API를 통해 수집되었다고 가정되는 센서 데이터 값을 Drools 엔진에 넣어 CEP가 문법을 감지하는 것만 구현하여
Drools Fusion을 통한 CEP 기능을 시연하는데 중점을 두었다.
 
 

2. 개발 도구
 
개발 도구는 다음과 같이 준비한다.
 
  • Eclipse Neon 기준
 
 
  • Eclipse Marketplace에서 다음 모듈들을 설치 설치
 
 
 
다음 과정을 거쳐 프로젝트를 생성한다.
 
  • 프로젝트 생성
 
  • 아래와 같이 예제를 포함하여 프로젝트를 생성 가능
 

3. Rule 실행 준비
 
기본적으로 Drools는 META-INF/kmodule.xml에 정의된 선언적 내용을 통해 Rule 리소스를 읽어 오지만
다음과 같은 방법으로 DRL 파일을 직접 읽어 들일 수도 있다.
 
DRL을 파일에서 읽어 들임 (6.3)
 
KieServices ks = KieServices.Factory.get();
KieRepository
kr = ks.getRepository();
KieFileSystem
kfs = ks.newKieFileSystem();

kfs.write(ResourceFactory.newClassPathResource("rules/cep.drl", CEPTest.class));

KieBuilder
kb = ks.newKieBuilder(kfs);

kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built.
if (kb.getResults().hasMessages(Message.Level.ERROR)) {
   
throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
}

KieContainer
kContainer = ks.newKieContainer(kr.getDefaultReleaseId());

KieSession
kSession = kContainer.newKieSession();

 
DRL을 파일에서 읽어 들임 (6.3 CEP)
CEP(Fusion) 기능을 사용하려면 Drools를 Stream 모드로 실행해야 하며, 이 경우에는 일반 Rule과 달리 다음과 같이 코드를 작성한다.
 
KieBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);

KnowledgeBuilder
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("rules/cep.drl", CEPTest.class), ResourceType.DRL);
if (kbuilder.hasErrors()) {
   
throw new RuntimeException("Build Errors:\n" + kbuilder.getErrors().toString());
}

KnowledgeBase
kbase = KnowledgeBaseFactory.newKnowledgeBase(config);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages())

StatefulKnowledgeSession
ksession = kbase.newStatefulKnowledgeSession();

return ksession
;
DRL Rule은 실행 시, 해당 파일에 정의된 모든 Rule들이 실행(검사)되고 결과가 업데이트 될 경우
다시 Rule들을 검사하여 규칙에 일치하는 것들이 없을 때까지 실행된다.
따라서 A Rule의 실행 결과로 B Rule이 만족될 경우 A, B Rule은 같이 실행 된다.
문제는 A Rule의 실행 결과 A Rule 자신이 다시 조건을 만족하여 실행되는 Loop 현상이 발생할 수 있는데, 이것을 방지하려면
Rule에 다음과 같은 no-loop 옵션을 준다. 또는 A Rule의 실행 결과 B Rule이 실행되고, 다시 B Rule의 실행 결과 A Rule이 실행되는
복합적인 Loop 현상도 발생할 수 있는데 이것을 방지하기 위해서는 lock-on-active 옵션을 준다.
 
 
Loop 방지
 
no-loop: Self-Loop 방지
lock-on-active: Complex Rule에서 하나의 Rule에 의해 다른 Rule이 Trigger 되는 것 방지
 
rule "Fire Alarm Rule"
no-loop true
lock-on-active true
   
when
        fad: FanActuatorData(on ==
false) &&
        tsd: ThermoSensorData(temperature > 80.0, t: temperature) &&
        ssd: SmokeSensorData(smokeLevel > 18.0, s: smokeLevel) over window:time(0.1s)
   
then
        System.out.println(
"*** Fire Alarm ***");
fad.setOn(
true);
update(fad);

end

 

4. Rule 정의
 
 
위의 시나리오를 구현한 CEP Rule은 다음과 같이 정의할 수 있다.
 
//created on: 2017. 3. 26
package com.sample.cep

//list any import classes here.

import com.sample.cep.*;

//declare any global variables here

declare ThermoSensorData
@role(event)
end

declare SmokeSensorData
@role(event)
end


rule "High Temperature Rule"
no-loop true
lock-on-active true
// Fire Alarm이 활성화 되지 않은 상태에서, 온도가 80도를 넘을 경우
   
when
        fad: FanActuatorData(on ==
false) &&
        tsd: ThermoSensorData(temperature > 80.0, value: temperature)
from entry-point thermometer
   
then
        System.out.println(
"*** High Temperature Alert: " + value + " ***");

end

rule "Dense Smoke Rule"
no-loop true
lock-on-active true
// Fire Alarm이 활성화 되지 않은 상태에서, 연기 농도가 18을 넘을 경우
   
when
        fad: FanActuatorData(on ==
false) &&
        ssd: SmokeSensorData(smokeLevel > 18.0, value: smokeLevel)
from entry-point smoke
   
then
        System.out.println(
"*** Dense Smoke Alert: " + value + " ***");

end

rule "Fire Alarm Rule"
no-loop true
lock-on-active true
// Fire Alarm이 활성화 되지 않은 상태에서, 2초 사이에 한 번이라도 온도가 80도를 넘고 연기 농도가 18을 넘을 경우
   
when
        fad: FanActuatorData(on ==
false) &&
        tsd: ThermoSensorData(temperature > 80.0, t: temperature) over window:time(2s)
from entry-point thermometer &&
        ssd: SmokeSensorData(smokeLevel > 18.0, s: smokeLevel) over window:time(2s)
from entry-point smoke
   
then
        System.out.println(
"*** Fire Alarm !!!!!!!!!!!!!!!!!!! ***");
fad.setOn(
true);
update(fad);

end

rule "Fire Alarm Off Rule"
no-loop true
lock-on-active true
// Fire Alarm이 활성화 된 상태에서, 2초 동안 한 번도 온도가 40도를 넘지 않고 연기 농도가 18을 넘지 않을 경우
   
when
        fad: FanActuatorData(on ==
true) &&
   
accumulate(
ThermoSensorData(temperature >= 40.0) over window:time(2s)
from entry-point thermometer;
$cnt1: count(1);
$cnt1 == 0
    ) &&
   
accumulate(
SmokeSensorData(smokeLevel >= 10.0) over window:time(2s)
from entry-point smoke;
$cnt2: count(1);
$cnt2 == 0
    )
   
then
        System.out.println(
"*** Fire Alarm Off ***");
fad.setOn(
false);
update(fad);

end


위의 화재 종료(File Alarm Off Rule)를 감지하는 CEP 규칙은 일반적으로 가장 많이 사용하는 문법으로서
accumulate 함수를 통해 센서 데이터가 2초 Time Window 상에서 몇 번 조건에 일치하는지를 count하고 있다.
여기서는 온도가 40도 이상인 경우과 연기 수치가 10이상인 경우를 세는데, 그것이 2초간 한 번도 없다면 화재는 종료된 것으로 인정한다.
 
DRL 문법에서는 다음과 같이 입력한 Java Bean의 Attribute를 읽어 들일 수 있으며
 
rule "High Temperature Rule"

   
when
        tsd: ThermoSensorData(temperature > 80.0, value: temperature)
   
then
        System.out.println(
"*** High Temperature Alert: " + value + " ***");

end


또는 다음과 같이 직접 getter/setter 메소드 호출하는 것도 가능하다.
 
 
public class ThermoSensorData extends SensorData {
public ThermoSensorData(double value) {
setTemperature(
value);
}

public double getTemperature() {
return getDoubleValue();
}

public void setTemperature(double value) {
setDoubleValue(
value);
}
}

 
rule "High Temperature Rule"

   
when
        tsd: ThermoSensorData(tsd.getTemperature() > 80.0, value: temperature)
   
then
        System.out.println(
"*** High Temperature Alert: " + tsd.getTemperature() + " ***");

end

 

5. 센서 데이터를 입력하여 Rule 실행
 
센서 데이터는 다음과 같이 상수로 정의하였다. 실제 시나리오에서는 REST API 등으로 받아 처리하면 된다.
 
final static double[] THERMO_DATA = new double[] {
20.0, 19.0, 23.3, 85.2, 49.5, 20.0, 21.2, 80.5, 90.9, 74.3, 38.2, 37.1, 20.0, 88.0, 79.0
};

final static double[] SMOKE_DATA = new double
[] {
22.0, 08.2, 03.3, 05.2, 01.5, 02.0, 01.2, 18.5, 19.9, 12.3, 12.8, 09.9, 08.8, 17.9, 18.1
};
CEP에서 처리할 두 개의 센서 데이터를 각각 다른 스트림으로 분리한다.
 
EntryPoint ep1 = kSession.getEntryPoint("thermometer"); // 온도 센서 입력 스트림
EntryPoint
ep2 = kSession.getEntryPoint("smoke"); // 연기 센서 입력 스트림

그리고 다음과 같이 센서 데이터를 발생하는 즉시 입력하고, Rule을 실행한다.
 
// 센서 값이 지속적으로 들어온다고 가정
for(int i = 0; i < THERMO_DATA.length; i++) {
System.
out.println(i);
Thread.sleep(1000);
// 두 개의 센서 값이 각각 다른 시점에 들어온다고 가정
ThermoSensorData
tsd = new ThermoSensorData(THERMO_DATA[i]);
ep1.insert(tsd);
System.
out.println("  T: " + THERMO_DATA[i]);
kSession.fireAllRules();
Thread.sleep(100);
// 두 개의 센서 값이 각각 다른 시점에 들어온다고 가정
SmokeSensorData
ssd = new SmokeSensorData(SMOKE_DATA[i]);
ep2.insert(ssd);
System.
out.println("  S: " + SMOKE_DATA[i]);
kSession
.fireAllRules();
}
중단에 Sleep을 넣은 이유는 실제로 두 개의 센서 데이터가 동시에 들어오지 않고, 발생할 때마다 들어 온다는 것을 가정하였다.
이렇게 일정하거나 동시에 발생하지 않는 두 개 이상의 센서 데이터에서 일정한 규칙을 감지하기 위한 로직을 구현할 때 Drools CEP는 매우 유용하다.
 
 
 
 
 
 
 

"

Posted by Hey Jerry


자료 조사

위키

각종 블로그
기존 서적


조선

조선 왕조는 1392년 태조 이성계를 왕으로 추대하여 개국한 후 200년이라는 한국 역사상 유례없는 평화를 누리고 있었다.
삼포 왜란 으로 일본에 대한 인식이 좋지 않음
조선은 동인과 서인이 치열하게 정치주도권을 두고 정쟁을 벌이는 상황으로,전쟁 직전에 보낸 조선통신사들 또한 붕당별로 의견이 갈라져 결국 율곡 이이의 10만 양병설 또한 기각당하여 조정은 전쟁준비가 되어있지 않은 상황
역사상 유래없는 평화속에 군의 기강도 완전히 흐트러졌다. 훈련은 게을리했으며 장수들또한 자기 배불리기만 바빴지 전쟁준비와 훈련에는 관심이 없었다. ==> 다만, 유성룡의 건의로 이순신이 빠르게 승진 전라좌수사에 임명

히데요시는 1591년 대마도주 소 요시토시(宗義智)를 이용해 게이테쓰 겐소(景轍玄蘇) 등을 사신으로 파견하여 가도입명(假道入明)이라는 주장을 전달했다. 그러나 조선의 왕과 만정제신은 명(明)과 군신대의를 깰 수 없었고 교만한 마음에서 일본을 업신여겼던 데다가 과거 삼포 왜란을 겪었던 조선의 왕과 백관의 처지에서 일본이 명을 정복하는 과정에서 선선히 조선의 길만 빌린다는 실정도 의심스러운 일이었으므로 일본이 한 요청을 거절하였다.[7]

히데요시는 재차 대마도주를 이용하여 교섭을 청하고 교섭이 뜻대로 되지 않으면 조선을 침략할 뜻을 표시했다. 이에 조선 조정에서는 오랜 논의 끝에 1590년(선조 23년)에 교섭에 대답과 더불어 일본의 실정과 히데요시의 저의를 살피려고 황윤길을 통신사로, 김성일을 부사로, 허성을 서장관(書狀官)으로 임명하여 일본에 파견했다.

1591년 음력 3월 통신사 편에 보내온 도요토미 히데요시의 답서에는 정명가도(征明假道)의 문자가 있어 그 침략의 의도가 분명하였으나 사신의 보고는 일치하지 않았다. 당시 서인을 대표하였던 정사 황윤길은 '반드시 병화(兵禍)가 있을 것'이라고 하고 동인을 대표하였던 김성일은 이에 반대하여 '그러한 정상이 없는데 황윤길이 장황하게 아뢰어 민심을 동요시킨다'고 주장하였다. 이리하여 조신 간에 의견이 분분하였고 동인인 허성마저 황윤길의 명견를 옹호하였으나 당시 정권을 장악한 세력으로서 백성이 동요하면 자신이 향유하던 권력에 초래될 변화를 두려워했던 동인이 주도권을 주도하던 조선 조정은 김성일의 의견을 좇았다.[8]

==> 전쟁이라는 혼란으로 자신들의 정권을 잃을 것을 우려한 (즉, 변화를 두려워한) 동인이 선인 황윤길의 의견을 무시


일본

전국 시대

조총으로 인한 전국시대 전황의 변화
15세기 중엽 센고쿠지다이에 이르러서 전투 양상이 대규모 집단 보병 전술로 전화(轉化)하여 전투하는 주체도 특정한 영웅 소수가 아닌 보병이 밀집한 부대로 옮겨졌다.

전투 임무를 수행하는 경장비 보병인 아시가루(足經)가 출현하여 전투 승패를 가름하는 중역을 담당하게 되었다. 이들은 16세기 중엽에 뎃포와 화약이 전래되면서 뎃포 부대인 뎃포쿠미와 궁사 부대인 궁조로 편성되어 전투 시 공격하는 주역을 맡았다.

당시 전국 다이묘 세력 가운데서 가장 먼저 이런 전술 변화를 이용하여 통일에 주도권을 장악한 무장이 바로 오다 노부나가였다. 1575년 오다 노부나가는 다케다 군과 벌인 나가시노 전투(長篠の戦い)에서 조총을 보유한 보병을 주력으로 다케다군의 기병을 격파하여 전술 변화에 전혀 새로운 시기를 열어 놓을 만큼 뚜렷이 구분되는 전기를 열었다. 

일본의 전력
도요토미 히데요시는 이렇게 변모된 군사력을 배경으로 하여 1586년 무렵에 대규모 건조 계획을 추진하기 시작하여 조선 침공 직전에 전함 천여 척을 이미 확보한 데에 이어서 종전 무렵에는 3천여 척이나 되는 대규모 선단을 보유할 수가 있었고 조선을 침공하기 직전인 1591년에는 사이카이도, 난카이도, 산요도, 산인도, 기나이와 그 동방 일부 지역에 동원령을 내려서 병력 33만을 동원할 준비하였다.
==> 총 병력 80만. 화승총 30만 자루

도요토미 히데요시는 임진왜란 6년 전인 1586년에 일본 수군의 약점을 보완하기 위해 유럽의 범선인 카락과 갤리온 구입을 시도했었는데 포르투갈인의 거절로 구입에는 결국 실패했다
==> 일본의 세키부네 전함은 조선의 판옥선에 비해 규모가 작아 화포를 싣기에 부적합 (조총/궁병을 이용한 근접전)


1584년 오다 노부나가의 차남인 오다 노부카쓰와 도쿠가와 이에야스의 연합군과 전쟁에 돌입했다.
결국 도쿠가와 이에야스가 도요토미 히데요시에게 상경하여 화의가 성립하였고 이로써 후방을 안정시킨 토요토미 히데요시는 1585년 시코쿠를 평정
==> 결국 도요토미에 충성하던 다이묘들이 조선에 출정하던 사이 세력을 키우던 도쿠가와 이에야스가 토요토미 사후 정권 장악


조선에 출병한 다이묘들은 대부분 도요토미 가문에 충성하던 자들(카토 키요마사, 후쿠시마 마사노리 등)이었고 히데요시에게 태도가 미적지근하거나 서로 협력해 우조하지 않았던 다이묘들(도쿠가와 이에야스 등)은 불참하는 등 불협화음으로 7년을 이어오다가 히데요시 사후 도요토미 군대는 조선을 철수, 몇년 후 도요토미 정권은 전복(1600년-세키가하라 전투, 1615년-오사카 전투), 도쿠가와 정권 즉, 에도 막부(1603년)가 들어서게 된다.
==> 코니시 유키나가 (조선 침략의 선봉... 도요토미 가문의 가신... 규슈가 영지... 가토 기요마사, 쿠로다 요시타카와 함께 주요 가신)
==> 특이한 점은 천주교 신자 (당시 일본과 교류하던 포르투갈 선교사에 의해)

고니시 유키나가
도요토미 히데요시의 조선 침략 야욕을 감지한 고니시 유키나가는 전쟁을 막고자 시도하였으나 실패하자, 사위인 소 요시토시(宗 義智), 나가사키 반도의 작은 다이묘들인 마쓰라 시게노부(松浦鎮信), 아리마 하루노부(有馬晴信), 오무라 요시아키(大村喜前), 고토 스미하루(五島純玄)와 승려 겐소(玄蘇)를 이끌고, 가토 기요마사에게 보란 듯이 18,700명으로 구성된 조선 침공 선봉대 제1군의 지휘관으로 가장 먼저 조선에 상륙하였다.

견원지간이었던 가토 기요마사는 함경도로 진격하여 국경인 등의 반란 덕분에 임해군등을 생포하며, 커다란 야전을 치루지 않은 것에 비해, 고니시 유키나가는 부산진성과 다대포진성, 동래성을 함락하고, 서울을 가장 먼저 점령하여 참전 무장 가운데 가장 큰 공을 세웠다. 특히 기요마사는 보급을 무시한채 함경도로 계속 진격하여 정문부에게 각개격파 당하였고, 여진족에게 완패 당한 것에 비해, 유키나가는 평양성을 함락한 이후, 보급 문제와 명나라 원군에 대한 부담을 걱정하는등 가토 기요마사와는 대조적인 모습을 보여주었다. 이후 유키나가의 걱정대로 명나라의 개입과 이순신의 남해 제해권 장악, 그리고 각지에서의 의병의 활약으로 인한 보급문제로 인해 더 이상 진격을 못하고 지체하던 중 조명연합군에 패해 쫓겨났다.

한편 고니시 유키나가는 가토 기요마사와는 달리 이시다 미쓰나리등과 함께 적극적으로 강화교섭에 힘썼는데, 가토 기요마사가 이를 두고 '고니시가 조선에서 조금만 더 적극적이었다면, 전쟁의 양상은 달라졌을 것이다.'라고 불만을 터트렸다고도 한다. 




중국

정화의 남해 원정


색목인(色目人) 출신 무슬림으로 명나라 초엽 환관이 됐던 정화를 사령관으로 하는 명나라 함대는 28년동안 7차례 대항해에 나섰다. 매번 2만 7000여명의 인력과 대형 함선인 보선(寶船) 60여척 및 100척 정도의 소형 함선으로 이뤄진 대함대였다. 승무원 150명에 한 명꼴로 배치된 의사만 해도 180명에 이르렀고 승무원들이 소비하는 하루 식량만 70t가량이었다.

정화 함대가 세계사에서도 보기 드문 규모라는 것은 유럽사에서 ‘대항해 시대’를 연 콜럼버스나 바스코 다가마, 마젤란과 비교해 보면 잘 드러난다. 1492년 콜럼버스와 함께 출항한 인원은 함선3척에 승무원 120명이었다. 바스코 다가마 함대는 함선 4척에 승무원 170명이었다. 마젤란도 함선 5척과 승무원 265명을 이끌었을 정도이다.

왜 이렇게 필요 이상의 대규모 함대여야 했을까. 어마어마한 규모는 정화 함대가 실용적인 목적 못지않게 중국의 위용을 과시하고 ‘조공’이라는 중국식 국제 정치·경제제도에 참여할 것을 요구하는 과시용 성격이 강했다는 것을 보여준다. 과거 원나라 쿠빌라이 칸이 구축한 해상교역로를 복구함으로써 국제질서를 재구축하려는 ‘대형 국책사업’이었던 것이다. 오늘날 이란에 있는 호르무즈 왕이나 아프리카의 술탄들도 중국에 조공하라는 정화의 요청에 대해 사자·기린 등 헌상품과사절단을 파견하기도 했다.

==> 당시 인도네시아 등 동남아의 정권을 교체해버린 일도 있음

정화는 19세기 영국 해군이 보유한 최대 전함보다도 세 배 이상 큰 배를 타고 15세기 인도양을 넘어 아프리카까지 누볐다. 하지만 중국은 대규모 해상사업의 성과를 제대로 계승하지 못했다. 항해 기록은 대부분 유실됐다. 정화는 언제 어디에 묻혔는지도 모른채 500여년 동안 잊혀졌다.

 영락제가 야심차게 주도한 ‘남해원정’은 영락제 사후 유학자들의 거센 반발을 불렀다. 무엇보다 막대한 재정부담이 빌미가 됐다. 특히 명나라는 이후 북쪽에서 몽골과 장기간 전쟁을 치르는 한편 남쪽에서 왜구 퇴치에 나서는 이른바 ‘북로남왜’ 속에 바깥 세상으로 눈을 돌릴 여력이 없었다.

 1433년 마지막 남해원정이 끝난 65년 뒤 포르투갈의 바스코 다가마가 이끄는 소규모 함대가 희망봉을 거쳐 캘리컷에 도착했다. 중국이 민간상인들의 해외진출을 금지하는 ‘해금(海禁) 정책을 수백년간 유지하는 동안 캘리컷은 유럽인들의 앞마당이 됐다. 콜럼버스 이후 물밀듯이 아메리카 대륙으로 몰려간 유럽은 짧은 기간 안에 아메리카 전역을 식민지화하면서 아메리카에서 채굴한 막대한 은을 바탕으로 산업혁명의 토대를쌓았다.

 사실 19세기 초까지도 세계 제일의 생산력을 자랑하는 산업국가였던 중국의 명·청 왕조는 굳이 정부 차원에서 부담을 무릅쓰고 먼 바다로 나갈 필요가 없었다. 그러나 산업을비롯해 내세울 게 변변찮았던 변방 유럽은 새로운 돌파구를 마련하기 위해 해외로 나가야 했다. 일확천금을 꿈꿀 수밖에 없는 절박함과 아쉬울 것 없는 풍족함이 역사의 시계추를 바꿨다.

==> 중국은 자체의 풍족함으로 해외로 진춢할 필요성 없어 더 이상 해외 진출 중단
==> 유럽은 향신료 하나를 얻기 위해 인도, 동남아 진출했고, 해상 무역을 금지시켰던 명나라 덕분에 동남아는 물론 일본까지 진출
==> 무역을 금지시키자 중국인들이 동남아 등지로 진출(화교의 성장), 유럽 상인들과 충돌


임진왜란 전후

1368년 개국된 명(明)은 15세기 초 영락제(정화의 원정) 때에 국력이 막강해졌으나 영락제가 사후 국력이 급격히 쇠퇴하기 시작하여 1449년에 정통제가 몽골의 오이라트부를 친정하다가 도리어 패전하여 포로가 된 ‘토목보의 변’을 계기로 명의 국제상 영향력이 점차 약화하였고 내부 기강도 해이해져 갔다.
==> 토목의 변. 두 황제가 옹립하는 혼란. 강성한 몽골 세력

그 후, 16세기에 이르러 환관의 발호로 정치가 혼란해지고 전국이 반란의 소용돌이에 휩싸일 만큼 크게 동요하였고 이 무렵에 기세를 떨치기 시작한 왜구 집단은 명의 변경 해안 지대를 휩쓸었다.

이에 명은 북방으로는 몽골족의 침입을, 남방으로는 왜구의 침입을 막아서 양방에서 싸워야만 했으며, 이런 외부 압력은 자연히 국력 쇠퇴를 가속화하는 요인으로 작용하였다.
==> 북로남왜

그러다가 만력제가 등극하면서 10년간은 장거정을 비롯한 대정치가가 등장하여 다시 중흥하는 기회를 맞았으나 장거정이 죽자 만력제는 국사를 돌보지 않고 정사를 환관에게 일임해 정치는 혼란에 다시 빠졌으며, 영하(寧夏)에서 일어난 몽골의 항장(降將) 보바이의 반란과 귀주의 토관(土官) 양응룡(楊應龍)의 난을 평정해야 했고 후에는 임진왜란으로 조선에 원군을 보내려고 국력을 소모하게 되었다.
==> 7만명의 병력



전황

임진왜란

교섭이 결렬되자 도요토미 히데요시는 1592년 5월 23일(음력 4월 13일) 군대 약 20만을 조선으로 파병해 침공하였다. 이날 정발이 지키는 부산진성송상현이 지키는 동래성이 일거에 함락되었다. 6월 3일(음력 4월 24일) 순변사 이일이 상주에서 일본군에서 패하고 10일 만에 경상도가 넘어갔다. 6월 7일(음력 4월 28일) 도순변사 신립이 충주의 탄금대에서 일본군에게 대패하고 전사하였다.
==> 부산진성, 동래성이 거의 유일한 대응... 이후 거의 일방적 후퇴
==> 상주 군관부 이일 패배
1592년 임진왜란이 발발하자 왜군을 막기 위해 상주로 내려가려 했으나 이일이 이순신을 모함한 사실 때문에 이일은 군관들로부터 평가가 좋지 못했고 그래서 모두들 이일의 부장이 되려고 하는 것을 꺼려했다. 결국 이일은 장기군관 50명을 이끌고 병력은 현지에서 징집하기로 해서 상주에서 전투를 벌였으나 징집도 제대로 이루어지지 않은 데다가 그나마도 이일을 따라 온 장기군관 50명 중 20명 이상이 도주하여 크게 패했다. 원래 5000명 이상 징집해야 왜구를 막을 수 있었으나 이일이 징집한 병력은 고작 800명 수준이였으며 그나마 그 병력도 전투가 시작되면서 조금씩 도망쳐 실제로는 훨씬 적은 병력이였다. 이후 이일은 충주에 주둔한 신립(申砬)의 군대로 도망쳤다. 
==> 신립 장군이 탄금대에서 패배

일본군의 작전은 육군은 종래 일본 사절단이 조선에서 이용하던 세 길을 따라 북진하고 수군은 조선 남해와 황해를 돌아 물자를 조달하면서 육군과 합세하는 것이었다. 고니시 유키나가를 선봉으로 하는 제1군은 부산·밀양·대구·상주·문경 등을 거쳐 충주에 이르고 제2군은 가토 기요마사가 인솔하여 울산·영천 등을 거쳐 충주에서 제1군과 합세하여 한양으로 진군하였으며, 구로다 나가마사의 제3군은 김해를 지나 추풍령을 넘어 북진하였다. 일본군이 노도처럼 북진해 오자 조선 왕실과 조정은 수도 한양을 버리고 북쪽으로 도주하여 분노한 백성이 궁궐과 전적을 태워버렸다.
==> 일본군의 작전은 세 길의 육로로 진군하고
==> 황해도로 수군이 보급하는 작전

6월 11일(음력 5월 2일) 일본군 제1군과 제2군은 개전한 지 20일 만에 충주·여주·양근 등을 거쳐 한양을 점령하여 본거지로 삼았고 6월 26일(음력 5월 17일) 도원수 김명원을 임진강 전투에서 격파하고서 군을 나눠 고니시 유키나가의 군대는 평안도로, 가토 기요마사의 군대는 함경도로, 각각 한반도 북부까지 진격하였다. 7월 21일(음력 6월 13일)에 평양이 함락되었다. 다급해진 선조는 의주로 피신했다.
==> 한양 함락(한달 만에). 평양 함락(두달 만에). 함경도(가토 기요마사)

수많은 전장에서 단련된 백전노장인 일본군은 전쟁 경험이 풍부하였고 잘 훈련되고 조직되었지만, 조선군은 군비가 제대로 갖추어져 있지 않았으며 실전 경험도 전무했다. 조선이 전쟁 가능성이 있다는 소식을 듣고 대책을 마련하였다고는 하나 오랜 기간 평화를 누리던 남부 지방에서는 심히 반발하였다. 결국, 병사들이 일본군이 진격해 온다는 급보를 듣고 탈영하는 사태도 빈번하였다. 일례로 일본군이 침공한다는 소식을 들은 이순신의 부하 포졸인 황옥현은 탈영하다가 이순신에게 적발되어 참수당하기도 했으며, 대규모 총력전을 경험하지 못했으므로 당시에는 전시 계획은 있었으나 그 실행하는 과정에서 많은 문제를 드러냈다. 예컨대 대구에는 전시 계획대로 군대가 소집되었어야 했으나 일본군의 고속 돌파로 말미암아 경장 이일이 도착하기도 전에 전역에 일본군이 진입하였고 백성과 수령도 뿔뿔이 도망친 뒤라서 일본군의 침공에 대비하여 급조한 대구읍성은 방어에 쓰이지도 못하고 버려졌고 이일은 자신이 지휘할 군대를 보지도 못하고 상주에서 일본군과 전투하기도 전에 패해서 도망쳤다.
==> 제승방략 전술의 실패

조선/명 - 일본군의 진로
일본 선발대 - 구로다
평양 - 고니시 유키나가(소서행장)
함경도 - 가등청정



일본군의 당황(?)
당시 일본에서는 성이 함락되면 성주는 할복하고 성에 사는 주민은 항복하여 해당 지역이 평정되는 것이 전쟁에서 기본 방식이었는데 조선은 왕이 도성을 버리고 도망치고 각지에서는 백성이 저항했다. 고려의 현종, 고종, 공민왕도 이러한 방식으로 불리한 형편을 타개했으므로 조선 백성은 별로 충격받지 않았지만, 일본군 입장에서는 굉장히 당혹스러워했고 백성이 정복자에 대항하는 실정에도 충격받았다. 일본에서 백성이란 단순히 거주를 이전하는 자유도 없는 영지에 부속된 농노나 전리품으로서 성격이 강했기 때문이다. 일본은 이런 차이를 모른 채 정복한 조선에서 보급과 급료 등 비용을 충당할 예정이었으므로 일본군의 기본 계획에 큰 차질을 빚는다.
==> 일본에서는 백성이 단순히 다이묘들의 전리품
==> 조선에서는 왕이 도망가고 백성이 저항하는 형편... 계획에 차질

임진왜란 승패 (일본 학자)



조선군의 반격
일본군은 정명가도의 목적으로 조선에 들어 왔고... 점령한 백성들을 전리품 삼아 군수 지원을 받아 명으로 입성할 계획이었으나
일본군이 지나간 주요 보급로가 의병들에 의해 공격 받고... 특히 수군에 의해 해군 보급이 원활하지 못해 어려움 ==> 평양성에 장기 대기

조정에서는 그와 함께 또 하나의 조정인 분조를 꾸렸는데 평양에서 왕세자로 책봉된 광해군이 이를 이끌고 각지를 돌아다니면서 의병 봉기를 촉구하고 의병 부대를 국가의 정식 군대로 인정하였다. 이는 조선이 병농일치의 군사제도를 시행하였으므로 당연한 절차였고 의병장에게 관직을 주고 무과에 급제하고 현감 이상 관직이 있는 관리로서 대우해줬지만, 의병장을 대상으로 하는 관직 제수와 우대는 기존 무과 급제를 이용해 정식으로 장수가 된 자들과 알력을 일으켰는데 이런 알력이 첨예화하여 폭발한 것 중 하나가 김덕령 사건이다. 한편으로 공명첩으로써 군량미를 모으고 근왕군을 모집하기도 했다. 광해군이 분조를 이끌고 활발히 활동하는 것을 전해 들은 각지 사대부와 백성은 광해군을 따르고 근왕군에 참가하려고 찾아왔다. 광해군은 근왕병을 모집하고 군량미를 확보하였으며 민심을 안정시켰다. 이에 명나라 장군들도 광해군을 극찬하였다.

의병들은 곳곳에서 일본군의 보급로와 통신망을 차단하여 일본군을 곤란에 빠뜨렸다. 의병의 봉기로 민심은 차츰 제자리를 찾게 되었으며 조선 관군도 재기할 시간을 벌었다.

1592년 또한, 이순신이 이끄는 조선 수군은 압도하는 화력과 탁월한 전술을 이용하여 일본 수군을 음력 5월 사천 해전에서, 음력 6월 당포 해전에서, 음력 7월 한산도 대첩에서 패퇴시키고 제해권을 장악하였다. 일본군은 보충 병력과 군수품 수송이 어려워져 곤경에 빠지게 되었다. 명(明)에서 온 원군의 활약과 조선 수군과 의병의 활동은 조선에 불리하였던 전세를 소강(小康)하게 하는 원동력이 되었다.

해전(이순신)




정유재란
일본군은 보급이 제대로 이뤄지지 않은 탓에 전황이 불리해지자 화의에 나섰다. 명군도 벽제관 전투에서 패한 후 자국의 이해를 우선시하여 종전을 원했으므로 화의 교섭이 시작되었다. 조선 왕과 신료들은 삼국 중에서 가장 많이 피해(被害)하였다면서 화의를 반대하여 교섭에서 제외되었다. 교섭이 진행되는 동안 조선 조정은 군사제도를 능률이 많이 나게 개편하고 의병 부대를 관군으로 편입시키는 등 방비를 강화해 나아갔다. 일본군은 남해안으로 철군하여 왜성을 축조하고 전투를 중단한 채 주둔하였다.

명(明)과 일본군 양측은 서로 자국이 유리한 처지에서 화의를 교섭하려고 하였다. 일본군은 명 황녀(皇女)를 일본의 후비(後妃)로 삼을 것, 한반도의 남부 4도를 내줄 것, 감합 무역을 부활할 것, 조선 왕자와 대신 12명을 인질로 삼을 것을 명에 요구하였으나 일본군이 한 요구는 대부분 수용되지 않았고 3년에 걸친 화의 교섭은 결국 결렬되었지만, 협상하는 과정에서 포로가 된 조선의 두 왕자는 일본군이 조선 왕실에 돌려주었다.

남해안에 주둔해 있던 일본군은 1597년 다시 전쟁을 시작하였다.

고니시 유키나가는 정유재란이 발발하자 제 2군 사령관으로 다시 참전. 유키나가가 제 1진으로 참전했던 임진년과는 달리, 앙숙인 가토 기요마사가 제 1진으로 건너가게 되었고, 그러자 고니시 유키나가는 요시라를 경상우병사 김응서에게 보내어 가토군의 도해 정보를 보내주었다. 하지만 이순신은 적군이 보내준 정보라 믿지 않아 공격하지 않았고, 조정에서 다시 공격 명령을 내렸을 때는 이미 가토군이 부산에 상륙한 뒤였기에 이순신은 공격 명령을 다시 거부했다.[2] 그러자 조정은 이순신을 파면하고 대신 원균을 삼도수군통제사의 자리에 앉혔다. 그러나 이순신의 후임으로 임명된 원균은 이런저런 핑계를 대며 출전하지 않았고, 보다못한 도원수 권율이 원균에게 태형을 가해 원균을 출전시켰다. 이후 칠천량 해전에서 조선군은 대패하였다.
==> 고니시 유키나가의 정보 or 계략으로 이순신이 투옥되고 원균이 수군통제사가 되었다가 칠천량 해전에서 대패

일본 수군은 칠천량 해전에서 조선 수군을 전멸시켰고 일본 육군은 임진년 침공과 다르게 보급로를 탄탄하려고 전라도를 점령한 후 한양을 공격하기로 한다.

당시 일본 수군은 이순신의 파직과 원균의 칠천량 해전 대패로 말미암아 남해안 대부분의 재해권을 장악하였고 일본 육군은 1597년 9월 25일(음력 8월 15일), 9월 29일(음력 8월 19일) 남원 전투, 전주성에서 조명 연합군을 대파하고 남원과 전주를 함락시킨 일본 육군은 전라도를 점령하고 충청도 직산까지 진격하여 명군과 대치하기에 이른다.
...
이 때 도요토미 히데요시가 죽자 왜군은 결국 이를 극비에 부치고 본국으로 철수하기 시작하였다. 이순신은 노량에서 철수하는 왜군을 쫓아 함대를 대파하여 승리했으나 전투 중에 전사하였고 왜군은 전투에는 패배했으나 본국으로 철수에는 성공하여 임진왜란은 종전하였다. 여기서 철수에 성공했다 뜻은 고니시 유키나가를 위시한 주요 지휘관이 무사히 본국으로 귀환했다는 의미이고 일반 병졸들은 철수에 실패한 인원도 많았다.

==> 이로 인해 일본에서는 도요토미 정권이 무너지고 도쿠가와 이에야스에 의한 에도 막부시대 시작



유럽

유럽은 세계의 변방
대항해 시대까지도 유럽은 세계의 변방
유럽이 아시아에 진출했던 상황에서도 동남아나 필리핀 등지를 식민지화 했을 뿐 중국이나 조선, 일본 식민지화는 불가능
아편전쟁쯤에야 유럽의 총생산이 중국 초월
따라서 당시 군사력 면에서 일본이 세계 최강이라 할만한 상황... (화승총 30만 정)




각국의 전력 및 무기/전법

임진왜란은 유럽에서 전래된 화승총이 계기가 된 전쟁이라 볼 수 있음
조총(3교대 사격 전술)에 의해 오다 노부나가가 다케다의 기병 부대를 궤멸시킨 나가시노 전투는 전국시대의 전황을 바꿔 놓음
전국 시대를 통일한 토요토미 히데요시(오다 노부나가의 부하)가 국내 다이묘들의 불만과 관심을 돌리기 위한 전쟁


일본 군사력
일본이 임진왜란 초반 투입한 군사력은 낮게 잡아도 16만명을 한방에 투입합니다. 16만명...  그런데 군사력에서 숫자도 중요하겠지만, 이 병사의 질도 따져봐야합니다. 임진왜란 당시 전 세계적으로 15만명 이상의 병사를 동원할 수 있는 나라 자체가 얼마 없었습니다. 특히 동북아시아의 국가는 명나라와일본이라고 해 두어야겠네요. 그런데 국운이 기울었던 명과는 달리 일본의 당시 16만명은 얼마전까지 실전 전투를 치뤄낸 경험이 풍부한 베테랑들이었습니다. 

일본은 포르투갈 상인에게 입수한 조총을 개조해 전국시대가 끝날 무렵 30만정을 보유...
이는 전 유럽 국가들이 가지고 있던 화승총보다도 많은 숫자 ==> 유럽도 16세기에는 화승총이 주력 무기라 할 수 없었음
성능은 우수하면서도 가격은 1/10인 세계 최고 수준의 화기




조선의 전략
각 거점별로 군사력을 가지고, 그 군사력에 대한 책임자를 임명해 두는 것이었습니다. 그러면, 한 거점이 무너져도 다음 거점이 시간을 벌 수 있는 것인데요. 문제는 이 진관법은 살짝 경제적으로 부담이 된다는 단점이 있습니다. 앞서도 이야기했지만, 국가 재정이 문제를 가지기 시작한 이후, 위 진관법은 오히려 단점이 될 수 있습니다. 즉, 각 거점이 각개격파로 무너져버릴 수 있는 위험이 있지요. 


제승방략 체제라는 것은 문제가 생기면 각 거점의 군사가 미리 지정된 장소로 모이고, 그 동안 중앙에서 지휘관을 파견하는 형태입니다. 그렇게 해서 규모가 큰 적에 대처하는 방식입니다. 조선은 육군은 위의 제승방략의 방법을 체택합니다. 그러나 수군은 숙련도가 필요하기 때문에 진관법을 그대로 유지합니다. 이 제승방략 체제는 토요토미 히데요시 이전의 왜구에게는 그래도 잘 동작했던 모양입니다. 그러나 토요토미 히데요시 이후의 일본 정국이 어떻게 변화했는지 조선을 알 지 못햇습니다. 즉 위 제승방략 체제에 헛점이 발생한 것입니다.
즉, 경상도 상주지역인데요. 한양에서 지휘관(이일)을 파견하기 전 삼도의 군사는 이미 상주지역에 모여있었다고 합니다. 문제는... 지휘관이 도착하기전에 일본군이 먼저 도착한 것이지요. 그렇게 해서 남쪽의 군사력은 괴멸되 버립니다. 이때문에 조선은 계속 한발짝 늦은 대책을 세우게 되었던 것이지요. 결론적으로 전군의 괴멸로 이어져버립니다.

==> 수군의 경우 전라 좌/우수영, 경상 좌/우수영, 충청 수영 (==> 3도 수군 통제사)



조선/일본의 국력
==> 국력 군사력에서 일본이 우위. 특히 군사력은 비교가 되지 않을 정도

@ 임진왜란 (또는 일본의 文禄・慶長の役) 당시 조선과 일본의 국력 (농업 생산량)과 군사력 @

* 일본의 실제 연간 농업생산량: 총 1,850만석 (검지/태합검지로 상당히 정확함)
-> 이 중 히데요시의 오사카/관서 직할 220만석, 이에야스의 에도/관동 직할 256만석 포함
-> 당시 일본은 1만석 당 250~300명의 무사를 관직으로 사관시킬 수 있었음

* 일본의 총 군사력: 총 직업 무사 수 800,000명 (이에야스에게 6남 타다테루가 조사 후 보고함)
-> 800,000명 중 462,500명~555,000명은 정식으로 사관, 나머지는 낭인으로 예비대

* 1592년 조선파견군의 규모: 총 330,000명
-> 허나 이 중 9군 총 160,000명만 임진왜란 시 투입됨. 후일 정유재란 시엔 140,000명 파견됨
-> 나머지 170,000명은 나고야성과 각 영지에서 대기 중이었음
-> 참고로 명/조선의 침공 전진기지인 나고야 성은 200,000명의 파견군 동시 주둔이 가능함

* 당시 일본의 인구: 1,200만~1,800만 또는 최대 2,000만
* 당시 조선의 인구: 700만~1,000만 또는 최대 1,400만

* 조선의 평화시 연간 최대 농업생산량: 총 11,916,186석 (약 1,200만석)
-> 일본 측의 침공 전 사전조사로 상당히 정확했을 것입니다. 침공과 이후의 지배가 장난이 아니기에..
-> 대략 조선반도 내에는 최대 250만결이 가능한 농토로 조사되었으나, 임란 직전까지 1/5인 50만결의 농토가
    파손되었기에 실제로는 1592년 당시엔 연간 1,000만석이 안 될 가능성이 높다고..

-> 경상도 2,887,790석 (모리 테루모토 영지), 전라도 2,269,379석 (코바야카와 영지 예정),
    충청도 987,514석 (후쿠시마 마사노리 영지), 경기도 775,133석 (우키다 히데이에 영지)
    강원도 402,289석 (시마즈 요시히로 및 모리 요시나리 영지), 황해도 728,869석 (쿠로다 나가마사 영지)
    평안도 1,794,186석 (코니시 유키나가 영지 예정), 함경도 2,071,028석 (가토 키요마사 영지)
==> 각 영지별로 진격했음... ^^

* 조선의 임란 직전 총 군사력: (문제많은) 군적 상 총 145,620명
-> 이중 정예군인 갑사, 시위 등은 23,620명 -> 허나 이 중 군사는 7,920명. 비군사인 보인은 15,700명
-> 조선 1594년 유성룡의 '시무차자' 보고서에 의한 정확한 수치임


==> 여기에 더불어 이순신 장군은 사전에 우리나라 바다에 대한 지리를 잘 파악하고 있었다
==> 그것을 활용한 대표적인 예가 바로 한산도, 명량 대첩이다
==> 그리고 근접전 대신 화포(대포)를 쉽게 장착할 수 있는 비교적 큰 판옥선은 운용
==> 소나무의 강도도 삼나무/전나무로 만든 일본 배에 비해 훨씬 강해... 충돌시 유리
==> 일본의 주력 전함이었던 세키부네는 강도가 약하고 규모가 작아 대규모 화력을 싣기 어려움. 대부분 궁수, 조총부대



전쟁 결과

명은 대군을 조선에 파병하여 국력을 소모시켰으므로 국가 재정이 문란하게 되었다. 당시 명은 만력제가 재위 중이였다. 그는 초반에는 선정을 베풀었으나 후반에 들어서면서 국정을 게을리하고 낭비를 일삼았다. 특히 조선 출병까지 포함된 '만력3정'으로 대표되는 과도한 원정으로 재정은 고갈되어갔으며 자신의 무덤을 건설하기 위해서 만력3정에 소요된 경비보다도 많은 은자 800만냥을 지출하여 세금은 늘어나는데도 명의 재정은 더욱 궁핍해졌다.

그러나 명나라의 쇠망 혹은 멸망이 임진왜란이라는 단일한 사건만이 중대하게 작용하여 일어났다는 해석은 임진왜란의 여파가 일본에는 상대적으로 작게, 타국에는 상대적으로 과장하여 크게 일어났다고 보는 일본중심사관이 뿌리뽑히지 못한 결과라고 할 수 있다. 실제로 일본에서는 임진왜란 패퇴 직후 도요토미 정권이 붕괴했지만, 명나라는 임진왜란 이후에도 50여년 가까이 유지되었다.

명-청 전쟁
청나라(여진족)의 북방 통일 (거란, 몽골족)
명나라와 후금/청 간 전쟁 중 이자성의 난으로 명나라가 무너짐
천해의 요새로 불리던 산해관(기병 위주의 청군이 돌파하기 어려운 곳)을 지키던 오삼계가 이자성의 난을 계기로 청에 투항 (결정적인 사건)


일본
조선에 출병한 다이묘들은 대부분 도요토미 가문에 충성하던 자들(카토 키요마사, 후쿠시마 마사노리 등)이었고 히데요시에게 태도가 미적지근하거나 서로 협력해 우조하지 않았던 다이묘들(도쿠가와 이에야스 등)은 불참하는 등 불협화음으로 7년을 이어오다가 히데요시 사후 도요토미 군대는 조선을 철수, 몇년 후 도요토미 정권은 전복(1600년-세키가하라 전투, 1615년-오사카 전투), 도쿠가와 정권 즉, 에도 막부(1603년)가 들어서게 된다.




'역사' 카테고리의 다른 글

임진왜란 각종 자료 조사  (0) 2014.12.17
중종반정 - 혁명이라 할 수 있을까  (0) 2014.12.05
Posted by Hey Jerry









Posted by Hey Jerry