썸네일 17.3 리액티브 라이브러리 RxJava 사용하기 RxJava는 Flow.Publisher를 구현하는 두 클래스를 제공 io.reactive.Flowable: 역압력 기능을 제공 io.reactivex.Observable: 역압력 기능을 제공하지 않는 기존 클래스 단순한 프로그램, 마우스 움직임 같은 사용자 인터페이스에 적합 이벤트 스트림에는 역압력을 적용하기 어렵기 때문 (마우스 움직임을 느리게 하거나 멈출 수 없음) RxJava는 천 개 이하의 요소를 가진 스트림이나, 마우스 & 터치 이벤트 등 역압력을 적용하기 힘든 GUI 이벤트, 자주 발생하지 않는 종류의 이벤트에 역압력을 적용하지 말 것을 권장함 여기서는 Obsevable 인터페이스를 사용하는 방법을 설명함 모든 subscriber는 request(Long.MAX_VALUE) 메서드를 이용해서..
썸네일 ch17.2.3 Flow 라이브러리 예제 Main.java package org.example; import java.util.concurrent.Flow.*; public class Main { public static void main(String[] args) { getCelsiusTemperatures("New York").subscribe(new TempSubscriber()); } private static Publisher getCelsiusTemperatures(String town){ return subscriber -> { TempProcessor processor = new TempProcessor(); processor.subscribe(subscriber); processor.onSubscribe(new TempSubsc..
썸네일 ch17. 리액티브 프로그래밍 리액티브 프로그래밍의 중요성 빅데이터: 기가 바이트의 데이터 → 페타 바이트 단위의 데이터 다양한 환경: 모바일 디바이스에서 부터 클라우드 기반 클러스터에 이르기까지 다양한 환경에 애플리케이션이 배포됨 사용자 패턴: 사용자는 1년 내내 항상 서비스를 이용할 수 있으며, 밀리초 단위의 응답시간을 기대함 리액티브 프로그래밍: 다양한 시스템과 소스에서 들어오는 데이터 항목 스트림을 비동기적으로 처리하고 합쳐서 해결함 17.1 리액티브 매니패스토 리액티브 애플리케이션과 시스템 개발의 핵심 원칙을 공식적으로 정의함 반응성(responsive): 빠르고 일정하고 예상가능한 반응 시간을 제공함 회복성(resilient): 장애가 발생해도 시스템은 반응해야 함 탄력성(elastic): 애플리케이션에 작업 부하가 심해지..
썸네일 build.gradle와 build 과정 살펴보기 1. Gradle 역할 빌드 자동화 도구: 소스코드에서 실행 가능한 파일로 변환하는 과정을 자동화함 프로젝트를 빌드, 실행 가능한 JAR 파일을 생성, 필요한 의존성 라이브러리를 관리, 테스트를 실행, 코드 컴파일러를 설정하는 등 다양한 작업을 자동화할 수 있음 빌드 스크립트(build.gradle)를 통해 프로젝트르 구성 빌드 태스크 정의, 의존성 관리, 플러그인 설정, 환경 변수 설정 등을 구성 Groovy나 Kotlin 같은 JVM 기반 언어를 사용해서 작성함 예시) spring boot 프로젝트의 build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.0.5' id 'io.spring.dependency-managemen..
썸네일 ch16. CompletableFuture: 안정적 비동기 프로그래밍 1. Future의 단순 활용 Future 인터페이스 미래의 어느 시점에 결과를 얻을 수 있음 비동기 계산을 모델링 하는데 사용할 수 있고, 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공함 시간이 걸리는 작업을 Future 내부로 설정하면 Future에서 계산을 하는 동안 호출한 스레드에서는 다른 작업을 할 수 있음 Future를 사용하기 위해서는 시간이 오래 걸리는 작업을 Callable 객체 내부로 감싼 다음 ExecutorService에 제출해야 함 package org.example; import java.util.concurrent.*; public class ex16_1 { public static void main(String[] args) { ExecutorService es = E..
썸네일 Docker(도커) 1. 사용 이유 리눅스 기반의 컨테이너 기술 개발 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며, 코드를 문제없이 실행할 수 있음 2. 작동 방식 도커는 '컨테이너'를 사용해 코드를 실행하는 표준 방식을 제공함. 컨테이너는 가상머신과 같이 서버 운영 체제를 가상화함. 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있음 도커와 가상 머신 차이 컨테이너 VM - Guest OS 위에 도커가 동작함 도커는 컨테이너를 위한 운영체제임. 컨테이너에 Guest OS를 따로 설치하지 않음. 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있음 - Host OS 위에 Guest OS 전체를 가상화함 간단..
ch15. CompletableFuture와 리액티브 프로그래밍 컨셉의 기초 15.1 동시성을 구현하는 자바 지원의 진화 15.1.1 스레드와 높은 수준의 추상화 15.1.2 Executor와 스레드 풀 Java5 ExecutorService: task 제출과 실행을 분리할 수 있는 기능 제공 스레드의 문제 Java 스레드는 운영체제 스레드에 직접 접근함. 운영체제 스레드를 만들고 종료하려면 비싼 비용을 치러야 하며 숫자도 제한되어 있음. 주어진 프로그램에서 사용할 최적의 자바 스레드 개수는 사용할 수 있는 하드웨어 코어의 개수에 따라 달라짐 스레드 풀 그리고 스레드 풀이 더 좋은 이유 ExecutorService: task를 제출하고 나중에 결과를 수집할 수 있는 인터페이스를 제공함 장점: hw에 맞는 수의 task를 유지함과 동시에 많은 태스크를 스레드 풀에 오버헤드 없이 제..
썸네일 5. Aspect Oriented Programming with Spring 5.1 Introduction Aspect Oriented Programming (AOP)는 프로그램 구조에 대한 다른 관점을 제공함으로써 OOP를 보완함 OOP의 modularity 주요 단위: class AOP의 modularity 주요 단위: aspect aspect는 여러 타입과 객체에 걸친 트랜잭션 관리와 같은 문제를 모듈화하는 것을 가능하게 함 AOP는 Spring의 주요 요소 중 하나임. Spring IoC 컨테이너가 AOP에 의존성을 가지지 않지만, AOP는 괜찮은 middleware 솔루션을 제공하면서 Spring Ioc를 보완함 읽고있는 문서가 Spring 5.0.0.RELEASE 버전인데, 이 문서에서는 Spring 2.0 AOP에 대해서 다룬다고 함 AOP 기능 선언적인 enterp..
썸네일 1. The IoC container 1.1 Introduction to the Spring IoC container and beans Inversion of Control (IOC)는 Dependency Injection (DI)로 알려져있음. 1) IoC는 객체가 dependency를 정의하는 절차임 생성자의 인수, factory 메서드의 인수, 또는 객체가 생성된 후 set 메서드로 dependency를 정의할 수 있음 2) 정의한 후, 컨테이너는 bean을 만들 때 dependency를 주입함 bean이 의존성/인스턴스화를 직접 다루는 것이 아니라 외부에서 다루고 있음. 제어가 역전된 것이기 때문에 Inversion of Control이라고 부름 컨테이너가 의존성/인스턴스화를 다룰 때 클래스를 직접적으로 construct하거나, Se..
썸네일 컬렉션 프레임워크 class Node{ Node prev; // 이전 요소의 주소를 저장 Node next; // 다음 요소의 주소를 저장 Object object; // 데이터를 저장 } 데이터를 저장하는 클래스들을 표준화한 설계 1. 컬렉션 프레임워크의 핵심 인터페이스 List: 순서가 있는 데이터 집합, 중복 허용 ArrayList, LinkedList, Stack, Vector Set: 순서가 없는 데이터 집합, 중복 허용 X HashSet, TreeSet Map: key와 value의 쌍으로 이루어진 데이터 집합, 순서가 없음, 키는 중복 불가, 값은 중복 허용 HashMap, TreeMap, Hashtable, Properties Vector, Stack, Hashtable, Properties: 컬렉션 프레임..
Annotation 개념 1. Annotation이란? 소스코드와 소스코드에 대한 문서를 하나로 관리하기 위해 소스코드의 주석 /* ~~~ */에 소스코드에 대한 정보를 저장 소스코드의 주석으로부터 HTML 문서를 생성해내는 프로그램(javadoc.exe)를 만들어서 사용 @로 미리 정의된 태그를 이용해서 주석 안에 정보를 저장하고, javadoc.exe라는 프로그램이 이 정보를 읽어서 문서를 작성하는데 사용함 애노테이션은 이 기능을 응용해서 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것 예시) @Test 특정 메서드를 테스트할 때 사용하는 애노테이션 이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 함 JDK에서 제공하는 표준 애너테이션은 주로 컴파일러를 위한 것으로..
썸네일 JPA와 연관관계 (with MySQL) (1) 대환장 스파게티 코드를 하나씩 짚어보며 수정하는 시간을 가져보자 1. 객체 연관관계와 테이블 연관관계 우선 만들고자 하는 외래키 관계는 다음과 같다. Members - Closets: 일대다 관계 한 Member는 여러 개의 Closets post를 가질 수 있음 Closets - Style: 다대일 관계 Closets은 여러 Style 중 하나를 가질 수 있음 Closets - ClothesImage: 일대다 관계 한 Closets post는 여러 개의 Image를 가질 수 있음 DB에서는 '다' 테이블에 '일' 테이블의 PK가 들어가면서 양방향 참조관계가 맺어지지만, 객체에서는 기본적으로 단방향 연관관계이기 때문에, DB에서처럼 양방향 참조관계를 맺고 싶으면 양쪽 클래스에서 모두 관계설정을 해주어야 ..