Java

    Spring Boot 업그레이드 이후 운영 환경에서 발생한 Dialect 이슈 정리

    개요보안 및 정책 변경 이슈로 인해 기존 서버의 스프링 버전을 2.4.2 → 2.7.11로 업그레이드했다.업그레이드 후 테스트 코드(커버리지 약 80%)를 작성해 검증했고, 약 한 달간 개발/스테이징 환경에서 실제로 서비스를 띄워 충분히 테스트를 진행해 문제없음을 확인했다. 하지만 운영 배포에서 예상하지 못한 장애가 발생했다.문제운영 배포 후 모든 서버에서 JPA Repository 실행 시 테이블을 찾지 못하는 오류가 발생했다.운영 환경은 jpa.hibernate.ddl-auto: validate 설정이었고, Hibernate 의 스키마 검증 단계에서 공통적으로 아래 오류가 발생했다.missing table … 긴급하게 원복한 후 원인 분석을 시작했다.원인개발/스테이징에서는 문제가 없었지만 운영에서만..

    Spring ResponseEntity Stream 처리 관련 오류

    admin 웹 페이지에서 사용하던 문서 다운로드 기능이 배포 후 갑자기 안되는 오류를 발견 오류servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.io.IOException: Stream closed 원인spring에서는 stream은 응답할때까지 close하면 안된다. spirng에서 응답 후 close 해주는데 이미 close가 되버려서 생긴 오류 디버깅controller->service->db->service->controller 내부에 있는 log는 모두 잘 찍혀 있었고 이후에 response filter에서 해당 오류가 찍혀있었다. 수정 코드를 확인하니 최근에 스패로우 관련 정책..

    레거시 스케줄러에 배치 처리 방식 적용하기

    기존 프로젝트에서 레거시 스케줄러 코드에 배치 형식을 적용한 코드를 공유한다. 레거시 스케줄러에서도 배치 형식을 적용되어 있었다(ex. 백만건 -> 1000건 단위 배치 작업)1000건을 threadPoolExecutor(thread-size : 10)를 사용하여 작업을 처리 하였는데 [AS-IS] for(File file : fileList){    threadPoolExecutor.submit(new BulkFile(file,....));} 이렇게 submit이 1000번 호출되고 10개는 스레드 풀이 작업을 나머지 990개는 queue에 쌓였다(스레드가 하나씩 가져와서 작업).스레드가 하나씩 가져와서 작업하는 방식은 context-switching이 자주 발생하고 불필요한 오버해드가 많이 발생해서 ..

    자바 기초1

    get/set : 정보은닉 둘중 하나만 제공해서 필요한 것만 사용하게 하거나 멤버변수에서 값을 받을 때 원하는 형식을 받기 위해 사용 변수를 핸들링 하기 위해 사용 지역변수 : 사용하고 사라짐 맴버변수 : 인스턴스에서 사용되고 사라짐, int, char, double 초기화하지 않으면 맴버변수는 0,null로 초기화 됨 참조변수 : String, 객체 클래스변수 : 데이터 메모리에 올라가서 프로그램 종료시 사라짐 static : 로딩될때 데이터 메모리에 올라가서 프로그램 종료시 사라짐 공통적으로 사용하거나 고정된 값을 메모리놓고 쓸 때 사용 메모리 구조 : 데이터 메모리 - 스택 메모리 - 힙 메모리 데이터 메모리 : static 메모리, 프로그램 종료 시 사라짐 스택 메모리 : 함수 실행시 올라갔다가 ..