Spring
[Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe
2024.06.10 - [CS/OS] - 동기 VS 비동기, 블로킹 VS 논블로킹 동기 VS 비동기, 블로킹 VS 논블로킹동기(Synchronous) vs 비동기(Asynchronous)Synchronous작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함Thread1이 작업을 시작시키고, Task1이 끝날때까지 기다렸다 Task2를 시작작업 요청을karla.tistory.com 본사에서 클라이언트로부터 도서 정보 조회 요청을 받으면 지점으로 도서 정보 조회 API 요청 보내는 예시코드(클라이언트 ↔️ 본사 ↔️ 지점) Spring MVCBlocking 방식: 스레드가 차단됨다섯개의 책을 조회하는 API호출 지연시간 : 약 25초 정도(호출당 5초 지연)// 본사 API Server: R..
[Spring WebFlux] 2. 리액티브 스트림즈(Reactive Streams)
리액티브 스트림즈 (Reactive Streams)리액티브 라이브로리를 어떻게 구현할지 정의해 놓은 별도의 표준 사양데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하깊 위한 리액티브 라이브러리의 표준 사양RxJava, Reactor(Spring Framework와 가장 궁합이 잘맞음), Akka Streams, Java 9 Flow API 등 리액티브 스트림즈 구성요소컴포넌트설명Publisher 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할Subscriber구독한 Publisher로부터 통지(발행, 게시, 방출)된 데이터를 전달받아서 처리하는 역할SubscriptionPublisher에 요청할 데이터의 개수를 지정하고, 데이터의 구독을 취소하는 역할ProcessorPublis..
[Spring WebFlux] 1. 리액티브 프로그래밍
리액티브 프로그래밍(Reactive Programming)리액티브 시스템을 구축하는데 필요한 프로그래밍 모델리액티브 시스템은 비동기 메시지 통신을 기반으로 한다리액티브 시스템에서의 비동기 메시지 통신은 Blocking I/O 방식이 아닌, Non-Blocking I/O 방식의 통신선언적 프로그래밍, 실행할 동작을 구체적으로 명시하지 않고 목표만 선언데이터 소스의 변경이 있을 때마다 데이터 전파리액티브 프로그래밍 코드는 코드의 간결함과 가독성에 유리한 메서드 체인의 형태로 표현리액티브 프로그래밍 코드에서 파라미터를 가지는 메서드는 함수형 프로그래밍 방식의 코드 형태의 파라미터를 가짐 명령형 프로그래밍 VS 선언형프로그래밍명령형 프로그래밍// 6보다 더 크고 홀수인 숫자들의 합계를 구하는 것public c..
Spring Event, 스프링 이벤트, ApplicationEventPublisher
Spring Event 스프링 프레임워크를 사용할 때 빈(Bean) 간 데이터를 주고받는 방식 이벤트를 발행(Publish)하고 이벤트를 수신 또는 구독하여 소비(Listen/Subscribe)하는 기능을 제공 기존 로직에 트리거와 같은 후처리를 추가하면서 관심사 분리 (낮은 결합도) 1. 이벤트 클래스 이벤트 클래스는 이벤트를 처리하는 데 필요한 최소한의 데이터 포함하여 생성 이너 클래스 생성하여 사용 가능 @Getter @RequiredArgsConstructor public class AddPersonEvent { PersonDto personDto; } 2. 이벤트 디스패처 이벤트 발행을 위해 스프링에서 제공하는 ApplicationEventPublisher을 사용 @Slf4j @Service @..
Spring Batch, 배치와 스케줄러의 차이, Job, Tasklet, Chunk
배치 배치는 실시간으로 처리하는것이 아닌 처리할 작업물들을 모아 한번에 처리하는 것 예를들어 1년간 접속하지않은 모든 회원들을 휴먼계정으로 처리하는 등 일반적인 비즈니스로직이 아닌 상황에 대해서 처리해주는 프로세스 배치와 스케줄러의 차이 배치 스캐쥴러 일괄 처리 정해진 시간에 자동으로 실행 사용자의 명령이 있을 때 실행 주기적으로 실행 Batch Job을 관리(Job을 구동하거나 실행시키는 기능 X ) Job, Tasklet, Chunk Job 배치 처리 과정을 하나의 단위로 만든 객체 배치 처리 과정에 있어 전체 계층의 최상단에 위치 1개 이상의 Step을 가짐 Job 안에는 여러 개의 Step이 존재하고, Step 안에는 Tasklet 또는 {Reader, Processor, Writer} 묶음이 존..
Spring Jsch SSH Private Key, Dockerfile 복사, Jsch kubernetes pod
Spring Jsch java ssh 접속private Session session; private ChannelExec channelExec; connect public void connectSSH() throws JSchException { JSch jsch = new JSch(); session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyCheckikarla.tistory.com SSH Authentication 동작 방식Client → Server : SSH connection을 요청Server → Client : Random message 전송Client..
Spring Jsch java ssh 접속
private Session session; private ChannelExec channelExec; connect public void connectSSH() throws JSchException { JSch jsch = new JSch(); session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); } connectSSH(); // ssh 연결 try { Channel channel = session.openChannel("exec"); // 채널 접속 channelExec = (ChannelE..
Spring @Async 비동기 처리
@EnableAsync @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args);} } @Service public class MessageService { @Async public void print(String message) { System.out.println(message); } } @RequiredArgsConstructor @RestController public class MessageController { private final MessageService messageService; @..
Spring websocket 웹소켓, java 채팅 프로그램
웹 소켓 1. WebSocketConfig 생성 MessageBrokerRegistry enableSimpleBroker("/topic"); // 메시지 브로커를 활성화하고 subscribe 메시지 접두사를 설정합니다. setApplicationDestinationPrefixes("/app"); // 클라이언트에서 발송한 메시지중 Destination이 해당 경로(/app)로 시작하는 메시지를 메시지 브로커에서 처리하게합니다. StompEndpointRegistry addEndpoint("/chatting") // 웹소켓 엔드포인트를 지정합니다. 추후 클라이언트에서 해당 경로로 서버와 handshake 하게 됩니다. withSockJS(); // SockJS를 사용하여 브라우저에서 websocket을 지..
[Jasypt] Spring Boot yaml 파일 암호화
Jasypt Java Simplified Encryption의 약자로, 자바로 간단히 암호화할 수 있게 도와주는 라이브러리 파일트리 ├ src │ └─ main │ │ ├─ JasyptConfig.kt │ │ └─ KotlinStudyApplication.kt │ └─ resources │ ├─ application.yml │ └─ jasypt-encryptor-password.txt └─ .gitignore 1. build.gradle에 jasypt-spring-boot-starter 추가 dependencies { implementation ("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3") ... 생략 } 2. yaml 파일에 Jasypt ..