java
-
enum 활용기개발/java 2024. 9. 11. 09:58
enum을 통해 단순 코드를 비교할뿐만 아니라 특정 코드에 따라 bean을 가져와 method를 동작할 수 있다 예를 들어 고객이 주문을 힐때 특정 조건에 따라 가격을 할인 받는 정책을 정하거나 그 이후 api에 동일한 데이터를 전송하는 경우와 같은 작업을 할때이다 이때 주목할점이 유사한 데이터라는 점이고 이를 특정 조건에 따라 데이터의 일부만 변경하고 그걸통해 특정 기능을 수행하거나 특정 api , 특정 mq , kafka에 전송을 하면 된다는 점이다이때 enum을 이용하면 if else와 같은 형태로 혹시 method 형태로가 아닌 특정 클래스 형태로 파일들을 관리 할 수 있다 코드는 아래와 같은 형태가 될 것이다할인과 관련된 부분을 interface를 통해 동일 메소드를 받게 하고 bean n..
-
S3 쓰기개발/AWS 2024. 9. 6. 10:56
AWS에서 제공하는 S3를 통해 파일 입출력을 하게 되면 비용이 저렴하여 많은 회사에서 S3를 사용하고 있다.이는 단순 이미지 파일업로드 뿐이 아니라 이력을 적재하여 잘못된 데이터를 추적하는 시스템 내에서도 활용이 가능하다. 간단히 AmazonS3를 주입하여 putObject(쓰기) , listObjects(읽기)를 사용해주면 된다 여기서 중요한 포인트는 파일을 위치를 어떻게 할지 , 업로드 시 압축을 어떻게 할지에 따라 비용 감축과 활용도가 달라진다는 점이다 위치의 경우 업무단위로 구분 후 생성날짜별로 저장하면 된다 예를 들면 취소라는 기능 수행 도중 S3에 파일업로드를 원한다면 S3 취소 폴더 내 금일 일자를 폴더를 만들고 거기에 해당 취소에 따른 고유 키 폴더를 만들면 될 것이다 압축의 경우 여러..
-
CompletableFuture개발/java 2024. 9. 5. 14:19
multi Thread를 통한 성능 개선 단일 Thread를 통해 작업을 수행하게 되면 많은 서비스를 수행하는 로직에서는 동작이 다소 지연 되는 경우가 있다.이 경우 Thread를 추가하여 작업을 main Thread가 아닌 다른 Thread에 작업을 배정함으로써 속도를 향상 시킬 수 있다 그 중 CompletableFuture를 통해 성능을 개선한 사례를 소개하려 한다 CompletableFuture의 경우 ForkJoin을 통해 스레드 풀을 할당받으며 반환 값이 있는 supplayAsync method와 반환 값이 없는 runAsync를 통해 다중 스레드로 작업을 할 당 할 수 있다 또한 아래와 같이 ThreadPoolTaskExecutor를 직접 생성하여 작업별 할당 스레드를 직접 선언하는 것..
-
java stream Util 만들기개발/java 2024. 9. 4. 10:14
java에서 제공하는 stream을 이용하여 코드를 단축할 수 있다 아래와 같이 Map을 통해 그룹핑을 하는 과정이다 Map> collect = orderInfoList.stream() .collect(Collectors.groupingBy(t -> t.getTrNo()+"-"+ t.getLrtrNo()));Map collect1 = orderInfoList.stream() .collect(Collectors.toMap(t -> t.getTrNo() + "-" + t.getLrtrNo(), Function.identity(), (t1, t2) -> t1)); 우선 그룹핑을 하기 위한 조건을 보면 변수 사이를 "-"를 묶어서 키로 만드는 과정을 볼 수 있다 이를 코드화하면 아래와 ..
-
api retry하기개발/java 2024. 8. 28. 13:06
msa 구조 내에서는 api 통신이 빈번하게 발생한다. 그중 gateway 관련된 오류의 경우 일시적인 경우가 많기에 재시도를 하면 해소 되는 경우가 많다 그러므로 해당 api의 응답코드(httpStatusCode)가 502 ,504인 경우 재호출을 하여 오류 빈도를 줄일 수 있다. 재시도의 경우 아래와 같이 HttpClient 내부에서 제공하는 HttpRequestRetryHandler를 이용하는 방법이 대표적이다. HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> { if (executionCount > 3) { // retry의 maxCount를 설정하여 false를 return 하면 재시도가 중단된..
-
kafka 설계개발/kafka 2024. 8. 20. 09:20
크게 pub 브로커 sub 으로 구성된다. pub 시점에 시리얼라이즈를 통해 key와 value를 보낸다. 이를 브로커가 적절한 양을 판단 후 sub(컨슈머) 그룹에 보내게 된다. (key 단위 ) sub의 경우 batch로 받을 지 single로 받을지 판단할 수 있다. pub 주요 config ProducerConfig.COMPRESSION_TYPE_CONFIG - 압축유형 ProducerConfig.LINGER_MS_CONFIG - pub 대기 시간 ProducerConfig.MAX_REQUEST_SIZE_CONFIG -pub max 용량 ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG - key 시리얼라이즈 ProducerConfig.VALUE_SERIALIZER_CL..
-
Exception 분리개발/java 2024. 8. 19. 16:43
고객사이드오류가 발생할 경우 Exception을 처리를 보통 하는데 이 경우 고객에게 500에러를 보여줄 수는 없다 1.HttpStatusCode를 변경하고 errorMessage에 고객 사이드에서 발생 시킬 오류를 전달한다 시스템사이드 시스템 내부에서는 빠른 에러 감지를 위해 어떤 에러가 발생했는지 파악을 쉽게 해야한다 그러기 위해 Exception을 분리를 하는게 좋다 예를 들어 APIException , SystemException , MessageException 과 같은 방식이다 그 후 각 서비스 별로 Exception을 호출 하며 ExceptionHandler를 통해 Exception 별 log를 출력한다
-
Builder 패턴개발/java 2021. 12. 14. 03:39
객체에 여러 값을 주입하는 방법에는 여러방식이 있습니다. 1.생성자 주입 (Constroctor) 2.수정자 주입 (Setter) 1.생성자 주입을 사용할 경우 만약 객체 내 인자가 많아 여러 케이스가 필요 할 경우 해당 케이스별로 생성자를 만들어 줘야 합니다. 또한 인자의 순서가 중요하므로 순서를 바꿀 경우 적용 코드에서 인식을 하지 못합니다. 2.수정자 주입을 사용할 경우 생성 시점전에 빈 생성자를 호출 하고 인자를 주입하는 방식이므로 언제 어디서나 변경이 가능합니다 즉 불변 클래스가 아니게 됩니다. => 그러므로 빌더 패턴이 생겨나게 되었으며 이를 구현 하면 문제점들을 해결할 수 있습니다. 1번의 문제처럼 생성자를 인자 수에 따라 구현하지 않아도 됩니다. 인자의 순서에 영향을 받지 않습니다. 2번의..