728x90
반응형

분류 전체보기 131

[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

[Java] JDK 동적 프록시

JDK 동적 프록시 프록시는 타겟 코드의 수정없이 접근제어, 부가기능을 추가하기 위해 주로 사용됩니다. 하지만, 프록시를 사용하기 위해서는 대상 클래스 만큼 프록시 클래스를 만들어줘야하기 때문에 코드 중복이 발생한다는 단점이 있습니다. 이를 해결할 수 있는 기술이 동적 프록시 기술입니다. 동적 프록시 기술은 개발자가 직접 프록시 클래스를 만들지 않아도 되고, 런타임에 개발자 대신 동적으로 객체를 생성해줍니다. 또한 동적 프록시에 원하는 로직을 지정할 수도 있습니다. JDK 동적 프록시 구현 JdkDynamicProxyInterface public interface JdkDynamicProxyInterface { String call(); } JdkDynamicProxyImpl @Slf4j public c..

JAVA 2022.08.24

[Java] Reflection

Java Reflection 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있습니다. 또한 메소드를 호출할 수도 있습니다. Reflection은 자바에서 기본적으로 제공하는 API이고, 사용방법만 알면 라이브러리 추가 없이 사용할 수 있습니다. Java Reflection 사용 Reflection 예제에서 사용할 클래스 @Slf4j public class ReflectionEX { @Slf4j static class MethodCall{ public String MethodOne(){ log.info("method One Call"); return "One"; } public String MethodTwo(){ log.info("method Two Call"); re..

JAVA 2022.08.24

[OS] Interprocess Communication

프로세스 간 통신이 필요한 이유 프로세스들이 서로의 공간을 쉽게 접근할 수 있다면 데이터나 코드가 바뀔 수 있기 때문에 위험합니다. 안전하게 프로세스 간에 통신을 할 수 있게 하기 위해서 IPC를 이용한 통신 방법을 제공합니다. 여러 프로세스들이 많은 일들을 처리하면서 성능을 내기 위해서 서로 상태 확인과 데이터 송수신이 필요합니다. IPC 내부 프로세스들 사이에 데이터를 효율적으로 주고 받기 위한 통신을 말합니다. IPC 기법 1. 파이프 (Pipe) 통신을 위한 메모리 공간을 생성하여 프로세스가 데이터를 주고받을 수 있게 합니다. fork()를 통해 자식 프로세스를 생성하였을 때 부모와 자식간의 통신 할 때 사용합니다. 기본 파이프는 단방향 통신입니다. 그렇기 때문에 일반적으로 2개의 파이프를 사용합..

Backend/OS 2022.08.19

[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

[OS] Memory Management (2) - 메모리 관리 방법

Address Binding 프로세스의 주소는 논리적 주소와 물리적 주소로 나뉩니다. 논리적 주소는 가상 주소라고도 하며, CPU가 생성하는 주소입니다. 프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스의 내부에서 사용하고, 프로세스마다 0부터 시작합니다. 물리적 주소는 프로세스가 실행되기 위해 실제로 메모리에 올라가는 위치입니다. Address Binding 프로그램이 어떤 물리적 주소에 Load 될지 결졍하는 과정입니다. Address Binding 종류 Compile Time 프로세스의 물리적 주소가 컴파일 때 결정됩니다. 프로세스가 메모리의 어느 위치에 들어갈지 알고 있다면 컴파일러가 절대 주소를 생성합니다. 컴파일 타임의 주소 할당은 내부에서 사용하는 논리적 주소와 물리적 주소가 동일..

Backend/OS 2022.08.16

[Relational Databases] Database Replication 구현

Database Replication 개념 [Relational Databases] Database Replication 개념 DB Replication 초기 서버를 구성할 때는 하나의 서버와 하나의 데이터베이스를 구성하지만, 사용자 많아지고, 데이터베이스에 많은 Query가 발생하게 되면 이 트래픽을 처리하기 힘든 상황까지 오게 lakelight.tistory.com Database Replication 구현 Database Replication을 진행하기에 앞서 준비해야할 것들이 있습니다. 먼저 VirtualBox를 설치하고 ubuntu-20.04.4-desktop-amd64.iso (이미지 파일) 을 다운받습니다. Ubuntu 20.04.4 LTS (Focal Fossa) Select an imag..

[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
728x90
반응형