분류 전체보기
-
Spring Webflux + Reactorspring 2019. 5. 13. 14:17
Spring 5 개요 스프링5는 내부적으로 스프링 부트2를 사용하며, web stack은 2가지로 구성되어 있다. 기존처럼 서블릿 구조를 사용하는 Spring MVC stack과 스프링5부터 새롭게 도입된 Reactive stack인 Spring Webflux 스택으로 이루어져 있다. 위 그림에서 볼 수 있듯이, Reactive stack인 경우에는 Reactor가 필수이고, Netty와 같은 비동기/non-blocking 모델의 네트워킹 프레임워크를 사용한다. 물론 Reactive stack에서도 Tomcat, Jetty와 같은 서블릿 기반의 컨테이너를 사용할 수 있지만, 이 경우에는 Servlet 3.1 non-blocking I/O를 사용한다. webflux도 비동기/non-blocking 모델이기..
-
Spring AMQPspring 2019. 5. 13. 14:13
개요 Spring AMQP는 AMQP 기반의 메세징 솔루션이다. 메세지를 주고 받는 것과 관련한 추상화된 template을 제공한다. 이를 이해하기 위해서, Message Queue, AMQP를 우선 살펴본다. Message Queue MOM(Message Oriented Middleware) 응용 스프트웨어 간의 메세지 교환을 비동기적으로 처리하기 위한 소프트웨어이다. Message Queue는 MOM을 구현하기 위해 주로 사용되는 방법이다. 이름에서 유추할 수 있듯이 메시징에 큐를 사용한다. sender와 receiver가 직접적으로 메시지를 교환하지 않고, 중간에 큐를 두어 비동기적으로 교환한다. publisher/subscriber model) 따라서, application과 분리가 가능하고, 메..
-
JDK Dynamic Proxy vs CGLib Proxyspring 2019. 5. 13. 11:57
개요 Spring AOP는 2가지 타입의 proxy를 제공한다. 바로 JDK Dynamic Proxy와 CGLib Proxy이다. Spring AOP의 ProxyFactoryBean이 proxy를 생성하는데, 경우에 따라 이 둘 중 하나를 선택해서 사용하는 방식이다. 각 Proxy가 어떻게 다르고 어떤 경우에 쓰이는지 살펴보자. JDK Dynamic Proxy JDK Dynamic Proxy는 interface 기반의 proxy이다. 이는 큰 단점인데, 왜냐하면 모든 target class가 interface를 구현하고 있어야하기 때문이다. 또한, JDK Dynamic Proxy는 Java reflecton을 사용해 method를 invoke한다. 이를 이해하기 위해 먼저 Java reflection을 ..
-
Modern Hardware Architecture_focusing on cache카테고리 없음 2019. 5. 13. 11:52
개요 좋은 성능을 내는 애플리케이션 개발을 위해서는 하드웨어 아키텍쳐를 이해할 필요가 있다. 모던 하드웨어라고 할 만한 현대의 하드웨어는 어떠한 구조로 이루어져 있는지 살펴보자. 구조 모던 하드웨어 아키텍처는 위와 같은 구조로 이루어져 있다. 1개 이상의 CPU L1 Cache L2 Cache L3 Cache Main Memory(RAM) Disk(HDD/SSD) Network Card L1, L2, L3의 의미는 Level 1, 2, 3 의 줄임말이다. 각 레벨 캐시를 조금 더 자세히 살펴보자. L1과 L2 Cache 각 CPU는 L1과 L2 메모리 캐시를 가지고 있다. L1 캐시는 일반적으로 작지만 읽는 속도가 매우 빠르다. L2 캐시는 일반적으로 더 크지만 읽는 속도가 L1 캐시보다 느리다. CPU..
-
Java equals() & hashcode()java 2019. 5. 13. 11:46
equals() public boolean equals(Object obj) 두 non-null object x, y에 대해 x.equals(y)는 x와 y가 "같은"지 체크한다. 여기서, "같다"라는 것은, 즉 true를 return하는 경우는 오직(if and only if) x, y가 같은 object를 참조하는 경우 뿐이다. hashCode() public int hashCode() 해당 object의 hash code value를 return한다. hashcode에는 아래와 같은 일반적인 규약이 있다. Whenever it is invoked on the same object more than once during an execution of a Java application, the hashC..
-
Java Lambdajava 2019. 5. 12. 13:33
개요 자바 람다식은 자바8부터 도입된 함수형 인터페이스를 구현한 코드를 간결하게 쓸 수 있게 해주는 문법이다. 여기서는 람다식의 문법 혹은 람다가 어떻게 도입되었는지, 얼마나 혁명적인지를 논의하기 보다는 람다식이 어떻게 컴파일되고 처리되는지 그 내부 구현을 기존 자바의 익명 클래스와 비교하면서 살펴본다. 내용 람다식의 특징 람다식이 어떻게 도입되었는지에 대한 설명은 생략하려 하나, 이후 논의를 위해서 특징적인 내용만 짚고 넘어가려 한다. 함수형 패러다임의 영향으로 자바에 람다식이 도입되기는 하였지만, 람다식은 자바의 새로운 함수 타입 체계는 아니다. 람다식은 단지 함수형 인터페이스(추상 메소드가 한 개만 존재하는 인터페이스)를 간결한 문법으로 구현할 수 있도록 한 것이다. '인터페이스'와 대등한 개념의 ..
-
Java 11 Featuresjava 2019. 5. 12. 13:27
개요 자바 11이 출시되면서 새롭게 등장한 feature들을 정리해본다. (OpenJDK 기준) 출시일: 2018-09-25 특징 1. Nest-Based Access Control class Test { static class Nest1 { private int nest1Var; } static class Nest2 { private int nest2Var; } } 위와 같이 nested class의 경우, 'Test', 'Nest1', 'Nest2'는 모두 'nestmate'이다. 기존 JVM 상에서는 nestmate끼리 private 멤버 변수를 접근하려면 컴파일러가 중간에 bridge method를 만들어야 했다. 따라서, reflection을 사용하여 nestmate class의 private ..
-
Java 10 Featuresjava 2019. 5. 12. 13:22
개요 자바 10에 새로 추가된 특징들을 알아본다. (OpenJDK 기준) * 출시일: 2018-03-20 특징 1. Local-Variable Type Inference 로컬 변수 타입을 'var'로 선언할 수 있게 되었다. 다음과 같은 케이스에만 적용된다. initializer와 함께 선언되는 로컬 변수 ex. var list = new ArrayList(); // infers ArrayList var stream = list.stream(); // infers Stream enhanced for-loop 내 index 변수 for(var user : users) { ... } traditional for-loop 내 로컬 변수 for(var i = 0; i