본문 바로가기

Java59

Socket을 이용해 HTTP Server 만들기 with 병렬 처리 Socket을 이용한 HTTP Server HTTP 통신은 당연히 Socket을 이용하는건데 어떻게 제목이 Socket을 이용한 HTTP Server이다. 이전 게시글 소켓을 활용한 Echo Server 만들기 소켓(Socket) 소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 양 끝점을 말한다. 즉, 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써 oneny.tistory.com 소켓에 대한 개념과 소켓을 통해 에코 콘솔 서버 만든 게시글이다. HTTP Server 개요 1. Configuration 파일 읽기 프로그램의 설정 정보를 저장하는 파일을 읽어와서 프로그램이 동작할 환경설정을 구성한다. 이 설정은 포트번호, 파일 경로, 데이터베이스 연결 .. 2023. 9. 20.
Spring MVC와 Spring WebFlux로 알아보는 Blocking I/O vs Non-blocking I/O Spring WebFlux에 대해 깊이있게 공부하기 보다는 Spring MVC와 Spring WebFlux를 통해 Blocking 방식과 Non-blocking 방식에서 스레드가 어떻게 동작하는지에 대해서 가볍게 알아보려고 합니다. 관련 블로그 blocking I/O vs non-blocking I/O (feat. socket I/O) I/O I/O는 input/output의 약자로, 데이터의 입출력을 의미한다. 이러한 I/O의 종류에는 일반적으로 우리가 알고 있는 file I/O, 프로세스 간의 통신을 할 때 사용되는 pipe I/O이 있다. 그리고 일반적인 디 oneny.tistory.com 위에서 Blocking I/O와 Non-blocking I/O에 대해서 공부했던 글이다. Spring MVC와.. 2023. 9. 5.
Deadlock 상황 만들어 VisualVM으로 분석하고, 해결하기 데드락(Deadlock) 운영체제 또는 소프트웨어의 잘못된 자원 관리로 인하여 둘 이상의 프로세스 또는 스레드들이 아무것도 진행하지 않는 상태로 서로 영원히 대기하는 상황을 말한다. 주로 한정된 자원을 여러 프로세스 및 스레드에서 동시에 사용하는 환경에서 서로 상대방이 사용 중인 자원을 쓰기 위해 대기하는 상황, 그러니깐 A가 B를 기다리고, B가 A를 기다릴 때 발생한다. 발생조건 상호 배제(Mutual Exclusion): 한 번에 한 스레드만 단독으로 리소스에 액세스할 수 있다. 즉, 리소스 자체를 동시에 쓸 수 없으며 한 번에 하나의 스레드만이 해당 리소스를 사용할 수 있다. 점유 상태로 대기(Hold and wait): 최소 하나의 스레드가 리소스를 점유하면서 다른 리소스에 대기를 해야 한다. .. 2023. 9. 3.
소켓을 활용한 Echo Server 만들기 소켓(Socket) 소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 양 끝점을 말한다. 즉, 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 한다. 다시 말해, 소켓은 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스의 역할을 하는데 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어진다. 이러한 소켓은 역할에 따라 서버 소켓과 클라이언트 소켓으로 구분되는데 이에 대해서는 뒤에서 자세히 살펴보자. 소켓의 역할 클라이언트-서버 응용 프로그램에서 서버는 사용자가 원하는 정보를 전송하여 보여주는 서비스를 일부 제공한다. 이러한 클라이언트와 서버 간에 발생하는 통신은 신뢰할 수 있어야 한다. 즉.. 2023. 9. 1.
타입 안전 이종 컨테이너와 수퍼 타입 토큰 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너는 한 타입의 객체만 담을 수 있는 컨테이너가 아닌 여러 다른 타입(이종)을 담을 수 있는 타입 안전한 컨테이너를 말한다. 이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해주는데, 이러한 설계 방식을 타입 안전 이종 컨테이너 패턴이라고 한다. 일반적으로 사용하는 제네릭의 한계 public class Favorites { List value; public static void main(String[] args) { Favorites names = new Favorites(); names.value.add("oneny"); names.value.add("twony"); Favorites numbers = new Favorites(); } } 제.. 2023. 8. 27.
애노테이션 프로세서 애노테이션 프로세서 일반적으로 애노테이션에 대한 코드를 검사, 수정 또는 생성하는데 사용된다. 본질적으로 애노테이션 프로세서는 java 컴파일러의 플러그인의 일종이다. 애노테이션 프로세서를 적재적소에 잘 사용한다면 개발자의 코드를 단순화할 수 있다. 애노테이션 프로세스의 대표적인 예로 Lombok이 있다. Lombok은 @Getter, @Setter, @Builder 등의 애노테이션과 애노테이션 프로세서를 제공하여 표준적으로 작성해야할 코드를 개발자 대신 생성해주는 라이브러리이다. Lombok(롬복)은 어떻게 동작하는 걸까? @Getter @EqualsAndHashCode @RequiredArgsConstructor public class Member { private final String name; .. 2023. 8. 18.
Proxy 패턴과 JDK Dynamic Proxy, CGLIB Proxy 패턴 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴이다. 즉, 클라이언트가 사용하려고 하는 대상을 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받는다. 프록시 패턴의 장점에는 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용할 수 있다는 것이다. Proxy 패턴 구성 요소 위 그림은 인터페이스와 인터페이스 구현체를 사용하는 구조를 설명하는 그림이다(위 그림과 다르게 인터페이스가 아닌 클래스 상속을 사용할 수도 있다). 인터페이스 기반의 Proxy 패턴은 특징으로는 본인의 타입을 참조하는 필드를 하나 가지고 있다. 이 필드를 가지고 있는 이유는 RealSubject를 참조하기 위함이다. 해당 필드의 operation() 메서드는 RealSubject의 메서드를.. 2023. 8. 17.
Reflection과 Annotation을 이해하고 DI 컨테이너 만들기 Reflection JVM은 클래스 정보를 클래스 로더를 통해 읽어와서 해당 정보를 JVM 메모리에 저장한다. 그렇게 저장된 클래스에 대한 정보가 마치 거울에 투영된 모습과 닮아있어, 리플렉션이라는 이름을 가지게 되었다. 리플렉션을 사용하면 생성자, 메서드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있다. 리플렉션을 사용한 애노테이션은 여러 라이브러리, 프레임워크에서 많이 사용된다. 스프링에서는 의존성 주입, MVC 뷰에서 넘어온 데이터를 객체에 바인할 때, 하이버네이트에서는 @Entity 클래스에 Setter가 없다면 리플렉션을 사용한다. 그리고 클래스 로더에 대한 개념에 대해 어느정도 이해할 필요가 있어 아래 블로그 글을 정리하였다. JVM 메모리 구조 JVM 성능에 관심이 있다면 기본적.. 2023. 8. 13.
try-finally 보다는 try-with-resources를 사용하자 try-finally Java를 처음 배울때 finally 블록은 예외가 발생하든 발생하지않든 항상 실행이 되기 때문에 finally 블록에서 자원을 반납하라고 배웠다. 하지만 Java 8 이상부터는 try-finally는 더이상 최선의 방법이 아니다. try-with-resources를 써야한다. try-finally 예시코드 public class Copy { private static final int BUFFER_SIZE = 8 * 1024; static void copy(String src, String dst) throws IOException { FileInputStream in = new FileInputStream(src); try { FileOutputStream out = new Fi.. 2023. 8. 10.