비동기 처리 - @Async
java2024. 8. 16. 04:30비동기 처리 - @Async

이전 글Java의 병렬 처리를 알아보자 - Parallel Stream(병렬 스트림)이전 병렬 스트림을 이용한 병렬 처리에선 I/O 네트워크 작업이 포함되어 있었다. 이제 맞게 비동기 작업을 진행하도록 SpringBoot의 비동기 처리 방법을 알아보고 리팩토링을 진행해 보자.비동기란?사전적 정의로 '동시에 일어나지 않음'을 뜻하고 있다. 즉, 개발에 있어서 작업 완료 여부를 기다리지 않고 다른 작업을 실행하는 것을 의미한다고 볼 수 있다.(나의 업무를 다른 사람에게 넘겨버린다고 이해하면 조금은 편한다.) 이해를 돕기 위한 그림을 살펴보자.위의 그림을 봤을 때, 동기 방식은 손님이 커피를 주문하고 나올 때까지 줄에서 그대로 기다리는 방식이다. 즉, 점원은 커피를 반환할 때까지 다른 요청 및 작업을 수행하지..

Java의 병렬 처리를 알아보자 - Parallel Stream(병렬 스트림)
java2024. 8. 2. 03:03Java의 병렬 처리를 알아보자 - Parallel Stream(병렬 스트림)

때는 2023년 9, 10월...핀테크 프로젝트를 진행하고 있던 중 API의 호출부터 반환까지 약 3초 이상 걸리는 현상이 발생했다. 사용자 카드에 바코드 번호를 부여해서 반환하는 API였다. 간편 결제 서비스인 건 고사하고 메인 화면에서 3초의 응답 시간을 가진 API를 사용할 수 없어, 디버깅을 진행했고 사용자가 보유한 모든 카드에 바코드 번호를 부여하고 Redis에 부여하는 과정에서 응답 시간이 늘어났다. 디버깅을 통해 로직이 순차적으로 진행되면서 시간이 점점 누적되는 것이 가장 큰 문제였다. 카드를 많이 보유한 만큼 시간이 늘어날 수밖에 없는 구조. 바코드 번호를 초기에 생성하고 유지하면 되지 않느냐라는 질문의 대답은 X. 보안상 결제와 직접적인 연관이 있는 바코드 번호가 탈취당했을 경우 언제든 ..

2022.09.07 java 추상화
java2022. 9. 11. 15:082022.09.07 java 추상화

🐧추상화 👉 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 냄 추상메서드 👉 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드 abstract 반환타입 메소드이름(); ex) abstract void Print(); abstract = 추상 선언부만 있으며 구현부는 없음 추상클래스 👉 하나 이상의 추상 메서드를 포함하는 클래스 해당 클래스를 상속 받는 클래스는 반드시 추상 메서드를 재정의 해야함 하위 클래스에서 추상 메서드를 오버라이딩을 해야지만 객체를 생성할 수 있음 상층부에 위치할 수록 추상화 정도가 높으며 하층부로 내려갈 수록 구체화 abstract class 클래스이름{ abstract void 메소드이름(); } ⛄ex) public class Example { pu..

2022.09.07 java 다형성
java2022. 9. 10. 19:352022.09.07 java 다형성

🐧다형성 👉 하나의 객체가 여러 타입을 가질 수 있는 것을 의미 상위 클래스 타입의 참조변수로 하위 클래스 타입의 인스턴스를 참조 참조변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거다 적어야 함. 참조변수가 사용할 수 있는 멤버의 개수는 타입을 따라감 ⛄참조변수의 다형성 class Job{...} class Human{...} class Programmer extends Job{...} class Designer extends Job{...} class Firefighter extends Job{...} Job job = new Job();//허용 (타입, 인스턴스 일치) Job job = new Programmer();//허용 (타입 인스턴스 불일치) Designer desig..

2022.09.06 java 캡슐화 패키지 접근 제어자 getter/setter
java2022. 9. 9. 15:222022.09.06 java 캡슐화 패키지 접근 제어자 getter/setter

🐧캡슐화 👉 객체 안의 속성과 기능을 하나로 묶고 구현 내용 일부를 감추어 은닉한다. 외부에서 내부의 정보에 직접 접근하거나 변경할 수 없음 객체가 제공하는 필드와 메소드를 통해서만 접근 가능 정보은닉 🐧패키지 👉 클래스와 인터페이스의 집합 물리적으로 하나의 디렉터리 패키지에 속한 클래스, 인터페이스는 모두 해당 패키지 안에 속해있음 클래스 충돌문제 해결 모든 클래스는 하나 이상의 패키지에 포함 패키지 선언 package 패키지이름; .(포인트)를 사용하여 하위 패키지를 생성할 수 있음 패키지를 따로 생성하지 않을 경우 이름 없는 패키지에 포함이 됨 import문 👉 다른 패키지 속한 클래스를 사용하기 위해 사용 improt문 선언 import 패키지이름.클래스이름;//해당 패키지의 특정 클래스만 사용 ..

2022.09.06 java 상속, 포함, 메서드 오버라이딩, super
java2022. 9. 8. 17:352022.09.06 java 상속, 포함, 메서드 오버라이딩, super

🐧상속(inheritance) 👉 기존의 클래스를 재활용하여 새로운 클래스를 정의 특징 상위 클래스와 하위 클래스로 나뉨 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 됨 하위 클래스의 멤버 개수는 항상 상위 클래스의 멤버 개수보다 같거나 많음 (자신의 것 + 물려받은 것) extends 키워드 사용 단일 상속만 지원 a는 b이다(IS - A) 관계 장점 기존의 클래스를 재활용할 수 있음 중복되는 멤버를 상위에 미리 작성하면 하위에서 작성하지 않아도 됨 (중복 제거) 계층적 관계 구성 Class Child extend Parents{ ... } 상위 클래스 : Parents 하위 클래스 : Child Parents의 멤버를 child가 물려 받음 ⛄ex) public class Example { pu..

2022.09.05 java 생성자, 내부 클래스
java2022. 9. 7. 00:082022.09.05 java 생성자, 내부 클래스

생성자(Constructor) - 인스턴스 변수를 원하는 값으로 초기화할 수 있는 메서드 특징 생성자의 이름은 반드시 클래스의 이름과 같아야 한다 리턴 타입이 없으나 void는 아님 하나의 클래스가 여러 개의 생성자를 가질 수 있다. 생성자 오버로딩 가능 생성자 선언 클래스명(){//매개변수가 없는 생성자 ...바디... } 클래스명(매개변수){//매개변수가 있는 생성자 ...바디... } ex) Class Person{ Person(){ System.out.println("사람입니다"); } Person(String name){ System.out.println("이름 : " + name); } Person(String job, int age){ System.out.println("직업 : " + jo..

2022.09.02 java 클래스, 객체, 필드, 메서드
java2022. 9. 5. 16:392022.09.02 java 클래스, 객체, 필드, 메서드

클래스 객체를 정의하는 설계도 또는 틀과 같은 의미 객체를 생성하는 데 사용 ex) 붕어빵 기계 = 클래스, 붕어빵 = 객체(인스턴스) class 클래스이름{ 내용 } 필드, 메서드, 생성자, 이너 클래스로 구성 클래스 이름의 첫 글자는 주로 대문자 객체 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 사물뿐만 아니라 철학, 생각 등 무형의 것들도 포함 속성 - 필드, 기능 -메서드로 이루어 짐 class Car{ //클래스 private String model;//자동차 모델 private int wheels;//바퀴 private String color;//색상 //↑필드 void stop() {...};//브레이크 void accelerate() {...};//엑셀 //↑메서드 } 객체 생성 클..

2022.09.01 java 배열
java2022. 9. 4. 23:482022.09.01 java 배열

배열 같은 타입의 변수들로 이루어진 유한 집합 배열의 값을 '요소'라고 하며 위치를 가리키는 숫자를 '인덱스'라고 한다. 자바의 인덱스는 0부터 시작한다. 1차원 배열 선언 타입[] 배열이름; 타입 배열이름[]; //ex) int[] arr; int arr[]; 단순 배열 선언 생성 배열이름 = new타입[배열길이]; 타입[] 배열이름 = new타입[배열길이]; //ex) arr = new int[10]; int[] arr = new int[5]; 대괄호 안에 길이를 지정하여 배열을 생성 초기화 인덱스를 이용한 초기화 int[] arr = new int[5];//길이가 5인 int형 배열 생성 arr[0] = 10;//인덱스를 이용한 배열 초기화 arr[1] = 20;//인덱스1에 20 저장 arr[2]..

2022.08.31 java 제어문
java2022. 9. 4. 02:362022.08.31 java 제어문

조건문 주어진 조건식의 결과에 따라 명령을 수행하도록 제어하는 명령문 if문 if(조건식){ 조건식의 결과가 참일 경우 실행 } ex) int num = 1; if(num == 1){ System.out.println(num); //1 } 실행하고자 하는 명령문이 한 줄이라면 중괄호{} 생략 가능 결과가 거짓일 경우 실행되지 않음 if ~ else문 if(조건식){ 조건식의 결과가 참일 경우 실행 } else{ 조건식의 결과가 거짓일 경우 실행 } ex) int num = 1; if(num == 1){ System.out.println(num); //1 } else{ System.out.println("num = 1이 아닙니다."); //num = 1이 아닙니다. } if의 조건식의 결과가 거짓일 경우 ..

image