Language 40

Rust로 by-pass 기능을 가진 Proxy Server 개발하기 특정 조건은 Rust에서 작업하고 그 조건을 제외한 로직은 proxy 서버 개념으로 Main Server로 by-pass하는 Route 로직을 구현해야하는 요구사항. 요구사항 application/json 형식의 Http 통신을 처리해야한다. form-data 형식의 Http 통신을 처리해야한다. Header의 모든 데이터를 포함해야 한다. Method와 Url은 모두 Dynamic하게 처리해야 한다. Solution Util로 Header 또는 Property에 해당되는 정보를 뽑아오는 함수를 개발한다. Util로 Main Server의 Response를 Client용으로 Convert 해주는 함수를 개발한다. Util로 Multipart Type인지 확인하는 함수를 개발한다. application/j.. Language/Rust 2023. 4. 20.
Rust ERROR: linker `cc` not found Cause Rust에는 링커가 없으므로 링커를 수행하려면 gcc 또는 make와 같은 컴파일러가 필요한데, 이 때 cc 컴파일러 프로그램을 찾을 수 없어서 에러가 발생합니다. Solution //Mac OS xcode-select --install //CentOS, RHEL sudo yum groupinstall "Development Tools" sudo yum install cmake make gcc -y //Ubuntu sudo apt install build-essential -y sudo apt install make gcc cmake -y Language/Rust 2023. 4. 7.
ExecutorService ExecutorService는 재사용이 가능한 ThreadPool로 Executor 인터페이스를 확장하여 Thread의 라이프사이클을 제어합니다. ExecutorService 인터페이스는 종료를 관리하는 방법과 비동기 작업의 진행을 추적하기 위한 실행자를 구현하기 위해 필요한 인터페이스입니다. 기본적으로 Thread를 활용하여 다수의 작업을 비동기적으로 수행한다는 것은 매우 어렵습니다. 왜냐하면 우선순위의 문제, 생성과 제거에 대한 핸들링과 같은 문제를 직접 관여하는 것이 굉장히 어렵고 불편한 작업이기 때문입니다. 하지만 이러한 부분을 신경 쓰지않고 편하게 추상화한 것이 ExecutorService입니다. ExecutorService에 Task를 지정해주면 가진 ThreadPool을 활용하여 Task를 .. Language/Java 2023. 2. 16.
Executor Executor 인터페이스는 Java의 Util의 Concurrent 패키지에 위치하는 인터페이스로 Runnable한 Task를 실행하는 개체입니다. Executor라는 이름에 맞게 단순히 실행을 위한 인터페이스입니다. 이 인터페이스의 역할을 작업을 제공하는 코드와 작업을 실행하는 매커니즘의 커플링을 제거해주는 역할을 합니다. 사용방법으로는 일반적으로 Thread를 명시적으로 작성하는 대신 Executor를 사용합니다. 예를 들어, 각 Task에 대해 새로운 Thread의 start() 함수를 호출하는 대신 다음을 사용할 수 있습니다. Executor executor = anExecutor(); executor.execute(new RunnableTask1()); executor.execute(new R.. Language/Java 2023. 2. 15.
Thread Pool Thread Pool이란 Thread를 미리 만들어두는 공간이라고 할 수 있습니다. Thread는 동일한 메모리 영역에서 생성되고 관리되고 생성에 많은 리소스를 요구합니다. 모든 요청에 따라 Thread를 무제한적으로 생성한다면 Memory의 사용량이 증가하고 Context-Switching이 더 자주 발생하여 Program의 성능에 영향을 끼칠 수 있습니다. Thread Pool은 작업 처리에 사용되는 Thread의 개수를 정해두고 요청을 Queue를 통해 Task를 하나씩 Thread가 처리하도록 하는 역할을 합니다. 미리 만들어 둔 Thread를 재사용할 수 있기 때문에 Thread 생성에 발생하는 비용을 줄일 수 있고, Thread의 개수를 제한하기 때문에 무제한적으로 Thread가 생성되는 것을.. Language/Java 2023. 2. 7.
Thread in Java Java에서 Thread를 생성하는 방법은 두 가지가 존재합니다. 첫번째는 Thread Class를 상속하는 방법과 두번째는 Runnable Interface를 구현하는 방식입니다. 두 방법은 run() 함수를 작성하면 된다는 공통점을 가집니다. 하지만 Thread Class를 상속하는 방식은 Java가 다중 상속을 지원하지 않기 때문에 일반적으로 Runnable Interface를 구현하는 방식으로 Thread를 생성합니다. Extends Thread Class package com.donghwan.study.java.thread.extend; // Extends Thread Class public class StudyThread extends Thread { @Override public void r.. Language/Java 2023. 2. 7.
함수형 인터페이스 (Functional Interface) 함수형 인터페이스 (Functional Interface) Java는 기본적으로 객체지향 언어이므로 순수함수와 일반함수를 다르게 취급하고 있습니다. 이러한점을 해결하기 위해 함수형 인터페이스가 등장했습니다. 함수를 1급 객체처럼 다룰 수 있게 해주는 Annotation입니다. 인터페이스에 선언하여 단 하나의 추상 메소드만을 갖도록 제한하는 역할을 합니다. 함수형 인터페이스를 사용하는 이유는 Java의 람다식이 함수형 인터페이스를 반환하기 때문입니다. 기본 제공 함수형 인터페이스 Supplier 매개변수 없이, get() 함수를 통해 T 타입을 리턴하는 경우 Consumer T 타입의 매개변수 가지며, accept() 함수를 통해 Void를 리턴하는 경우 또한 andThen()이라는 함수를 통해 연쇄작용 .. Language/Java 2023. 1. 31.
람다식 (Lamda Expression) Java8부터 지원된 기능으로 자바는 객체지향 언어의 특징과 함께 함수형 언어의 특성을 갖추게 되었습니다. 람다식이란 함수를 하나의 식으로 표현한 것 입니다. 함수를 람다식으로 표현하면 Method의 이름이 필요없기 때문에, 람다식은 익명함수의 한 종류라고 볼 수 있습니다. 익명함수란 함수의 이름이 없는 함수로, 익명함수들은 모두 일급 객체입니다. 일급 객체인 함수는 변수처럼 사용가능하며 매개 변수로 전달이 가능한 특징이 있습니다. 람다식이 등장하게 된 이유는 코드의 효율과 가독성 향상때문입니다. 컴파일러가 문맥을 살피고 타입을 추론합니다. 람다식 내부에서 사용되는 지역변수는 final을 붙이지 않아도 상수로 간주됩니다. 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없습니다. 장점 코드를 간결하게.. Language/Java 2023. 1. 31.
[Java] Exception Error와 Exception Java는 오류가 발생하거나 발생할 여지가 있는 여러 상황에 대한 예외를 만들어 두었습니다. 오류(Error) 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미합니다. OutOfMemory나 StackOverFlow처럼 일단 발생하면 복구할 수 없는 오류입니다. 예측하여 방지할 수 없는 영역입니다. 예외(Exception) 개발자가 구현한 로직에서 발생한 실수나 사용자에 의해 발생하는 영역으로 오류와 달리 개발자기 미리 예측하여 방지할 수 있습니다. 오류와 예외 모두 Throwable을 상속 받습니다.Throwable 클래스 내부의 설명을 인용하여 설명하자면 Java 언어의 모든 오류 및 예외의 슈퍼클래스입니다. 예외 상황이 발생했음을 나타내기 .. Language/Java 2021. 11. 26.
[Java] Collection - (2) List란? List는 대표적인 선형 자료구조로 각 요소가 삽입되는 위치를 정밀하게 제어할 수 있다는 특징이 있습니다. 사용자는 목록의 위치를 기준으로 요소에 접근하고 목록에서 요소를 검색할 수 있습니다. 배열과 비슷하지만 배열은 공간이 고정적이지만 List는 요소의 갯수에 따라 동적으로 크기를 변화시켜 사용할 수 있습니다. List는 일반적으로 중복 요소를 허용합니다. 좀 더 구체적으로, List는 일반적으로 a.equals(b)와 같은 a과 b 요소의 쌍을 허용하며, 일반적으로 null조차 중복으로 여러 null 요소를 저장할 수 있도록합니다. 또, List의 요소에 대한 추가, 제거, 동등 및 해시코드 메서드를 지원합니다. List를 상속한 대표적은 클래스는 ArrayList, LinkedList, Vector.. Language/Java 2021. 11. 12.