본문 바로가기

SearchDeveloper/Java

(6)
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가 아무리 좋아도, 코드는 많고, 메모리가 부족하다면 유저는 행복하지 않을 것이다. 이 책은 자바개발자로써 다양한 개발을 가능하게 해주는 것이 아닌 독자가 매일 마주칠..