자바 18

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.
관찰자패턴 (Observer Pattern) 옵저버 패턴은 객체의 상태 변화를 관찰하는 옵저버를 객체에 등록하여 상태 변화가 있을때마다 notify를 통해 객체가 관찰자들에게 알림을 보내는 패턴을 말합니다. 쉽게 말해서 어떤 이벤트가 일어나는 것을 감시하는 패턴입니다. 옵저버 패턴을 활용하면 다른 객체의 상태 변화를 별도의 함수 호출 없이 즉각적으로 알 수 있습니다. 따라서 이벤트에 대한 처리를 자주 해야하는 프로그램이라면 매우 효율적일 수 있습니다. public class AppMain { /* * 예제의 설정 * 가장 보편적인 설정이라고 볼 수 있는 Youtuber와 Subscriber들의 관계로 예제를 설정하였습니다. * Youtuber가 새로운 영상을 올리거나, 공지를 등록하는 것을 모두 notify 함수로 개념을 통일하여서 작성하였습니다... Computer Science/Design Pattern 2023. 1. 29.
전략패턴 (Strategy Pattern) 특정한 계열 또는 행위를 Interface로 캡슐화하고 구체적으로 구현된 알고리즘을 상호 교체가 가능하도록 만드는 패턴입니다. 전략패턴을 사용하면 기능이 추가 또는 변경 되더라도 기존 클래스의 수정이 아닌 Interface의 구현을 통해 확장하여 해결 할 수 있어 OCP 원칙을 지킬 수 있습니다. Context는 전략을 실제로 사용하는 사용자의 입장입니다. 이때 A라는 상황에는 ConcreateStrategy1, B라는 상황에는 ConcreateStrategy2를 사용하도록 구성할 수 있습니다. public class AppMain { /* * 예제의 설정 * Android와 Ios Mobile 개발자가 있는데 각각 프로젝트에서 2가지 언어를 사용한다는 가정입니다. * 인스턴스가 개발자의 숫자를 의미하도.. Computer Science/Design Pattern 2023. 1. 29.
Filter Filter는 J2EE 표준 스펙 기능으로 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공합니다. Front Controller인 Dispatcher Servlet의 앞에서 동작합니다. 따라서 Filter는 Spring의 범위 밖에서 동작하고 처리됩니다. Filter는 Spring Bean으로 등록은 되지만 Spring Container가 아닌 톰캣과 같은 Web Container에 의해 관리됩니다. Filter는 FilterChain을 통해 연쇄적으로 동작하도록 할 수 있습니다. Spring에서 Filter를 구현하기 위해서는 javax.servlet.Filter 인터페이스를 구현하여 사용할 수 있습니다. Filt.. Domain/Spring 2023. 1. 28.
[Spring] Logging과 LoggingFramework Logging이란 시스템이 동작할 때, 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미합니다. 개발 과정 혹은 개발 후에 발생하는 동작에 대해 트래킹을 하여 예기치 못한 이슈를 진단 및 해결하는데 도움이 됩니다. 하지만 무분별한 로깅은 성능상 이슈를 발생할 수 있기 때문에 의미있는 정보를 적절한 수준으로 수집하는 것이 중요합니다. Java는 System.out.println()을 이용하거나 Logging Framework를 사용하여 로그를 남길 수 있습니다. # System.out.println() # 일명 sout, System.out.println()은 Java를 처음 접할 때부터 사용할 수 있는 간단한 로깅 방법입니다. 가장 편하고 확인하기 좋은 방법이지만 성능에 영향을 많이 주.. Domain/Spring 2022. 9. 2.