목록전체 글 (15)
베베개발자
이전에 성능 튜닝을 하면서 이것저것 많이 부딪혀보았는 데, 그 이후부터 성능 이슈가 생기면 자연스럽게 내게 튜닝 요청이 오기 시작했다. 이번에도 고객사에서 조회 메뉴의 속도가 너무 느리가는 요청이 들어왔다.느린 해당 메뉴는 단순 조회(페이징 처리 있음)한 후에 해당 데이터에 필요한 정보를 each문에 담고 있는 로직이다. 연구소에서는 약 8,476건을 조회하는 데 2.77초 현장에서는 정확한 건수를 알 수 없지만 20초 이상이 걸리고 있는 상황이였다. 우선 예전처럼 가장 먼저 조회 대상(모수)을 줄일 수 있는 지부터 확인했다.성능 튜닝을 할 때 가장 먼저 보는 것은 SQL이 아니라 불필요하게 많은 데이터를 읽고 있는 가를 확인하는 거라고 생각한다. 그래서 조건을 확인하는 데, 고객사 요청으로 기본 검색 ..
운영계 패치 후, 서버 기동하다가 NullPointerException이 발생했다.원인을 분석해 보니 옵션 값을 boolean으로 선언했는 데, 설정 파일(Property)에 해당 옵션이 존재하지 않아 Null이 전달되면서 예외가 발생한 것이었다.이 경험을 통해 Boolean과 boolean의 차이가 무엇인지 정리를 하면서 원시타입과 참조타입도 간단하게 정리해보려고 한다.boolean 데이터 타입boolean은 원시타입(Primitive Type)에 속하는 데이터 타입이다.원시타입은 객체를 생성하지 않고 실제 값을 직접 저장하는 데이터 타입을 의미한다. Java에서 데이터를 저장하는 방식은 크게 값 자체를 저장하는 방식과 객체의 주소를 저장하는 방식으로 나눌 수 있다.이 중 원시타입인 boolean은 첫..
오늘 운영계 패치 후 서버가 정상적으로 기동 되지 않는 문제가 발생했다.개발계 패치 시에는 정상적으로 기동이 되었기 때문에, 처음에는 운영계 패치 파일이 누락된 것은 아닐까 의심했다.일단 정상적으로 서버가 기동이 되지 않아 기동로그를 추출한 후에 원복 하여 재기동을 진행하였다.에러 로그를 확인하니 NullPointerException이 발생한 상태였다.기동 과정에서 어떤 데이터를 읽지 못하는 것인지 확인하면서, 패치 누락 여부도 함께 점검하였다.운영계와 개발계의 패치 내역을 하나씩 비교해 보니, 이번 기능 개선 과정에서 추가한 option이 운영계 properties 파일에는 정의되어 있지 않은 것을 확인했다.원인 확인하기를 위해 개발계에서도 동일하게 해당 option을 제거한 뒤 기동해보니, 운영계와 ..
일을 하다 보면 자주 요청 오는 것 중에 하나가 성능 튜닝이다.조회 화면이 많은 제품이다 보니 데이터가 쌓일수록 조회 속도가 느려지고, 유지보수 사이트에서는 조회 메뉴의 성능 개선 요청이 자주 들어온다. 보통은 회사 소속 성능튜닝 담당자가 현장에 방문해 힌트를 적용하거나, 고객사 DBA가 튜닝한 SQL을 전달해 주면 해당 SQL을 제품에 적용한 뒤 조회 결과가 기존과 동일한지, 데이터에 문제가 없는지만 확인하는 경우가 대부분이었다. 하지만 이번에 담당한 사이트는 이미 성능 튜닝 담당자가 방문한 상태였지만, 5개의 메뉴가 평균 20~30초 심한 경우 1분 이상 걸리는 상태였다.결국 다시 튜닝 요청이 들어왔고 이번에는 직접 튜닝을 하게 되었다. 첫 튜닝 시도사실 SQL 튜닝을 제대로 해본 적이 없었다. 그래..
전수 테스트를 위해 구성해 둔 서버가 어제부터 계속 멈추는 현상이 발생했다. 처음에는 디버그 모드로 며칠 동안 사용하면서 로그가 많이 쌓여 용량 부족으로 발생한 문제라고 생각하여 로그 파일을 정리해 보았지만 동일하게 서버가 먹통이 되는 현상이 계속 발생했다. 연구소에 방문한 기술지원팀 소속 담당자에게 현재 상황을 설명하고 서버 점검을 요청하였는데, 서버가 죽은 것이 아니라 멈춰있는 상태이며 서버 자체 문제는 아닌 것으로 보인다는 의견을 받았다. 왜 서버가 멈추는지 고민하던 중, 테스트를 진행하던 담당자가 특정 메뉴에서 신청을 3번 수행하면 멈춘다는 이야기를 해주었다.그 이야기를 듣고 IntelliJ로 직접 기동하여 동일한 조건으로 테스트해보니 동일한 멈춤 현상이 발생했다. 먼저 DB Lock이 걸려있는지..
사이트 요청으로 연구소에서 제품 전수 테스트를 진행해야 하는 상황이 발생했다.최대한 사이트 환경과 동일하게 테스트하기 위해, 제품 3 버전에서 데이터를 생성한 뒤 초기 데이터만 설정되어 있는 제품 4 버전으로 데이터를 옮겨 테스트 환경을 구성하기로 했다.이 과정에서 DB Link를 이용하여 데이터를 옮기는 방법을 선택했다.DB Link를 생성하고 데이터를 확인하려고 했지만, 제품 3버전 DB와 제품 4 버전 DB가 서로 다른 네트워크 영역에 있어 방화벽을 열지 않으면 연결이 불가능한 상황이었다.방화벽을 열어 연결하는 방법도 고려했지만, 제품 4 버전 환경에 초기값만 설정된 제품 3 버전 DB가 존재하는 것을 확인하여 해당 DB를 활용하기로 했다. 먼저 해당 데이터를 기반으로 제품이 정상적으로 동작하는지 ..
사이트 대응을 위해 사이트처럼 데이터를 가공하기 위해서 제품 v3 데이터를 제품 v4 DB에 데이터를 옮겨야 하는 작업을 해야 한다.제품 v4에서 데이터를 만들어서 테스트할 때는 오류 없이 정상적으로 작동이 되어 배포를 하였지만, 현장 데이터로 하면 오류가 발생하여 문제가 생겼다. 그래서 차이가 데이터 마이그 여부가 아닐까라는 생각에, 제품 v3에 있는 데이터를 제품 v4에 옮기는 작업을 하려고 한다.겸사겸사 마이그 연습이기도 하다. 마이그를 할 때, 데이터를 옮기는 방법이 다양하지만 이번에는 DB Link를 사용하여 비교적 간단하게 데이터를 옮겨보려고 한다. DB Link 연결하는 법이해하기 쉽게 A DB(제품 v4)에서 B DB (제품 v3)로 연결을 한다고 한다.DB Link를 연결하기 위해서는 몇..
대략 한 달 넘게 고생을 하면서 해당 사이트에서 사용하는 메뉴의 @SessionAttributes를 제거하였다.이후 연구소 이중화 테스트 서버에서 검증을 진행하였고, 적용한 모든 메뉴에서 끊김이나 데이터 유실 없이 정상적으로 동작하는 것을 확인했다. 다만, 일부 메뉴에서 DB 조회 방식으로 변경되면서 속도 저하가 발생하였고, 해당 부분은 1차 패치 이후 나머지 메뉴 적용 전에 속도 저하가 발생한 부분을 수정하기로 결정하였다. 기능이 정상적으로 동작한다는 것을 사이트에 전달하기 위해서, 결과보고서를 작성하여 사이트에 제출한 후에 개발계 패치를 진행하였다.사이트 개발계는 이중화 상태가 안되어있어 이중화 오류를 확인하는 것이 아닌 사이드 이펙트 없이 기능이 정상적으로 동작하는지에 초점을 맞춰 검증을 진행하였다..
회사에서 @SessionAttributes 제거를 하면서 애를 먹었던 이슈 중 하나가 엑셀업로드 할 때, Excel과 함께 parameter들이 제대로 넘어오지 못하고 에러를 뱉는 것이었다.기존에는 서버가 @SessionAttributes로 필요한 모든 정보를 가지고 있어서 @RequestParam으로 엑셀 파일만 전달하면 되어 문제가 없었지만 해당 로직을 수정하면서 2가지의 문제가 발생하였다. 1. 엑셀 파일과 필요한 정보(Json)를 전달해야한다.2. 엑셀 파일 + Json 정보가 정상적으로 바인딩되지 않음 이를 어떻게 해결을 할지 고민을 하면서 AI를 도움받아 알게 된 것이 @RequestPart였고 해당 어노테이션을 활용해 기능을 수정했다.그럼 도대체 그 두 개가 뭐가 다르기 때문에 @Requ..
현재 제품 유지보수 및 개발을 하고 있는 제품은 DB종류에 따라서 각 DB 전용 XML 쿼리를 분리하여 실행하는 구조로 되어있다.그렇기 때문에, 한 DB의 쿼리를 수정하거나 개발하게 되면 다른 DB에 맞게 문법을 변경한 후 적용해야 한다. 이런 작업을 할 때, 자주 놓치는 부분이 하나가 있는 데, 바로 NULL과 공백의 차이다.(그리고 오늘도 이 차이 때문에 조건을 다시 수정하고 있다…) 1.Oracle - 공백은 Null이다.Oracle에서는 공백을 Null로 취급한다.이런 식으로 Oracle에서- 공백 > Null- Null > NUll로 취급하고 있다.즉 , 공백과 Null을 구분하지 않는다. 따라서 조건을 아래와 같이 작성하게 되면 공백과 Null 둘 다 조건에 걸리게 된다.WHERE colu..
