- 참고: https://www.youtube.com/watch?v=ynmlXEH_d9c&list=PLD5ojEfJUayNmTeDDdRzQgqlb7A3QrijM&index=2

 

[문명]

- 청동기 사용. 계급 발생. 도시 발생. 국가 발생. 문자 사용.

 

<4대 문명>

1. (황허강 주변) 중국 문명

2. (갠지스강 서쪽에 있는 인더스강 주변) 인도 문명

3. (유프라테스강, 티그리스강 사이) 메소포타미아 문명

4. (나일강 주변) 이집트 문명

 

> 공통점: 큰강유역(온화한 기후. 교통 편리. 물자 풍부.)에서 발달

 

 

 

<메소포타미아> => 가장 오래된 문명

- 유프라테스강과 티그리스강 사이

- 비옥한 초승달 지대 => 메소포타미아 지역

- 수메르인들이 발생 시킴

- 바빌로니아 => 수메르인들이 세웠던 가장 잘나갔던 나라

  ㄴ최고 전성기의 왕은 함무라비 왕 => 함무라비 법전

                                                                ㄴ보복주의

                                                                ㄴ신분에 차별적으로 적용

  ㄴ히타이트 민족에 의해 멸망 당함 => 수메르인들은 청동기 사용. 히타이트는 철기 사용.

 

 

<메소포타이아 문명 vs 이집트 문명>

- 서로 정반대의 문명 => 지형 때문이다. 

- 이집트는 폐쇄적 지형. 왕조 안정. 통일왕조. 내세적 삶 중시(증거: 미라, 스핑크스, 피라미드, 사자의 서).

- 메소포타미아는 개방적 지형. 전쟁 빈번. 흥망 빈번. 왕조 교체 빈번. 현세적 삶 중시.

- 이집트와 메소포타미아는 둘 다 실용적 학문(수학이나 건축 등)이 발달.

- 이집트는 측량술, 기하학, 수학, 건축이 발달. => 농업, 실용적 학문이 발달. 10진법 발달. 태양력 사용.

- 메소포타미아는 60진법 발달. 태음력 사용.

 

 

 

<페니키아 문명>

- 아프리카와 이탈리아 사이에 있는 지중해의 동쪽에 위치.

- 동서 지중해 무역 발달 => 부유해지고 카르타고를 식민지로 가짐.

- 페니키아 문자 사용 => 알파벳의 기원

 

 

<헤브라이 문명> => 유대인 국가 => 유대교(크리스트교, 이슬람교가 파생됨) 발달. => 유일신 사상

 

 

<인도 문명>

- 갠지스강 서쪽에 있는 인더스강 주변

- 인도의 원주민들이 탄생 시킴.

- 도로, 상하수도, 공중목욕장 => 도시문명 발달 => '모헨조다로', '하라파라'라는 도시가 있었음.

- 북서쪽에 있었던 아리아족에 의해 파괴됨. => 철기 사용.

- 현재, 인도에 가면 아리아족만 볼 수 있음. 인도의 원주민들은 갠지스 강으로 이동.

- 아리아족이 인도의 원주민들을 지배하기 위해 갠지스강으로 진출.

  ㄴ카스트 제도 

      ㄴ브라만(승려 => 지배계층)

      ㄴ크샤트리아(무사, 귀족 => 지배 계층)

      ㄴ바이샤(평민 => 피지배 계층)

      ㄴ수드라(천민 => 피지배 계층)

  ㄴ브라만교 => 자연물 숭배. 베다 찬송가. 신분 차별(카스트 제도) 인정.

 

 

<중국 문명>

- 황허강 주변 => 비옥한 황토지대

- 청동기 사용

- '상' 나라 (= '은' 나라)

   ㄴ신권정치 => 증거: 갑골 문자 => 한자의 기원

- '주' 나라

   ㄴ봉건제(중앙은 왕이 지배. 지방은 제후가 지배.) 시행. 

       ㄴ혈연 관계 (서양에서의 봉건제는 왕과 제후가 계약 관계.)

       ㄴ왕권 약화

       

 

'History' 카테고리의 다른 글

삼국의 문화와 대외 교류  (0) 2019.10.24
삼국의 발전과 가야  (0) 2019.10.22
삼국의 성립  (0) 2019.10.21
고조선과 여러나라의 성장  (0) 2019.10.21
인류의 출현과 선사 문화의 발전  (0) 2019.10.21

- 참고: https://www.youtube.com/watch?v=4avjkMnWLPc&list=PLD5ojEfJUayNmTeDDdRzQgqlb7A3QrijM&index=1

[역사]

1. 사실로서의 역사: 

    - 사실 그 자체, 역사가의 해석X, 객관적

2. 기록으로서의 역사: 

    - 역사가의 해석ㅇ, 선택된, 주관적

    - 역사란 과거와 현재의 대화이다.

 

# 사료: 과거에 일어난 흔적(유물, 유적, 문자기록)

 

 

 

[인류의 기원]

- 동물 vs 인간: 인간은 직립보행, 언어, 문자, 불 사용

 

<인류의 진화>

1. 오스트랄로피테쿠스, 아파렌시스: 최초의 인간. 약 390만년 전 출현. 직립보행. 도구 사용.

2. 호모 에렉투스(베이징, 자와인에서 뼈 발견): 약 180년 전 출현. 불과 언어 사용.

3. 호모 네안데르탈렌시스: 약 50만년 전 출현. 시체 매장(사후 세계).

4. 호모 사피엔스:  현생 인류(크로마뇽인)

                                              ㄴ동물 벽화: 사냥의 풍요 기원 => 주술적

                                              ㄴ비너스상: 퐁요와 다산의 기원 => 주술적

 

<석기시대>: 돌과 나무 사용

1. 구석기

- 뗀석기(주먹 도끼, 찍개, 찌르개 => 사냥 도구) 사용

- 사냥과 채집

- 계절에 따라 이동생활

- 동굴, 막집 생활

- 무리생활

 

 

1.5.1. 빙하기

1.5.2. 후빙기(간빙기)

 

 

2. 신석기

- 간석기(돌삽, 돌괭이 => 농경 도구) 사용

- 농경과 목축의 시작 => 신석기 혁명

- 정착생활

- 움집

- 빗살무늬 토기 => 강가, 해안가에 살면서 농사 지으며 살았다는 증거

- 씨족/부족/부락 마을

- 뼈바늘, 가락바퀴 사용 => 의복, 그물을 만들었다는 증거

- 신앙

   ㄴ애니미즘: 자연물(해, 달, 산, 강)에 영혼이 깃들어 있다는 믿음

   ㄴ토테미즘: 동물 숭배

   ㄴ샤머니즘: 무당의 존재를 믿음

 

 

 

'History' 카테고리의 다른 글

삼국의 문화와 대외 교류  (0) 2019.10.24
삼국의 발전과 가야  (0) 2019.10.22
삼국의 성립  (0) 2019.10.21
고조선과 여러나라의 성장  (0) 2019.10.21
문명의 발생과 국가의 형성  (0) 2019.10.21

출처: https://m.blog.naver.com/PostView.nhn?blogId=platinasnow&logNo=220032855280&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

@Component, @Service, @Repository, @Controller는 bean으로 등록하고 싶은 것에 사용되는 annotaion이다. 역할을 확실하게 명시하기 위해 사용되며, AOP의 Pointcut에서 annotaion 단위로 지정할 수 있기 때문에 유용하게 사용될 수 있다.

 

@Component Presentation Layer에서 Controller를 명시하기 위해 사용.
@Service Business Layer에서 Service를 명시하기 위해 사용.
@Repository Persistence Layer에서 DAO를 명시하기 위해 사용.
@Component 위의 용도 외에 bean으로 등록하고 싶은 것에 사용.

'IT > Spring Framework' 카테고리의 다른 글

@Transactional Rollback 조건  (0) 2020.03.19
@Transactional 사용 목적  (0) 2019.10.24
Netty 개념  (0) 2019.01.19
ORM, JPA, Hibernate란?  (0) 2018.02.14
서블릿(Servlet)과 JSP(Java Sever Pages)  (0) 2018.02.14

참고: 

- 『네티 인 액션』 (노먼 마우러, 마빈 알렌 울프탈 지음. 최민석 옮김.)

 

 

Netty: 

- 비동기식 이벤트 기반의 네트워크 애플리케이션 프레임워크

- 모든 구현이 Channel, ChannelPipeline, ChannelHandler 인터페이스를 기준으로 정의된다.

- 네티가 제공하는 전송:

  ㄴ NIO: 논블로킹 입출력. selector 기반 방식.

  ㄴ Epoll: 논블로킹 입출력. 리눅스에서만 이용. NIO 전송보다 빠르고 완전한 논블로킹.

  ㄴ OIO: 블로킹 스트림 이용.

  ㄴ 로컬(Local): VM에서 파이프를 통해 통신하는 데 이용.

  ㄴ 임베디드(Embedded): 실제 네트워크 기반 전송 없이 ChannelHandler를 이용할 수 있게 해줌. ChannelHandler 구현을 테스트하는 데 유용.

 

 

Selector 클래스:

- 자바의 논블로킹 입출력 구현의 핵심으로서, 논블로킹 Socket의 집합에서 입출력에서 입출력이 가능한 항목을 지정하기 위해 이벤트 통지 API를 이용한다.

- 적은 수의 스레드로 더 많은 연결을 처리할 수 있으므로 메모리 관리와 컨텍스트 전환에 따르는 오버헤드가 감소한다. (적은 수의 스레드로 여러 연결에서 이벤트를 모니터링할 수 있게 해준다.)

- 입출력을 처리하지 않을 때는 스레드를 다른 작업에 활용할 수 있다.

 

 

Channel:

- 자바 NIO(비동기 입출력 방식)의 기본 구조.

- 정의: 하나 이상의 입출력 작업을 수행 할 수 있는 하드웨어 장치, 파일, 네트워크 소켓, 프로그램 컴포넌트와 같은 엔티티에 대한 열린 연결.

- Socket에 해당.

 

- Channel의 메소드:

  ㄴ eventLoop()

  ㄴ pipeline()

  ㄴ isActive()

  ㄴ localAddress()

  ㄴ remoteAddress()

  ㄴ write()

  ㄴ flush()

  ㄴ writeAndFlush()

 

 

 

EventLoop: 

- 용도: 제어 흐름, 멀티스레딩, 동시성 제어

- 하나 이상의 Channel에 할당 가능

 

 

ChannelFuture: 

- 용도: 비동기 알림

- 미래에 실행될 작업의 겨로가를 위한 자리표시자라고 생각할 수 있다.

- ChannelFutureListener 인스턴스를 하나 이상 등록할 수 있는 추가 메소드가 있다. 작업이 완료되면 리스너의 콜백 메소드인 operationComplete()이 호출되며, 이 시점에 리스너는 작업이 정상적으로 완료됐는지, 아니면 오류가 발생했는지 확인할 수 있다.

- 네티의 모든 아웃바운드 입출력 작업은 ChannelFuture를 반환하며 진행을 블로킹하는 작업은 없다.

 

 

ChannelPipeline:

- 하나 이상의 ChannelHandler를 포함.

- 인바운드와 아웃바운드 핸들러를 동일한 파이프라인에 설치할 수 있다.

 

 

ChannelHandler:

- 인바운드와 아웃바운드 데이터의 처리에 적용되는 모든 애플리케이션의 비즈니스 로직의 컨테이너 역할을 하는 컴포넌트.

- 크게 ChannelInboundHandler, ChannelOutboundHandler로 나뉨.

- 4가지 이벤트 유형 포함.

 

 

ChannelHandlerContext:

- 이벤트를 현재 체인의 다음 핸들러로 전달할 수 있다.

 

 

EventLoopGroup:

- 하나 이상의 EventLoop를 포함.

 

 

Adapter:

- 해당 인터페이스에 정의된 모든 메소드의 기본 구현을 제공. 

 

 

Bootstrap:

- 프로세스를 지정된 포트로 바인딩하거나 프로세스를 지정된 호스트의 지정된 포트에서 실행 중인 다른 호스트로 연결하는 등의 일을 하는 애플리케이션의 네트워크 레이어를 구성하는 컨테이너.

- 서버 부트스트랩(ServerBootstrap): 프로세스를 지정된 포트로 바인딩하는 애플리케이션의 네트워크 레이어를 구성. 들어오는 연결을 수신하는 동작.

- 클라이언트 부트스트랩(Bootstrap): 프로세스를 지정된 호스트의 지정된 포트에서 실행 중인 다른 호스트로 연결. 하나 이상의 프로세스로 연결하는 동작.

 

 

Bootstrap vs ServerBootstrap

- 네트워크 기능: 원격 호스트와 포트로 연결 | 로컬 포트로 바인딩

- EventLoopGroup의 수: 1 | 2

 

 

Unpooled.wrappedBuffer() vs Unpooled.copiedBuffer()

ㄴ참고: https://m.blog.naver.com/PostView.nhn?blogId=lunajina&logNo=220125068423&proxyReferer=https%3A%2F%2Fwww.google.com%2F

ㄴ참고: https://koda93.github.io/Netty%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88(ByteBuf)

- Unpooled.wrappedBuffer() : 새 복합 버퍼(composite buffer)를 생성하며, 인자로 받은 content를 실제 복사하지는 않는다. 지정한 데이터를 래핑하는 ByteBuf 반환.

- Unpooled.copiedBuffer​() : 새 버퍼를 생성하여 인자로 받은 content를 복사한다. 지정한 데이터를 복사하는 ByteBuf 반환.

 

* CompositeByteBuf:

  ㄴ참고:  https://netty.io/4.0/api/io/netty/buffer/CompositeByteBuf.html

  ㄴ여러 버퍼가 병합된 가상의 단일 버퍼를 제공하는 ByteBuf의 하위 클래스.

  ㄴA virtual buffer which shows multiple buffers as a single merged buffer. It is recommended to use ByteBufAllocator.compositeBuffer() or Unpooled.wrappedBuffer(ByteBuf...) instead of calling the constructor explicitly.

 

 

 

애플리케이션을 위한 최적의 전송

 애플리케이션의 요건

 권장되는 전송

 논블로킹 코드 기반 또는 일반적 출발점

 NIO(또는 리눅스의 경우 epoll)

 블로킹 코드 기반

 OIO

 동일한 JVM 내의 통신

 로컬(Local)

 ChannelHandler 구현 테스트

 임베디드(Embeded)

 

 

전송과 네트워크 프로토콜 지원 (2016년 기준)

전송 

TCP 

UDP 

SCTP

(Stream Control Trasmission Protocol) 

UDT 

 NIO

 O

 O

 O

 O

 Epol(리눅스 전용)

 O

 O

 X

 X

 OIO

 O

 O

 O

 O

 

 

ByteBuffer:

- ByteBuffer: 자바 NIO의 데이터 컨테이너. 사용법이 복잡.

 

 

ByteBuf:

- 네티의 데이터 컨테이너.

- 읽기와 쓰기를 위한 고유한 두 인덱스를 제공한다. ByteBuf에서 데이터를 읽으면 읽은 바이트 수만큼 readerIndex가 증가하고, ByteBuf에 데이터를 기록하면 기록한 바이트 수만큼 writerIndex가 증가한다.

- 기본 읽기와 쓰기 작업 외에도 데이터를 수정하는 데 이용할 수 있는 다양한 메소드를 제공한다.

- ByteBuf는 readerIndex 위치, writerIndex 위치에 따라, '폐기할 수 있는 바이트' 영역, '읽을 수 있는 바이트 (내용)' 영역, '기록할 수 있는 바이트' 영역으로 분할될 수 있다.

- discardReadByte()를 호출하면 readerIndex는 0이되고, writerIndex는 감소하며, '폐기할 수 있는 바이트' 영역은 폐기 및 회수되고, '읽을 수 있는 바이트 (내용)' 영역은 버퍼의 시작 부분으로 옮겨지며(옮겨지기 위해 메모리 복사 필요), '기록할 수 있는 바이트' 영역은 확장된다.

- clear()를 호출하면 readerIndex와 writerIndex는 0이 되고, 메모리의 내용은 지우지 않으며, 전체 영역이 '기록할 수 있는 바이트' 영역이 된다. clear()는 인덱스만 재설정하므로 discardReadBytes()에 비해 실행 비용이 훨씬 낮다.

- 읽기/쓰기 작업은 두 가지 범주가 있다:

  ㄴget() 및 set() 작업은 지정한 인덱스에서 시작하며 인덱스를 변경하지 않는다.

  ㄴread() 및 write() 작업은 지정한 인덱스에서 시작하며 접근한 바이트 수 만큼 인덱스를 증가시킨다.

 

 

ByteBuf 사용 패턴:

- 힙 버퍼(heap buffer): 

  ㄴByteBuf에 보조 배열(backing array)이 있으면 힙 버퍼. 

  ㄴJVM에 힙 공간에 데이터를 저장. 

  ㄴ이 패턴은 풀링이 사용되지 않는 경우, 빠른 할당과 해제 속도를 보여줌.

  ㄴ레거시 데이터를 처리하는 경우에 적합.

- 다이렉트 버퍼(direct buffer): 

  ㄴByteBuf에 보조 배열이 없으면 다이렉트 버퍼.

  ㄴ다이렉트 버퍼의 내용은 일반적인 가비지 컬렉션(GC)이 적용되는 힙 바깥에 위치한다. 다이렉트 버퍼가 네트워크 전송에 이상적이기 때문이다. 데이터가 힙 할당 버퍼에 있는 경우에는 JVM은 소켓을 통해 전송하기 전에 내부적으로 버퍼를 다이렉트 버퍼로 복사해야 한다.

  ㄴ힙 기반 버퍼보다 할당과 해제의 비용 부담이 약간 더 크다.

  ㄴ레거시 데이터를 이용하는 경우에는 데이터가 힙에 있지 않기 때문에 복사본을 만들어야 할 수 있다.

- 복합 버퍼(composite buffer): 

  ㄴ여러 ByteBuf의 집합적 뷰에 해당. 

  ㄴ네티는 여러 버퍼가 병합된 가상의 단일 버퍼를 제공하는 ByteBuf의 하위 클래스인 CompositeByteBuf를 이용해 이 패턴을 구현한다.

  ㄴ헤더와 본문의 두 부분으로 구성되는 메세지를 http를 통해 전송하는 경우에 CompositeByteBuf를 이용하면 메세지마다 두 버퍼를 다시 할당할 필요가 없어 편리하며, 공통 ByteBuf API를 노출할 때 불필요하게 복사할 필요가 없게 해준다.

  ㄴCompositeByteBuf는 보조 배열에 대한 접근을 허용하지 않을 수 있으므로 CompositeByteBuf의 데이터에 접근하려면 다이렉트 버퍼와 비슷한 방법을 이용한다.

  ㄴ네티는 CompositeByteBuf를 이용하는 소켓 입출력 작업을 최적화해 JDK의 버퍼 구현이 이용될 때 발생하는 성능과 메모리 소비 패널티를 최소화한다.

  ㄴCompositeByteBuf API는 ByteBuf로부터 상속받은 메소드 외에도 다양한 추가 기능을 제공한다.

 

 

파생 버퍼:

- ByteBuf의 내뇽을 특수한 방법으로 나타내는 뷰를 제공.

- 파생 버퍼의 내부 저장소는 JDK ByteBuffer와 마찬가지로 공유된다. 즉, 생성하는 비용은 낮지만 파생 버퍼의 내용을 수정하면 원본 인스턴스까지 수정된다는 데 주의해야 한다.

 

 

ByteBufHolder 인터페이스:

- 네티는 실제 데이터 payload와 함께 다양한 속성값을 저장해야 하는 경우에 대해 ByteBufHolder를 제공한다.

- ByteBufHolder는 ByteBuf를 풀에서 가져오고 필요할 때 자동으로 해제할 수 있는 버퍼 풀링과 같은 네티의 고급 기능도 지원한다.

- ByteBufHolder는 ByteBuf 안에 Payload를 저장하는 메세지 객체를 구현하려고 할 때 좋은 선택이다.

 

 

ByteBufAllocator 인터페이스:

- 네티는 메모리 할당과 해제 시 발생하는 오버헤드를 줄이기 위해 ByteBufAllocator 인터페이스를 통해 모든 종류의 ByteBuf 인스턴스를 할당하는 데 이용할 수 있는 풀링을 구현한다.

- ByteBufAllocator의 참조는 Channel에서 얻거나(각각 고유 인스턴스를 가짐) ChannelHandler에 바인딩된 ChannelHandlerContext를 통해 얻을 수 있다.

- 네티는 ByteBufAllocator의 구현을 PooledByteBufAllocator와 UnpooledByteBufAllocator로 제공한다. 네티는 기본적으로 PooledByteBufAllocator를 이용하지만 ChannelConfig API를 통하거나 애플리케이션을 부트스트랩할 때 다른 할당자를 지정할 수 있다.

  ㄴPooledByteBufAllocator: ByteBuf 인스턴스를 풀링해 성능을 개선하고 메모리를 단편화를 최소화하며, 여러 최신 운영체제에 도입된 jemalloc라는 고효율 메모리 할당 방식을 이용한다.

  ㄴUnpooledByteBufAllocator: ByteBuf 인스턴스를 풀링하지 않고 호출될 때마다 새로운 인스턴스를 반환한다.

- 네티는 ByteBufAllocator의 참조가 없는 상황에 대해 풀링되지 않는 ByteBuf 인스턴스를 생성하는 정적 도우미 메소드를 제공하는 Unpooled라는 유틸리티 클래스를 제공한다. Unpooled 클래스는 다른 네티 컴포넌트가 필요없는 네트워킹과 무관한 프로젝트에 ByteBuf를 제공해 확장성 높은 고성능 버퍼 API를 이용할 수 있게 해준다.

  

 

ByteBufUtil 클래스:

- ByteBuf를 조작하기 위한 정적 도우미 메소드를 제공한다. 이 API는 범용이며 풀링과는 관계가 없으므로 이러한 메소드는 할당 클래스와 무관하게 구현된다.

 

 

참조 카운팅(reference counting):

- 다른 객체에서 더이상 참조하지 않는 객체가 보유한 리소스를 해제해 메모리 사용량과 성능을 최적화하는 기법.

- 특정 객체에 대한 활성 참조의 수를 추적하는 데 바탕을 둔다.

- ReferenceCounted 인터페이스를 구현한 인스턴스는 일반적으로 참조 카운트 1을 가지고 시작하며, 참조 카운트가 1 이상이면 객체가 해제되지 않지만, 0으로 감소하면 인스턴스가 해제된다. 해제된 객체는 더이상 이용할 수 없게 된다.

- 참조 카운팅은 PooledByteBufAllocator와 같은 풀링 구현에서 메모리 할당의 오버헤드를 줄이는 데 반드시 필요하다.

- 특정한 객체가 각자의 고유한 방법으로 해제 카운팅 계약을 정의할 수 있다. 일반적으로 객체에 마지막으로 접근하는 측에 해제할 책임이 있다.

 

 

실시간 웹:

- 사용자 또는 사용자의 소프트웨어가 주기적으로 업데이트를 확인하지 않고도 저자가 정보를 게시하는 즉시 정보를 받을 수 있는 기술과 방식을 적용한 네트워크 웹을 의미한다.

 

 

웹소켓:

- 웹소켓 프로토콜은 웹의 양방향 데이터 전송 문제에 대한 실용적인 솔루션을 제공하기 위해 클라이언트와 서버가 언제든지 메세지를 전송할 수 있게 허용하고, 결과적으로 메세지 수신을 비동기적으로 처리하게 요구하도록 설계되었다.

 

참고: 

- http://aljjabaegi.tistory.com/387

- https://jeong-pro.tistory.com/148

- https://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

- https://hoonmaro.tistory.com/19



1. JAVA의 컴파일 과정

(1) Java Compiler(javac 명령어 실행)에 의해 Java Source(.java 확장자)로부터 Byte Code(.class 확장자)가 생성된다.


(2) JVM에 있는 Class Loader에 의해 Byte Code는 JVM내로 로드되고 실행엔진에 의해 기계어로 해석되어 메모리 상(Runtime Data Area)에 배치된다.


(3) 실행엔진에는 Interpreter와 JIT(Just-In-Time) Compiler가 있는데, Interpreter에 의해 Byte Code를 한 줄씩 읽어 실행하다가 적절한 시점에 Byte Code 전체를 컴파일하고 더이상 인터프리팅하지 않고 해당 코드를 직접 실행한다. 


JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에 한 번 컴파일된 후에는 빠르게 수행할 수 있다는 장점이 있습니다. 하지만 코드 전체를 컴파일하기 때문에 인터프리팅하는 것보다 시간이 오래 걸리므로 한 번만 실행해도 되는 코드에 대해서는 인터프리팅하는 것이 유리합니다.

- Interpreter : 자바 Byte Code를 한 줄씩 실행. 전체 성능면에서 불리.

- JIT Compiler : 전체 Byte Code를 컴파일하고 캐시에 보관해놓고 직접 실행. 한 번만 실행해도 되는 코드에 대해서는 Interpreter가 유리.




2. JVM 메모리 구조

(1) Heap Area: new 명령어를 통해 생성된 인스턴스와 배열 등의 참조형 변수 정보가 저장되는 공간입니다. 물론, Method Area에 올라온 클래스들과 관련된 것만 저장됩니다. GC(Garbage Collector)의 대상이 됩니다.


(2) Stack Area: 클래스 내의 메소드에서 사용되는 매개변수, 지역변수, 리턴값 등의 정보들이 저장되는 공간입니다. LIFO(Last In First Out) 방식으로 메소드 실행 시 저장되었다가 실행이 완료되면 제거됩니다. 임시 저장공간으로 생각하시면 됩니다.


(3) Method Area(Class Area 또는 Static Area): 클래스 관련 필드 정보, 메소드 정보, Type 정보(interface인지, class인지에 대한 구분), 상수(constant) pool, static 변수, final class 변수 등의 정보들이 저장되는 공간입니다.


(4) PC Register Area: 쓰레드마다 하나씩 생성되고 JVM 명령의 주소값이 저장되는 공간입니다.


(5) Native Method Stack Area: 자바 외 다른 언어의 호출을 위해 할당되는 영역입니다. 자바에서 C/C++의 메소드를 호출할 때 사용하는 Stack 영역이라고 생각하시면 됩니다.




예를 들어, getList(), insertList(), updateList(), deleteList() 등의 CRUD 메소드가 있는 ListController class가 있을 때 이 클래스와 메소드의 정보는 실행엔진에 의해 Method 영역에 올라가며, 클래스의 메소드 호출이 발생하면 Method 영역의 정보를 읽어 해당 메소드의 매개변수, 지역변수 리턴값 등이 Stack 영역에 올려져 처리됩니다. 그리고 메소드의 실행이 끝나면 Stack 영역으로부터 자동으로 제거됩니다.

만약, 메소드 내에 New 명령어로 생성한 인스턴스나 배열이 있을 경우, 해당 값은 Heap 영역에 저장되고, Stack 영역에는 이 Heap 영역의 값을 참조할 수 있는 메모리 주소값만 저장됩니다. 그래서 배열을 System.out.println(); 하게 되면 메모리 주소값이 출력됩니다.




3. JVM GC

자바에서는 메모리를 명시적으로 지정하여 해제하지 않기 때문에 Heap 영역의 메모리를 관리하는 Garbage Collector의 역할이 중요합니다.


- 자바8 이전의 Heap 영역은 아래의 그림과 같이 크게 세 영역으로 나뉘게 됩니다.

자바8부터는 Permanent 영역(Java Heap 영역 중 하나) 대신에 Metaspace라는 Native 메모리 영역에 저장됩니다.


● New(Young) Generation: 이 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 영역입니다. 시간이 지나 우선순위가 낮아지면 Old 영역으로 옮겨집니다. Young 영역으로부터 garbage를 수집하는 것을 Minor GC라고 합니다.

● Old(Tenured) Generation: Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역입니다. 이 영역으로부터  garbage를 수집하는 것을 Major GC라고 합니다.
● Permanent Generation(자바8부터는 Metaspace): 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 meta 정보가 저장되는 영역이며 JVM에 의해 사용됩니다. 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용됩니다. 내부적으로 리플렉션 기능을 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요합니다.


<Minor, Major GC>

Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당됩니다. 그리고 이 영역에 데이터가 어느정도 쌓이게 되면 참조 정도에 따라 Servivor1, Servivor2 중 빈 공간으로 이동되거나 회수됩니다. New Generation(Eden 영역 + Servivor1,2 영역) 영역이 차게 되면 또 참조 정도에 따라 Old영역으로 이동되거나 회수됩니다. 이렇게 New Generation과 Tenured Generation(Old 영역)에서의 GC를 Minor GC 라고 합니다.

 

Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 더이상 참조되지 않는 객체들을 전부 삭제하는 GC가 실행됩니다. 시간이 오래 걸리는 작업이고 이 때 GC를 실행하는 쓰레드를 제외한 모든 쓰레드는 작업을 멈추게 됩니다. 이를 'Stop-the-World' 라 합니다. 그리고 이렇게 'Stop-the-World'가 발생하고 Old영역의 메모리를 회수하는 GC를 Major GC라고 합니다. 앞에서 말한 것과 같이 Major GC가 실행되면 이것이 종료될 때까지 다른 모든 쓰레드가 멈추기 때문에 성능에 영향을 끼칠 수 밖에 없습니다.


<Minor GC vs Major GC vs Full GC>

ㄴ참고: https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc

1. Collecting garbage from Young space (consisting of Eden and Survivor spaces) is called a Minor GC.

2. Major GC is cleaning the Tenured space.

3. Full GC is cleaning the entire Heap – both Young and Tenured spaces.

  Unfortunately it is a bit more complex and confusing. To start with – many Major GCs are triggered by Minor GCs, so separating the two is impossible in many cases. On the other hand – many modern garbage collections perform cleaning the Tenured space partially, so again, using the term “cleaning” is only partially correct.

This leads us to the point where instead of worrying whether the GC is called Major or Full GC, you should focus to finding out whether the GC at hand stopped all the application threads or was it able to progress concurrently with the application threads.

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

상속(Inheritance) 개념  (0) 2018.11.11
Wrapper class 개념  (0) 2018.11.10
== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18

참고: https://www.youtube.com/watch?v=LSM9xTJsUfI



- 2009년 1월 3일 Satoshi Nakamoto에 의해 시작됨

- 디지털 분산형 암호화 통화

- 절대적으로 안전하고 빠르고, 익명성을 보장하고, 누구나/어디서나 사용가능하고, 수수료 없고, 지불거절 불가능

- 중앙기관 없음

- 마이닝: 네트워크를 구동하고 보호하며 거래를 확인하는 특수 컴퓨터를 보유한 다수의 사람들에 의해 구동됨

- 금처럼 희소성을 가짐

- 10분마다 비트코인 생산됨


1. AWS EC2 인스턴스 생성

   ㄴ"Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-0cd3dfa4e37921605"

 

2. putty를 이용하여 접속


3. 관리자 권한 얻기

$ sudo su


4. mysql 설치

   ㄴ참고: http://blog.freezner.com/archives/1227

   ㄴ참고: http://love0and0hate.blogspot.com/2017/02/mysql-yum.html


$ sudo yum -y install mysql-server mysql   

   

5. nginx, php-fpm 설치 및 연동

   ㄴ설치 참고: http://blog.freezner.com/archives/1227

   ㄴ연동 참고: https://opentutorials.org/module/384/4332


(1) yum update   

$ yum -y update


(2) Nginx + PHP FPM 설치

$ yum install -y nginx php-fpm


(3) PHP 확장 모듈 설치

$ yum install -y php-devel php-mysql php-pdo php-pear php-mbstring php-cli php-odbc php-imap php-gd php-xml php-soap


(4) Nginx 기본 설정 파일 작성

$ vim /etc/nginx/conf.d/default.conf

-----/etc/nginx/conf.d/default.conf 파일 내용 작성 및 저장-----

server {

    location / {

        root   /var/www/html;

        index  index.php index.html index.htm;

    }

    location ~ \.php$ {

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;

        include        fastcgi_params;

    }

}

----------------------------------------------------


(5) Nginx에 php-fpm 연동하기 위해 Nginx 설정 파일 수정

$ vim /etc/nginx/nginx.conf

-----/etc/nginx/nginx.conf 파일 내용 수정-----

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    location ~ \.php$ {

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }

-----------------------------------------


(6) php-fpm 설정

$ sudo vim /etc/php-fpm.d/www.conf

-----/etc/php-fpm.d/www.conf 파일 내용 중 각 항목을 찾아 수정 및 저장-----

listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx

listen.group = nginx

listen.mode = 0664

user = nginx

group = nginx

------------------------------------------------------------


(7) EC2 인스턴스 재시작 시, nginx + mysql + php-fpm 자동 실행되도록 설정

$ chkconfig nginx on

$ chkconfig mysqld on

$ chkconfig php-fpm on



(7) Nginx + MySQL + php-fpm 서비스 시작

$ sudo service php-fpm start

$ sudo service nginx start

$ sudo service mysqld start



# 브라우저에서 php 페이지 접근 가능한지 확인하기 위해 test.php 파일 생성

$ vim /usr/share/nginx/html/test.php

-----/usr/share/nginx/html/test.php 파일 내용 작성 및 저장-----

<?php

phpinfo();

?>

-------------------------------------------------------



출처: https://opentutorials.org/module/384/4332



1. CGI(Common Gateway Interface)

CGI(Common Gateway Interface)는 웹서버와 외부 프로그램을 연결해주는 표준화된 프로토콜이다.

웹이 처음 등장했을 때는 HTML과 이미지를 전달해주는 웹서버 밖에 없었다. 하지만 웹에 대한 수요가 증가하면서 정적인 HTML만을 가지고 정보를 제공하는 것에 대한 한계를 극복하기 위해 등장한 기술이 CGI이다. 웹서버가 처리할 수 없는 정보가 웹서버로 요청되었을 때, 그 정보를 처리할 수 있는 외부 프로그램을 호출함으로써 외부 프로그램이 처리한 결과를 웹서버가 받아서 웹브라우저로 전송하는 것이다.

외부 프로그램은 C, C++, Python 등 어떤 언어로든 작성될 수 있는데, 이를 가능케 하는 것은 웹서버와 외부 프로그램은 서로 공통의 규칙인 CGI 표준을 따르기 때문이다.



2. FastCGI

CGI는 하나의 요청(request)에 하나의 프로세스를 생성한다. 이것은 프로세스를 생성하고 제거하는 과정에서 많은 부하가 발생하기 때문에 성능이 느리다. 이를 개선하기 위해 등장한 것이 FastCGI이다. 

FastCGI는 요청이 있을 때마다 프로세스가 만들어지는 것이 아니라 만들어진 프로세스가 계속해서 새로운 요청들을 처리한다. 덕분에 프로세스를 생성하고 제거하는 데에 드는 부하가 줄어든다.


3. PHP-FPM(FastCGI Process Manager)

PHP-FPM은 PHP를 FastCGI 모드로 동작하도록 해준다. PHP5.4 RC부터는 PHP에 기본으로 내장되었다.

PHP-FPM을 사용하면 아래와 같은 이점이 생긴다. 


  • Adaptive process spawning 
  • Basic statistics (ala Apache's mod_status) 
  • Advanced process management with graceful stop/start
  • Ability to start workers with different uid/gid/chroot/environment and different php.ini (replaces safe_mode)
  • Stdout & stderr logging
  • Emergency restart in case of accidental opcode cache destruction
  • 업로드를 빠르게 처리해준다.
  • "slowlog"를 통해서 느리게 동작하는 부분을 추적할 수 있게 한다.
  • Enhancements to FastCGI, such as fastcgi_finish_request() - 요청을 일단 끝내고 후처리가 요구되는 작업을 백그라운드로 처리할 수 있도록 해준다.


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

날짜 관련 소스 예제  (0) 2018.02.14
ftp를 이용한 원격 파일 업,다운로드  (0) 2018.02.14
PHP XML 파싱(Parsing) 간단 예제  (0) 2018.02.14

예제1) 두 정수 a, b가 있을 때, swap() 구현


a = a^b;

b = a^b;  // b = (a^b)^b = a

a = a^b;  // a = (a^b)^a = b



예제2) 직사각형의 세 좌표가 있을 때, 하나의 좌표 구하기


x1^x2^x3 = x4

y1^y2^y3 = y4


상속(Inheritance)은 IS-A(이즈 어) 관계다.


예) Computer - Notebook 클래스 관계

ㄴNotebook 클래스는 Computer 클래스의 모든 필드/메소드를 상속받는다

ㄴ부모 클래스: Computer

ㄴ자식 클래스: Notebook

ㄴComputer is the superclass(base class or parent class) of Notebook

ㄴNotebook is a subclass(extended class or child class) of Computer 

ㄴ"A Notebook is a Computer" 성립O 

ㄴ"A Computer is a Notebook" 성립X

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

JAVA의 컴파일 과정, JVM 메모리 구조, JVM GC 개념  (0) 2018.12.28
Wrapper class 개념  (0) 2018.11.10
== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18

+ Recent posts