업무에서 파라미터 유효성 체크를 할 때 각 클래스마다 checkParam의 방식으로 유효성 체크를 해왔는데, 좀 더 편하게 할 수 있는 방법이 없을까 고민했고, 이 글은 고민했던 내용을 적은 것이다. 우선은 기존에도 가지고 있었지만 사용하지는 않았던 Validation을 사용해보기로 했다. 기본적인 흐름은 다음과 같다. 1. 컨트롤러의 메서드 호출 2. @Valid 어노테이션이 붙은 파라미터의 유효성 조건 체크 3. 유효성 조건을 만족하지 못하면 ControllerAdvisor의 해당 Exception의 ExceptionHandler 어노테이션이 붙은 메서드가 수행된다. @Controller @RequestMapping("/post") public class TestPostController { @Res..
KEEP 맡은 구현부에 대하여 사전에 유효성정책으로 특수문자를 지정하여 구현하고, 다양한 특수문자를 사용한 테스트로 결함 발생을 줄일 수 있었다. 개발전 요구사항을 트리식으로 정리하고 구현 완료되었을 때 체크해가는 식으로 진행하여 개발의 진척상황을 알기 쉬웠고, 꼼꼼한 개발이 가능했다. 대량 데이터를 미리 염두에 두고 테스트하여 Out of memory가 나는 부분을 찾아 해결할 수 있었다. 자세한 내용은 여기로. PROBLEM 개발방향에 대해 미리 얘기했고, 개발 완료했는데 수정개발해야할 사항이 발생했다. PM이 바쁜 탓도 있었지만 나도 PM이 충분히 살펴봤겠거니 생각했는데, 알고보니 내 분량을 하나도 살펴보지 않은 상태였고 수정개발을 요구했다. 개발계획을 세우는 것과 개발하는 것도 중요하지만 내가 확..
자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 세 가지가 있다. Error Exception과 CheckedException java.lang.Exception 클래스와 그 서브클래스 + Exception 클래스의 서브클래스이면서 RuntimeException 클래스를 상속하지 않은 클래스 컴파일시 예외처리가 되어있는지 확인 -> Checked RuntimeException과 UncheckedException java.lang.Exception 클래스의 서브클래스이면서 RuntimeException을 상속한 클래스
이번 개발건에 대용량 파일 업로드가 있어서 대리님이 실험을 해보라고 하셨고, 위 세 가지를 이용하여 테스트해보았다. Case#1 MultipartFile.getByte multipartFile.getByte로 바이트배열을 받고 그 바이트배열을 FileOutputStream을 이용하여 쓰는 방법이다. 1기가 파일을 업로드한다고 했을 때 위와 같은 결과가 나왔다. 항목에 대해 설명하자면, 첫번째 Max Heap은 최대 Heap 사이즈, used(before)은 작업 전 Heap 사이즈, used(after)는 작업 후 Heap 사이즈, used(gc-after)는 GC 후 Heap 사이즈이다. 위와 같은 경우, 작업 후에 메모리를 많이 차지하는 걸 알 수 있다. Case#2 MultipartFile.tran..
정신없이 업무를 하고 공부를 하다보니 어느새 만 1년차가 되었다. 갓 입사했을 때의 나와 비교하면 많이 성장했구나싶다가도 아직 많이 부족하다는 생각이 든다. 첫 회사에 입사하면서 업무를 통해 얻어가고 싶은 것들을 적었었다. 첫번째는 지금 회사에서는 가장 큰 부분이 빠졌긴 했지만 70%정도는 달성했다고 생각한다. 다음 회사는 그 빠진 가장 큰 부분을 채워줄 수 있는 곳으로 가고 싶다. 그리고 두번째는 내가 먼저 자발적으로 코드리뷰를 요청하고 내가 사용하는 언어를 좀 더 깊게 공부함에도 잘 채워지지 않는 부분이다. 방법은 최대한 많은 코드를 살펴보고 작성해보는 방법뿐인 것 같은데, 이 부분이 부족했다는 생각이 든다. 아래부터는 간단하게 지난 1년을 KPT로 정리해보았다. Keep 업무외 시간을 꾸준히 공부에..
오늘부터 금요일까지 오라클의 SQL 성능 튜닝 관련 교육을 듣게 되었는데, 오늘 들은 첫 강 내용을 여기에 정리해둔다. OLTP: 많은 유저가 트랜잭션을 멀티로 발생시키는 것 DLAP: 소수의 파워유저들이 많은 데이터를 이용하는 것(예를 들자면, 통계) 튜닝을 알기 전에 먼저 SQL이 어떻게 처리되는지 그 구조를 알아야 한다. 기본적으로 사용자가 SQL로 요구를 하면 Optimizer가 SQL을 해석하고 실행계획을 작성하고 실행한다. SQL을 해석하고 실행계획을 작성하는 데 있어서 DATA Dictionary를 참조한다. 이때 DATA Dictionary는 인덱스정보, 데이터 건수 정보 등을 담고 있다. 오라클은 인스턴스 여러 개가 하나의 storage를 바라보는 식이다. 하나의 인스턴스 안에는 Buff..
쿠버네티스에서 Pod는 애초에 쓰고 버리고 새롭게 시작할 수 있게 설계되어 있다. Pod의 IP주소는 기동시 부여되고, 종료시 회수되기 때문에 Pod가 죽고 다시 살아날 때 IP주소가 변경된다. 그렇기 때문에 Pod의 IP주소로 Pod에 접근할 수 없다. 그래서 Pod에 접근하려면 Service를 사용해야 한다. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR clusterip-nginx ClusterIP 10.104.201.2 80/TCP 5m34s app=nginx-app 위와 같은 서비스가 있다고 해보자. ClusterIP로 된 Service이다. 이 서비스는 app=nginx-app인(key-value 구조) Pod들에 접근할 수 있는 서비스이다. ..
프로젝트가 막바지에 이르고 있어서 요즘은 테스트를 진행하고 있는데, 지난 프로젝트(엑셀업로드를 통한 대량등록 성능 개선의 건)를 통해 대용량 데이터를 다루는 경우를 항상 염두에 둬야 한다는 것을 배웠기 때문에 이번에도 테스트데이터로 150만건 정도를 준비했다. 데이터를 150만건이나 만들려고 보니 프로그램으로 돌리는게 빠르겠다싶어서 대용량 더미데이터를 만들어주는 프로그램을 짰다. 그래서 그 데이터로 테스트를 하다가... out of memory(GC Overhead limit exceed)를 만났다. 대리님께 이 기능에서 out of memory가 발생한다고 말씀드렸더니 Jmap, Jhat으로 메모리 덤프 분석해서 원인을 찾아보라고 하셨다. Jmap과 Jhat을 처음 들어서 찾아보니 Jmap은 JVM 모..