목록Framework (26)
코딩하는 오징어
Netty는 ByteBuf를 data structure로 이용하고 있으며 ByteBuf는 RefereneCount (ReferenceCounted interface를 상속하고 있다.)를 통해 memory를 release할 지 결정한다. 여기서 memory를 release를 한다는 건 어떤 의미일까? java는 garbage collector가 메모리를 알아서 관리해줄텐데 잘못된 reference count 관리에 의해서 memory leak이 발생한다는 건 어떤 의미일까? 그러기 위해서는 먼저 Java NIO ByteBuffer에서 생성된 buffer가 더 이상 참조되지 않을 때 어떤 방식으로 메모리가 수집 되는 지 살펴보아야한다. ByteBuffer.allocate() 를 이용하여 heap buffer..
Asynchronous - Non Blocking framework가 화두가 된지 꽤 오랜 시간이 흘렀다. WebFlux, Akka, Node.js, Vert.X 같은 다양한 Asynchronous - Non Blocking 모델을 제공하는 Web Framework가 등장하였고, Spring 을 사용하는 다수의 팀들은 WebFlux를 선택하여 Blocking 모델인 WebMvc로 부터 벗어나 Asynchronous - Non Blocking을 지향하고 있다고 이야기하고 있다. 하지만 우리는 정말 Thread를 block 시키지 않도록 코드를 작성하고 있을까?? Asynchronous와 Non Blocking에 대한 이야기 부터 간단하게 소개하고 현재 우리는 어떤 방식으로 Asynchronous - Non..
spring web mvc를 이용하여 서버 어플리케이션을 개발한다면 @Transactional을 이용하여 트랜잭션을 적용할 것이다. @Transactional이 적용된 메서드는 다음과 같은 flow로 메서드가 실행된다. (PlatformTransactionManager, DataSource 인터페이스에 대한 자세한 설명은 이 글에서 다루지 않는다.) 1. CglibAopProxy.DynamicAdvisedInterceptor.intercept(...) 2. TransactionInterceptor.invoke(...) 3. TransactionAspectSupport.invokeWithinTransaction(...) 4. TransactionAspectSupport.createTransactionIfN..
JPA는 잘 알고 사용하면 굉장히 좋은 framework이지만 잘 모르고 사용한다면 여러가지 문제가 발생하는 어려운 친구이다. 여기서 다루는 문제외에도 N+1문제등 몇 가지 주의해야할 부분들이 있지만 해당 내용들은 다른 글에서 다루어 보겠다. 이번 글에서는 영속성 컨텍스트의 동작 방식에 의해 트랜잭션의 격리 수준이 정상적으로 동작하지 않는 것 처럼 보이는 것에 대해 공유하려한다. 먼저 트랜잭션 격리 수준에 대해 잘 모르겠다면 다음 글을 한번 보고 나서 해당 글을 읽으면 도움이 될 것 같다. 2018/03/09 - [Database/MySQL] - 데이터베이스 Transaction Isolation Level 데이터베이스 Isolation Level 오늘은 데이터베이스의 isolation level이 무엇..
클래스 정의 제약 사항 JPA를 사용하게 되면 대부분 Hibernate를 구현체로 사용하게 된다. Hibernate를 구현체로 사용하게 되면 Entity로 사용할 클래스에 몇 가지 제약사항이 존재한다. https://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html 위의 문서를 보면 다음과 같은 글이 있다. Requirements for Entity Classes An entity class must follow these requirements: The class must not be declared final. No methods or persistent instance variables must be declared final. Entity의 해당하는 클래스는 ..
Netty는 비동기 네트워크 프레임워크 입니다. 이번 글에서는 이 비동기 프레임워크가 어떻게 동작하는지 살펴 보겠습니다. Netty는 Channel에서 발생하는 이벤트들을 EventLoop가 처리하는 구조입니다. 여기서 EventLoop에 대해서 한번 살펴보고 글을 이어가겠습니다. 이벤트 루프 이벤트 루프란 이벤트를 실행하기 위한 무한루프 스레드를 말합니다. 위의 그림과 같이 객체에서 발생한 이벤트는 이벤트 큐에 입력되고 이벤트 루프는 이벤트 큐에 입력된 이벤트가 있을 때 해당 이벤트를 꺼내서 이벤트를 실행합니다. 이것이 이벤트 루프의 기본 개념입니다. 이벤트 루프는 지원하는 스레드 종류에 따라서 단일 스레드 이벤트 루프와 다중 스레드 이벤트 루프로 나뉘고, 이벤트 루프가 처리한 이벤트의 결과를 돌려주는..
Netty는 네트워크적인 low한 처리와 비즈니스 로직 처리를 추상화를 통해 분리하였으며 덕분에 비즈니스 로직에 더욱 집중할 수 있도록 도와준다. Netty는 크게 다음과 같은 Component들을 통해 데이터를 처리한다. Channel, EventLoop, ChannelFuture ChannelHandler, ChannelPipeline Bootstrap Channel 기본 입출력 작업(bind, connect, read, write)은 네트워크 전송에서 제공하는 기본형을 이용한다. 자바 기반 네트워크 기본 구조는 Socket클래스이다. Netty의 Channel 인터페이스는 Socket으로 직접 작업할 때의 복잡성을 크게 완화하는 API를 제공한다. Netty는 Channel 인터페이스를 구현한 몇 ..
Slick에서 Transaction 적용 (slick version 3.3.1) Slick을 설정함에 있어 여러가지가 있겠지만 개인적으로 Cake Pattern을 이용하여 Config를 구성해 나가는 것을 선호한다. (참조 링크: Slick Cake Pattern Config) slick은 DBIOAction을 통해 쿼리를 실행한다. 보통은 type alias된 DBIO를 통해 사용한다. future를 DBIOAction으로 바꾸고 싶다면 DBIO.from(...)을 통해 간단하게 바꿀 수 있다. // Import the Scala API from the profile import profile.api._ ... (for { _ } // ExtenralClient는 외부 시스템과의 통신을 위한 클래스이다..