본문 바로가기

분류 전체보기

(116)
회계 같은 정교한 계산이 필요한 경우에는 BigDecimal이 필수다 자바를 사용할 때, 소수점 계산을 해야하는 경우 BigDecimal을 사용해야 한다. Double, Float은 기본적으로 소수점 자리 계산이 정교하지 않기 때문이다. (메모리 용량의 한계) 계산 시, BigDecimal 타입으로 변환이 가능한지 확인하는 NumberUtils.isDigits(a) 함수는 꼭 사용하자. 검증이 완료된 값을 받아서 사칙연산이든 뭐든 숫자 계산을 한다. 계산 후, 반환타입이 int, Long이라면 타입변환하여 반환하면 된다.
이클립스 기본세팅 완벽하게 정리해보기 프로젝트를 다니면 기본 윈도우만 설치된 상태에서 세팅을 해야만 한다. 작성용 프로그램으로는 대표적으로 이클립스가 있으며 이클립스 기반으로 개조된 수많은 특화 이클립스(?)도 존재한다. 그 외에는 젯브레인스 사에서 제공하는 인텔리제이 기반 프로그램도 한 축을 담당한다. 안드로이드 스튜디오, 인텔리제이 울티메이트 등은 인텔리제이 기반이다. 두 프로그램은 세팅 방법은 다소 다르지만, 해야할 세팅 자체는 동일하다. 그렇다면 일단 SI라면 더 자주 만나볼 이클립스에서 세팅해야할 것을 명확하게 알아두면, 해당 세팅을 인텔리제이에서도 방법만 찾으면 쉽게 적용할 수 있을 것이다. 그런 의미에서 구체적으로 이클립스 세팅에는 어떤 프로세스가 존재하는지 알아보기로 했다. 0. 사용할 도구의 환경변수 설정 언어를 어떤 것을 ..
SI에서 연봉협상이란? 너무나 무섭고 설렜던 첫 연봉협상이 끝을 보이고 있다. 2월부터 최대한 다양한 회사에 접촉해보고 여러 사람에게서 실제로 얼마를 받는지, 연차에 따른 연봉 테이블은 어떤지 알아보느라 거의 모든 시간을 쏟았다. 내가 얻은 정보가 신뢰할 수 있는 수준인지, 신뢰할 수 있다고 믿은 정보를 바탕으로 내가 회사에 내 연봉 인상을 위해서 제안을 할 수 있는지 많이 따져보았다. 핵심은 회사의 수입구조라고 판단을 내렸다. 기업별 연봉테이블이란 결국 그 회사의 수입구조에 직접적으로 영향을 받는다. 회사에 사장 혹은 임원급이 있다 (이하 경영진). 경영진은 특정한 기업과 다양한 조건을 걸고 계약을 맺는다. 계약을 수행할 사람을 뽑는다. 이런 조건 하에 모인 사람들이 직원이다. 직원은 회사가 맺은 계약을 실질적으로 수행하며 ..
map에서 null을 배제하고 싶다면? 개발을 해볼수록 가장 까다로운 것이 NULL 값에 대한 처리방식이다. 앞단에서 미리 처리했을 가능성도 있지만, 개발 도중에는 NULL 값 처리가 안됐을 가능성도 있고, 다른 개발자가 깜빡 잊었을 가능성도 있다. 일단 정상적인 테스트를 위해서는 NULL 값을 배제하는 것이 옳을 경우에 map에서는 getOrDefault 메서드를 사용하자. var map = new HashMap(); map.put("one", "하나"); map.put("two", "둘"); map.get("three"); // expect: null map.getOrDefault("three", "셋"); // expect: "셋"
실전에서 함수를 리팩토링하는 현실적인 방법은? 어떤 일을 하는 함수를 만들었다고 치자. 해당 함수의 조건부만 다르고 그 외에는 모든 곳이 같다. 그렇다면 해당함수를 반복해서 사용하려면 어떻게 해야하는가? 시간이 촉박한 현실적인 SI 업무에서 리팩토링을 진행하려면, 그냥 해당 함수를 다시 함수로 감싸는 방법을 사용하는 것이 괜찮은 것 같다. 조건부만 다르다면, 조건부에 들어갈 함수를 매개변수로 받아서 넘기는 방식이다. 이런 식으로 어떤 함수를 한 단계 외피(?)를 만들어서 내부의 값을 유동적으로 다루는 것. 이런 것을 추상화 단계를 높인다라고 표현한다. 또한 추상화 단계가 높아진 함수를 응용함수라고 부른다. (혹은 고차함수) 30세 이상, 50세 미만, 80세 초과 이런 식으로 조건만 다를 때 이런 방식을 사용하면 생산성이 확실히 늘어난다!
분석 업무라는 것이 별도로 있더라. 개발, 설계 외에도 AS-IS의 로직 흐름을 파악하는 분석이라는 업무가 별도로 있다는 것을 알았다. 규모가 있는 프로젝트에서는 분석을 담당하는 개발자가 별도로 있다고 한다. 하지만, 소규모거나 망한(?) 프로젝트에는 그런 것은 없고 개발자가 분석 및 개발을 모두 담당한다고 한다. 그러려니 했는데, 이게 의외로 분쟁의 영역이 되기도 한다고 한다. 개발 외에도 분석까지 같이 진행하면 추가적인 비용을 요구하거나, 업무 자체를 거부하는 경우도 심심찮게 있다고 한다. 이 파트는 신규 프로젝트를 개발하는 단계에는 없는 단계였다. 현실적으로 차세대 프로젝트에서 기존에 사용되는 업무가 왜 그렇게 사용되는지 정확히 알 수가 없으니 추가된 단계라고 보인다. 작업을 하다보니, 이렇게 실질적인 업무 별로 추가되는 절차가 존재..
기존 업무 외 추가 업무 요청이 들어오면 어떻게 해야하는가? 기존 업무를 진행 중, 일정에는 안 잡혀있고 소요되는 시간은 상당히 길 것으로 예상되는 업무에 대한 협조 요청이 들어온다면 어떻게 대처해야할까? 이미 작성한 서비스에 대한 수정 요구사항이 들어왔다. 단순하게 조금만 손 보면 되는 것이 아니라, 참조하는 테이블을 수정하고 업무구분에 따른 별도의 쿼리를 작성해달라는 요구였다. 그런데 문제는 해당 서비스는 이것저것 총괄하여 보여주는 통합형 서비스라서 들어있는 쿼리가 상당히 많았다. 대략 서비스 개발에만 2주일이 넘게 걸렸다. 해당 서비스 쿼리 수정은 작성에 비하면 규모는 적으나 최소한 일주일 이상은 잡아야 할 문제였다. 서비스 뿐 아니라 화면에 요구하는 전문또한 변경해야 했기 때문에 화면 - 서비스 - DB를 모두 변경해야 하는 작업이다. 문제는 해당 업무는 ..
NullPointerException은 언제 발동하는가? Null 값을 잡기 위해서 catch(NullPointerException) {} 메서드를 이용해봤지만, null 값을 제대로 잡질 못했다. 값이 null이면 발동하는 게 아니었나? 정확한 발동 조건을 찾아봤다. 실제로 try 내부 연산으로 null이 변수에 할당될 때 발동하는 것이 아니었다. null이 할당된 변수를 참조할 때 그 때 NPE가 발생하는 것이었다...! try catch를 사용할 때는 다음을 조심하자. 1. null 값을 캐치하려면 if 문을 사용하여 null 값 자체에 대한 예외를 잡자. 2. NPE는 해당 변수를 try 내부에서 할당받아서 연산하는 추가적인 문장이 있을 경우에만 발생한다!
DTO에 무엇을 담아야 적절할까? 자바 - 스프링 프레임워크 혹은 스프링 부트를 기반으로 사용했다면 DTO, VO, Entity 등 필요한 값만 정의한 객체를 흔히 봤을 것이다. 만드는 것은 정말 단순하지만, 응용하기에 따라서 DTO, Entity 등 영속성과 변동성 문제 때문에 역할을 나누는 등 DTO 하나를 가지고 여러 방법으로 정의할 수 있다. 내가 실질적으로 여러 번 만드면서 고민한 것은, 과연 DTO에는 어떤 값이 들어가야 적절한가? 이것이다. 1. DTO 기존에는 로직처리에 들어가는 모든 값을 담으면 객체 하나로 필요한 변수를 모두 파악할 수 있으니 편하리라 생각했다. 하지만 기존에 딱 전달할 데이터만 담아서 만든 프로그램의 경우는 위와 같은 방법으로 하면 왜 필요도 없는 정보를 DTO에 담는지 의문이 든다는 말을 들었다. 확..
Spring framework는 기본적으로 String 타입을 사용한다 Spring 기반 Java 앱에서는 반환받는 타입의 값이 무엇인지 딱히 고민한 적이 없었다. 일반적으로 String 타입이겠거니 하면 다 맞았다. 사칙연산을 사용하거나 수학적인 계산이 필요하다면 그 때만 Integer, int 타입을 사용했다. 그런데 왜 String이 기본 타입일까? 스프링은 기본적으로 프로퍼티 값을 BeanFactory 구성 파일에서 가져온다. 구성 파일 내부에서는 일반적으로 쌍따옴표로 값을 표현한다. 반환하는 값도 기본적으로 String 타입이다. 따라서 String이 Spring 기반 Java 앱의 기본 타입으로 사용되는 것이다! ========= 전문가를 위한 스프링 5를 읽다가 알게 된 사실이다. 역시 책을 읽으면 당연하게 여겼던 것도 왜 그렇게 작동되는지 알게 되니 돈이 아깝..