본문 바로가기

SearchDeveloper/Java

(7)
[Webflux] nested flatMap 지옥 해결하기 상황아래 로직을 구현한 코드가 flatMap 안에 flatMap 이 포함되어 있다. 코드 라인이 길고 들여쓰기가 많아서 가독성이 그리 좋지 않아 보인다.1번 작업 실행1번 작업 결과가 0이면 에러 던지기1번 작업 결과 후처리 (prefix 변수에 저장)1번 결과 받아서 2번 작업 실행2번 작업 결과가 0이면 에러 던지기2번 결과 받아서 3번 작업 실행1번 작업 결과 + 2번 작업 결과 + 3번 작업 결과 더해서 반환※ 각 작업은 1초 잠든 후 숫자를 반환한다.public Mono nestedFlatMap() { AtomicReference prefix = new AtomicReference("Prefix"); return _1번_작업() .flatMap(fir..
ListenableFuture 의 Callback Hell 해결하기 ※ 이 글은 정보 전달의 목적보다는 토비님의 강의를 참고하여 ListenableFuture 을 메소드 체이닝으로 리팩토링하는 과정 기록입니다. Future vs. ListenableFuture Future 멀티스레드 작업 시 사용하는 ExecutorService 에서 작업 결과를 받거나 기다리기 위해 Future 클래스의 future.get() 메소드를 사용했을 것이다. 하지만 get() 은 작업이 끝날 때 까지 blocking 되어 다음 라인으로 내려가지 못한다는 한계가 있다. ListenableFuture 하지만 ListenableFuture 은 가능하다! 비동기 프로그래밍 패턴으로 구현되어 있기 때문에 작업스레드! 너 끝나면 이 콜백메소드 실행해! 하고 던져주고 바로 다음으로 넘어가기 때문이다. 💡..
[JPA] 영속성 컨텍스트(Persistence Context) : 엔티티 관리 공간 영속성 컨텍스트(Persistence Context) 엔티티를 관리하는 논리적인 공간이다. DB 와의 동기화를 위해 엔티티 변경 정보를 관리한다. 엔티티를 등록, 해제할 수 있어 그 상태를 관리하는 엔티티 생명주기가 존재한다. 엔티티 생명 주기 em.persist(member); 를 하면 Member 객체가 영속성 컨텍스트에 등록되어 commit 시 CRATE 쿼리로 변환해 실행하여 DB와 동기화를 한다. persist() 호출 전인 객체(비영속) 나 detached(준영속)나 removed(삭제) 된 엔티티는 아무리 setter로 데이터를 변경하거나 무슨 짓을 해도 DB 에 반영되지 않는다. 영속성 컨텍스트는 그 사실을 모르기 때문이다. flush(): 영속성 컨텍스트와 DB 를 동기화하는 메소드 쓰기..
Java 애플리케이션 메모리 누수(Memory leak) 잡기 - jstat, MAT 결론 💥 건 수 많은 데이터 처리할 때 Nested Map 사용 주의! 1. 작업 내용 File To MongoDB 애플리케이션을 개발해야 한다. raw 파일 데이터에서 “idx” 필드를 KEY 로 잡아 그룹핑 후 “seq” 순으로 “item”값을 연속으로 붙여 MonoDB 에 적재하는 작업이다. raw 파일 데이터는 2GB에 1100만 건으로 건수가 굉장히 많은 형태라 속도 측면에서 걱정이 많았다. 그렇게 개발을 끝내고 애플리케이션을 실행했고.. application.log 2022-09-28 09:15:40.894 save start... 10000/2900873 2022-09-28 09:16:05.654 total count: [1507616] after saving // 25 초 ... 2022-..
Java 에서 테스트용 도커 컨테이너 띄우는 법 : TestContainer 도커 컨테이너에 접근하는 프로젝트에서 테스트할 때의 컨테이너는 어떤 걸 사용하시나요? 혹시 서버에서 실운영되고 있는 컨테이너를 바라보고 있나요? 엇 그러면 만약 어떠한 이유에 의해 컨테이너 안 애플리케이션의 설정이 변경되었다면... 그래서 어제와 같은 소스인데도 불구하고 테스트가 실패한다면... 억울해!! 멱등성(idempotent) : 연산을 여러 번 적용하더라도 결괏값이 달라지지 않는 일 프로젝트 테스트 환경에서 멱등성은 중요한 속성입니다. 내가 짠 소스에 대해서만 테스트하는 것이 목적이기 때문에 외부 환경이 테스트 결과에 영향을 미쳐선 안되니까요. 그래서 독립적인 테스트 환경을 구축하기 위해 테스트할 때만 잠깐 사용할 컨테이너를 띄어주는 게 testContainer가 해주는 일입니다! 디펜던시 te..
[JAVA] stream 코드 스니펫 JAVA 8 부터 도입된 stream. 내가 사용했을 때 느꼈던 가장 큰 장점은 데이터가 어떻게 흘러가는지가 문장읽듯이 읽혀서 코드 가독성이 좋다는 점이다. 처음에는 사용법을 잘 몰라 어려웠지만 하나씩 하나씩 작성해보니 꽤나 익숙해졌고 코드 짤 때도 stream의 비중이 높아지고 있다. 다음은 내가 작성했던 stream 관련 코드 예제이다. 배열 출력하기 /* 배열 출력 */ String[] alphabetArr = new String[]{"A", "B", "C"}; Arrays.stream(alphabetArr).forEach(alphabet -> log.info(alphabet)); stream 함수 안에서 여러 문장 실행하기 List personList = new ArrayList(); /* 멀티 ..
[번역] Pro Java Programming - 자바 아키텍쳐 자바는 "간단하고, 건장하고, 객체 지향적이고, 플랫폼 독립적이고, 멀티쓰레드이고, 역동적이고, 범용적인 프로그래밍 환경'이라고 묘사되어져 왔다. 이에 따라 자바는 알아차릴 수 없을 정도로의 다양한 환경으로 확장되었다. 최근에는 마이크로 프로세서에도 자바를 사용한다. 자바를 큰 기업체에서도 작은 부품들을 위해 사용하고, 핸드폰에서 주 컴퓨터같은 장치에도 사용한다. 이렇게 다양한 범위의 환경을 지원하기 위해 코어 클래스들을 중심으로 많은 API들과 버전들이 발전되어졌다. 좋은 자바 프로그래머가 되기 위해, 기초를 잘 아는 것이 중요하다. UI가 아무리 좋아도, 코드는 많고, 메모리가 부족하다면 유저는 행복하지 않을 것이다. 이 책은 자바개발자로써 다양한 개발을 가능하게 해주는 것이 아닌 독자가 매일 마주칠..