본문 바로가기

개발노트/JAVA

(8)
OOM 맞고 나서 알아본 apache poi xlsx 레거시 코드에서 csv 를 생성해주는 코드(csv 다운로드 기능)가 여러 이유로 아직도 쓰이고 있다. 로직은 xlsx 를 생성하고 이 xlsx 로부터 데이터를 읽으며 csv 를 쓰는 로직이었다. 오래된 코드(무려 2013년!)이고, 다 퇴사를 해버린데다 히스토리 관리가 잘 안 돼있어서 왜 xlsx 를 먼저 생성하는지 정확한 이유를 찾진 못했지만, 이미 xlsx 다운로드 기능을 먼저 만들어놔서 그것을 활용하는 게 더 낫다고 판단이 됐었나 보다. 그러던 중, 어제 약 23,000 rows 에 대한 csv 다운로드 요청이 OOM 을 유발하며 서버가 죽는 현상이 발견되었다. (컬럼수도 493개였음) xlsx 를 생성할 때 Workbook 의 인스턴스 타입을 XSSFWorkbook 으로 되어있었는데, 해당 인스턴..
Apache poi 이용하여 excel 에 아주 많은 이미지 넣을 때 급격히 느려지는 현상 우회하는 야매 방법 5000개 가량의 이미지가 apache poi 로 생성되는 엑셀 파일에 삽입되어야 하는 needs 가 있었는데, apache poi 라이브러리에서 병목 구간이 있어 이를 찾아내고 우회하는 방법을 정리해두면 나중에 급할 때 이런식으로라도 문제를 해결할 수 있음을 확인하기 위해 정리해본다. 몇시간을 날려먹었는지... 옛날 프로젝트라 apache poi 3.15 버전이 dependency 로 import 되어있었다. 프로젝트 빌드 툴은 maven 기반이었다. 디버깅으로 각 메소드 호출이 느려지는 부분을 찾아 들어가보니 `POIXMLDocumentPart` 의 `addRelation` 메소드에서 `findExistingRelation()` 메소드를 호출하는 것이 병목 구간임을 알 수 있었다. private Pa..
CompletableFuture, parallelStream, ExecutorService 사용 시 주의점 좀 자세히 정리를 하고 싶지만, 코드 리뷰 중 오갔던 대화 내용 정도만 정리하기로... This comment has been minimized. Show comment Hide comment Copy link Quote reply Edit Unhide Delete leewin12 3 hours ago 여기선 default forkJoinPool이 사용될 것 같은데, 맞을까요? CustomForkJoinPool과 default ForkJoinPool이 섞여 있는 것 같습니다. Write Preview Select a reply ctrl . The content you are editing has changed. Please try again. 여기선 default forkJoinPool이 사용될 것 같은..
Spring Eureka 관련 정리 On-premise IDC 환경에서 운영중인 서버들을 Cloud 환경으로 이전하기 위해 부딪힌 몇가지 문제가 있었다. 이 문제들을 해결하기 위해 알아본 자료들을 정리해두면 후에 도움이 많이 될 것 같아 정리를 해 봄. 상황 1. 기존에는 VPN 을 통하였기 때문에 내부간 트래픽은 http 로 해도 안전하다고 여겨지고 있었음 2. Loadbalancer 트래픽 마저 VPN 의 트래픽을 점유하고 있었으므로 불필요한 성능 저하 유발 3. Cloud 환경에서는 가능한 VPN 을 타지 않고 `외부 트래픽 + 같은 서브넷 트래픽` 으로만 구성하는 것이 목표 4. Loadbalancer 에서 앱 서버(서비스)에 접근하기 위해서는 plain http 보다 https 로 전송해야 여러 공격으로부터의 최소한의 보안 레벨을..
[JPA/Hibernate] When using custom class as a field of entity along with JPA (Hibernate) 아래와 같은 Entity 클래스가 있다. 이 클래스는 `ClientCustomConfig` 라는 내가 정의한 타입을 인스턴스 변수로 쓰고 있다.이런 경우, 주의해야할 점이 있어서 기록을 한다.Entity Client123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657@Getter@Entity@Table(name = "`client`")@EntityListeners(AuditingEntityListener.class)public class Client implements Serializable { private static final long serialVersionUID..
[IntelliJ] JDK 9 이상에서 java.time package를 못 찾는다고? 며칠전 우분투에서 JDK를 OpenJDK 10으로 업그레이드를 했었는데, IntelliJ build 를 수행할 때 java.time 패키지를 못찾는다면서 에러가 떴다. 여기서 Target bytecode version 에서 1.8 버전으로 설정! 기존에도 1.7로 되어있었던 것 같은데 아닌가? 참고 # https://www.jeffryhouser.com/index.cfm/2018/2/1/Why-cant-IntelliJ-find-javatime-with-JDK-9
Spring에서 Multi-Sources JPA 사용할 때 주의점 LazyInitializationException 멀티 DB source JPA에서 OneToMany, Lazy fetch 할 경우 @Transactional(transactionManager = "jpaTransactionManager") 처럼 transactionManager를 명시적으로 지정해줘야 함!
[Spring][IntelliJ] SpringBoot HotSwap with IntelliJ [2019-02-19 Updated] 참고 : https://stackoverflow.com/questions/35895730/spring-boot-devtools-static-content-reloading-does-not-work-in-intellijhttps://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html 1. build.gradle 파일의 의존관계 설정 (spring-boot-devtools)compile('org.springframework.boot:spring-boot-devtools') 2. 인텔리J 설정(Ctrl + Alt + S)Settings > Build, Execution, Deployment > Compiler 메뉴에서 Bu..

반응형