728x90
반응형

Spring 16

[Spring] Email 인증 시스템 구현

간단한 Email 인증 시스템을 만들어보겠습니다. 동작 순서 사용자가 이메일을 입력 랜덤 코드를 생성 Email 전송 라이브러리를 이용하여 코드를 사용자 Email에 전송 사용자가 인증 코드를 입력하면 인증 성공 (시스템 내부에서 맞는지 체크) Dependencies 추가 [참고로 스프링 3.0 기준입니다.] dependencies { // 이메일 인증 관련 의존성 implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.6.3' implementation group: 'com.sun.mail', name: 'jakarta.mail', version: '2.0.1' implementation..

Spring 2022.12.22

[Spring] Netty Server & Client 구현

[Spring] Netty 개념 Netty 비동기 네트워크 프레임워크입니다. Channel에서 발생하는 이벤트들을 EventLoop가 처리하는 구조를 가집니다. Channel 기본 입출력 작업은 네트워크 전송에서 제공하는 기본형을 이용합니다. 자 lakelight.tistory.com Java Netty Server TCP 통신 non-blocking model (NIO) I/O 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키기 않는 방식입니다. non-blocking model은 작업 완료를 기다릴 필요가 없기 때문에 작업을 실행 시키고 다른 일을 할 수 있습니다. 이벤트가 오면 그 이벤트를 받아서 처리하는 시스템입니다. 많은 이벤트를 빠르고 경제적으로 처리할 수 있습니다. (Netty의 핵심) ..

Spring 2022.11.23

[Spring] JPA Fetch Join

Join Entity에 Join을 걸어도 실제 쿼리에서 Select 하는 Entity는 오직 JPQL에서 조회하는 주체가 되는 Entity만 조회하여 영속화 합니다. 조회의 주체가 되는 Entity만 Select해서 영속화하기 때문에 데이터는 필요하지 않지만 연관 Entity가 검색조건에 필요한 경우에 주로 사용됩니다. Fetch Join 조회의 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 Select 하여 모두 영속화합니다. Fetch Join이 걸린 Entity 모두 영속화하기 때문에 Fetch Type이 Lazy인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않아 N+1 문제를 해결할 수 있습니다. Fetch Join..

Spring 2022.09.05

[Spring] CGLIB: Code Generator Library

CGLIB 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리입니다. CGLIB을 사용하면 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들 수 있습니다. CGLIB은 외부 라이브러리로, 스프링 프레임워크 내부 소스 코드에 포함되어 있기 때문에 스프링을 사용한다면 라이브러리 추가 없이 사용할 수 있습니다. CGLIB 구현 NonInteferfaceService 인터페이스가 없는 구현체 서비스를 만들었습니다. @Slf4j public class NonInterfaceService { public void call() { log.info("NonInterfaceService call"); } } ExecuteTimeMethodInterceptor CGLIB을 사용하기 위해 ..

Spring 2022.08.24

[Spring] Server-Client 간 암, 복호화 구현

서버와 클라이언트 간에 데이터를 전송할 때 암호화를 해서 데이터를 보내려고 합니다. 이때 어떻게 암, 복화화를 하면 좋을까요? 데이터 암, 복호화에 사용할 알고리즘은 두 가지 입니다. AES와 RSA입니다. 그럼 이 두가지에 대한 개념에 대해 먼저 알아보겠습니다. AES 대칭키 알고리즘입니다. 즉, 같은 키로 암호화와 복호화를 진행합니다. 대칭키 알고리즘은 속도가 빠르지만 키 배송에 대한 문제가 있습니다. 또한 사용자가 증가할 수록 키교환을 해야하기 때문에 많은 키를 관리해야할 수도 있습니다. RSA 공개키 암호화 방식으로, 서로 다른 키로 암호화와 복호화를 진행합니다. 공개키를 이용해서 암호화를 하고, 개인키를 이용해서 복호화를 진행합니다. 대칭키 알고리즘에 비해 속도가 느립니다. Server-Clie..

Spring 2022.08.18

[Spring] JWT Token 인증 구현

JWT Token 인증에 필요한 정보들을 Token에 담아서 암호화시켜 사용하는 인증 방식 입니다. 아래와 같이 Header, Payload, Signature로 구성되어 있습니다. Header에는 보통 토큰의 타입이나, 서명 생성에 사용되는 알고리즘에 대한 내용을 저장합니다. Payload에는 보통 Claim이라는 사용자, 토큰에 대한 property를 key-value의 형태로 저장합니다. Signature는 Header와 Payload에 대한 값을 디코딩하여 서버가 개인키를 가지고 암호화 한 상태를 보여줍니다. JWT Token을 이용한 인증 시스템 구현 전체적인 흐름 사용자가 로그인 했을 때 토큰 발급 사용자는 토큰을 저장해놓고 API 요청 할 때 토큰을 Authorization 헤더에 넣어서 요..

Spring 2022.08.18

[Spring] Netty 서버 데이터 끊기는 문제 해결

문제 인식 [Spring] Netty 서버 구현과 문제 발생 Netty 를 스프링 에서 구현해보았습니다. 클라이언트는 테스트 프로그램을 이용하였습니다. 테스트 프로그램을 통해 데이터를 보내고 서버에서 그 데이터를 받는 테스트를 해보았습니다. Netty Ser lakelight.tistory.com Netty Server로 Client에서 많은 데이터들을 보냈을 때 긴 데이터는 끊겨서 넘어오는 문제가 발생하였습니다. 찾아보던 중 비슷한 문제를 해결한 사례를 발견하여 적용시켜 보았습니다. [NettySocketServerHandler.java] package twim.netty.server; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; ..

Spring 2022.08.16

[Spring] Netty 서버 구현과 문제 발생

Netty 를 스프링 에서 구현해보았습니다. 클라이언트는 테스트 프로그램을 이용하였습니다. 테스트 프로그램을 통해 데이터를 보내고 서버에서 그 데이터를 받는 테스트를 해보았습니다. Netty Server Code [NettySocketServer.java] package twim.netty.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; publi..

Spring 2022.08.16

[Spring] Netty 개념

Netty 비동기 네트워크 프레임워크입니다. Channel에서 발생하는 이벤트들을 EventLoop가 처리하는 구조를 가집니다. Channel 기본 입출력 작업은 네트워크 전송에서 제공하는 기본형을 이용합니다. 자바 기반 네트워크 기본 구조는 Socket 클래스입니다. Netty의 Channel 인터페이스는 Socket으로 직접 작업할 때 복잡성을 완화하는 API를 제공합니다. EventLoop 이벤트를 실행하기 위한 무한루프 쓰레드입니다. Channel에서 발생한 이벤트는 이벤트 큐에 입력됩니다. 이벤트 큐에 입력된 이벤트가 있을 때 해당 이벤트를 꺼내서 이벤트를 실행합니다. 지원하는 스레드 종류에 따라 단일 스레드 이벤트 루프와 다중 스레드 이벤트 루프로 나뉩니다. 이벤트 루프가 처리한 이벤트의 결과..

Spring 2022.08.11
728x90
반응형