반응형

Category 169

Netty ChannelHandler와 ChannelPipeline

이미 앞부분에서 ChannelPipeline안에 ChannelHandler를 체인으로 연결해 처리 논리를 구성할 수 있다는 것을 배웠다. 이러한 클래스와 연관된 사용사례들과 ChannelHandlerContext에 대해서도 알아보자. Channel의 수명주기 Channel 인터페이스는 ChannelInboundHandler API와 밀접한 관계가 있으며 간단하지만 유용한 상태 모델을 정의한다. Channel의 네 가지 상태에 대해 알아보자. 상태 설명 ChannelUnregistered Channel이 생성됐지만 EventLoop에 등록되지 않음 ChannelRegistered Channel이 EventLoop에 등록됨 ChannelActive Channel이 활성화됨(원격 피어로 연결됨). 이제 데이터..

IT 2021.01.03

[Springboot/Gradle] JAVA SMTP로 비밀번호 찾기 메일 보내기(NAVER)

간단한 서비스를 개발하다가 회원들의 비밀번호 찾기 기능이 필요하게 되었고, 이메일 정보를 이용해 해당 기능을 구현하기로 결정하였습니다. JAVA SMTP가 잘 되어 있어서 어렵지 않게 구현할 수 있었으며 복잡한 내용은 아니므로 중간중간 사진을 첨부해 참고하기 편하도록 글을 남겨두려 합니다. SMTP란? 간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol, SMTP)은 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 메일 서버간의 송수신뿐만 아니라, 메일 클라이언트에서 메일 서버로 메일을 보낼 때에도 사용되는 경우가 많다. (출처 : 위키피디아 ) 간단히 Simple Mail Transfer Protocol의 약어로 이메일을 전송하기 위해서 사용되는 정도로만 기억해두..

IT/Web 2021.01.03

Netty ByteBuf - 바이트 버퍼

앞서 언급한 것처럼 네트워크 데이터의 기본 단위는 항상 바이트이다. 자바 NIO는 ByteBuffer라는 자체 바이트 컨테이너를 제공하지만 이 클래스는 사용법이 너무 복잡해 사용하기 부담스럽다. 네티에는 네트워크 개발자에게 더 나은 API를 제공하는 강력한 구현인 ByteBuf가 있다. 네티는 데이터 처리를 위한 API를 ByteBuf 추상 클래스와 ByteBufHolder 인터페이스라는 두 컴포넌트를 통해 노출한다. ByteBuf API의 장점은 다음과 같다. 사용자 정의 버퍼 형식으로 확장할 수 있음 내장 복합 버퍼 형식을 통해 투명한 제로 카피를 달성할 수 있음. 용량을 필요에 따라 확장할 수 있음(JDK의 StringBuilder와 비슷) ByteBuffer의 flip() 메서드 호출 없이도 리더..

IT 2020.12.29

Netty 전송 API

Ch04. 전송 API 네트워크를 통해 전송되는 데이터는 모두 바이트 형식이다. 네티는 모든 전송 구현에 공통 API를 기반 레이어로 활용하므로 JDK를 직접 이용할 때보다 블로킹-논블로킹 변환 작업이 훨씬 간단하게 이루어진다. 코드가 구현 세부사항으로 오염될 우려가 적고, 전체 코드 기반을 광범위하게 리팩터링할 필요가 없다. 연결을 수락한 다음, 클라이언트로 "Hi!" 라는 메시지를 전송한 뒤 연결을 닫는 간단한 애플리케이션을 작성해보자. NettyNioServer import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*;..

IT 2020.12.28

Netty 컴포넌트와 설계

Channel, EventLoop, ChannelFuture 이제 네티의 네트워킹 추상화를 대표한다고 말할 수 있는 Channel, EventLoop, ChannelFuture 클래스를 더 자세히 알아보자. 이 세 가지 개념의 기능들을 다음과 같이 요약해볼 수 있다. Channel : 소켓(Socket) EventLoop : 제어 흐름, 멀티스레딩, 동시성 제어 ChannelFuture : 비동기 알림 Channel 인터페이스 자바 기반 네트워크에서 기본 구조는 Socket 클래스다. 네티의 Channel 인터페이스는 Socket으로 직접 작업할 때의 복잡성을 크게 완화하는 API를 제공한다. ex) EmbeddedChannel, LocalServerChannel, NioDatagramChannel, N..

IT 2020.12.10

Java Netty 에코 서버-클라이언트 구현하기

Echo 서버 만들기 모든 네티 서버에는 다음 항목이 필요하다. 하나 이상의 ChannelHandler : 이 컴포넌트는 클라이언트로부터 받은 데이터를 서버측에서 처리하는 비즈니스 논리를 구현한다. 부트스트랩 : 서버를 구성하는 시동 코드를 의미한다. 최소한 서버가 연결 요청을 수신하는 포트 서버와 바인딩하는 코드가 있어야 한다. ChannelHandler와 비즈니스 논리 Echo 서버는 들어오는 메시지에 반응해야 하므로 인바운드 이벤트에 반응하는 메서드가 정의된 ChannelInboundHandler 인터페이스를 구현해야 한다. 관심을 가질 메서드는 다음과 같다. channelRead() : 메시지가 들어올 때마다 호출된다. channelReadComplete() : channelRead()의 마지막 ..

IT 2020.12.09

Netty의 개념과 아키텍처

Netty : 비동기식 이벤트 기반 네트워킹 프레임워크 일반적인 JAVA 블로킹 입출력 예제 ServerSocket serverSocket = new ServerSocket(portNumber); Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String request, response; while((request = in.readLine)) != null) { if ("Don..

IT 2020.12.09

@PostMapping과 @PutMapping의 차이

개발을 하면서 여느 때처럼 CRUD 코드를 만들고 있었습니다. @PostMapping과 @PutMapping의 기능이 비슷한데 왜 따로 명시하는지 알고 있나? 질문에 말문이 막혔습니다. 공식처럼 추가/등록은 @PostMapping을 사용하고 수정할 때에는 @PutMapping을 사용했기 때문에 인수인계 혹은 코드 리뷰에 코드를 읽는 사람을 위해 구분지어놓는 줄만 알았습니다. 관련 자료를 찾아보다가 mozilla 사이트의 글을 보고 차이를 조금 이해하게 되었습니다. developer.mozilla.org/ko/docs/Web/HTTP/Methods/PUT PUT HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체합니다. developer.moz..

IT/Web 2020.10.15

[ERROR] JSON 순환 참조 문제 해결하기

프로젝트를 진행하다가 순환참조 문제가 발생하였다. 에러 메시지는 다음과 같다. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite rec..

IT 2020.09.19

[ERROR] Error running '{ClassName}': Command line is too long. Shorten command line for {ClassName} IntelliJ 실행 에러

AWS S3 파일 업로드 작업을 진행하다가 IntelliJ에서 갑자기 오류 발생으로 프로젝트 실행이 되지 않았다. 관련 해결책을 찾다가 xml 수정도 해보았지만 해결되지 않았고, 제대로 된 해결책을 봐서 기록을 남긴다. 우선 에러가 발생하는 이유는 " IntelliJ에서 바로 실행할 때에는 class path를 자동으로 잡게 하는데, 이 때문에 run command가 너무 길어져서 발생하는 문제이다. 정상적으로 실행되는 경우에도 알고 보면 아래처럼 어마 무시하게 run command가 길다." run command 길이가 OS limit를 넘으면 실행할 수 없게 된다. 이를 해결하기 위해서는 Run/Debug Configuration에서 Shorten command line의 옵션을 수정해야 한다. 4가..

IT 2020.09.13
반응형