본문 바로가기

Back

(30)
싱글턴은 빈 스코프의 일부일 뿐이다. 스프링을 공부하다가, Scope 라는 빈의 라이프사이클에 대한 내용을 공부했는데 상당히 흥미로운 내용을 발견했다. 실제로 프로젝트를 진행하면 포틀릿 관련된 내용을 자주 접할 수 있었다. 도대체 이게 뭐시당가 라면서 고민했지만 하던대로 코딩해도 문제가 없었으니 넘어갔던 기억이 난다. 하지만 여기서 이걸 볼 줄이야... 내용은 다음과 같다. 0. Scope 정의는 기본적으로 Bean 생성 및 소멸을 어떻게 할 것인가? 그것에 대한 정의라고 볼 수 있다. 1. 스프링에서 Bean 정의를 할 때, 특정 목적에 맞도록 Scope 정의를 할 수 있다. 2. 싱글턴, 프로토타입 같은 기본적인 정의가 존재한다. 3. 웹에서 사용하는 Request, Session 또한 Bean Scope 일부다. 4. Global Se..
에러를 대처하는 것은 불가능하다. 단지 예외만 다룰 뿐이다. 자바에서는 오류의 종류로 Error, Exception 두 가지를 제안한다. 1. Error, 에러 Error는 간단하게, 하드웨어적인 문제가 발생하여 생기는 오류를 뜻한다. 당연히 개발자가 이를 해결할 방법은 없다. 컴퓨터가 불타고 박살나는데 정상적으로 소프트웨어가 돌아가게 하는 개발자가 있다면 이미 개발이라는 영역을 벗어난 초능력임이 확실하니까. 2. Exception, 예외 개발자가 작성한 코드가 의도치 않게 작동하여 발생하는 오류를 뜻한다. 이는 개발자가 반드시 고려해야 하는 영역이다. 3. 컴파일러 컴파일러가 감지할 수 있는 예외를 Exception 이라고 부르며, 컴파일러가 감지할 수 없는 예외를 Runtime Exception 이라고 부른다. 컴파일러가 감지하느냐 마느냐의 기준은 무엇일까? ..
try-with-resources 간략하게 알아보기 try - with - resources 관련된 글을 읽으면서 너무 이해가 안되는 부분이 있었다. "자원을 해제하기 위하여..." 이 말이 마치 관용구처럼 사용되었다. 추상적인 표현이라고 본다. 정확하게 자원을 무엇을 뜻하는가? 해제를 한다는 것은 어떤 행동이 수반되는가? 이런 내용이 전혀 정의되어 있지 않았다. 그래서 그 부분만 알아봤고 명확한 답을 얻을 수 있었다. 1. 자원, resources 자바에 한정해서 말하자면 객체를 뜻한다. 객체... 자원이라고 말하다가 객체라고 말하니 의미가 명확해진다. 2. 해제 AutoCloseable 인터페이스의 close() 메소드를 구현한 메소드를 호출한다는 의미다. 보충 설명이 필요한데, 객체의 라이프 사이클에 대한 내용에 대한 이해가 필요하다. 객체의 라이프..
예외 처리 시, try - catch - if 대신 optional 사용해보기 MVC 패턴에서 BIZ 파트를 작성하다보면 try - catch - if 문을 많이 사용하게 된다. DB에서 받아온 NULL 값을 처리하기 위해서 try - catch 이후 if (abc == null || abc == "") 같은 구문을 사용하는 것이다. 이것을 Optional로 처리하면 어떨까? try { data = dao.selectSomething(); Optional opt = Optional.ofNullable(data) .orElseThrow(() -> CompanyException(CompanyConstans.ALL, new Object["itHing"])); } catch (Exception e) { throw new CompanyException(CompanyConstans.ERROR..
회계 같은 정교한 계산이 필요한 경우에는 BigDecimal이 필수다 자바를 사용할 때, 소수점 계산을 해야하는 경우 BigDecimal을 사용해야 한다. Double, Float은 기본적으로 소수점 자리 계산이 정교하지 않기 때문이다. (메모리 용량의 한계) 계산 시, BigDecimal 타입으로 변환이 가능한지 확인하는 NumberUtils.isDigits(a) 함수는 꼭 사용하자. 검증이 완료된 값을 받아서 사칙연산이든 뭐든 숫자 계산을 한다. 계산 후, 반환타입이 int, Long이라면 타입변환하여 반환하면 된다.
이클립스 기본세팅 완벽하게 정리해보기 프로젝트를 다니면 기본 윈도우만 설치된 상태에서 세팅을 해야만 한다. 작성용 프로그램으로는 대표적으로 이클립스가 있으며 이클립스 기반으로 개조된 수많은 특화 이클립스(?)도 존재한다. 그 외에는 젯브레인스 사에서 제공하는 인텔리제이 기반 프로그램도 한 축을 담당한다. 안드로이드 스튜디오, 인텔리제이 울티메이트 등은 인텔리제이 기반이다. 두 프로그램은 세팅 방법은 다소 다르지만, 해야할 세팅 자체는 동일하다. 그렇다면 일단 SI라면 더 자주 만나볼 이클립스에서 세팅해야할 것을 명확하게 알아두면, 해당 세팅을 인텔리제이에서도 방법만 찾으면 쉽게 적용할 수 있을 것이다. 그런 의미에서 구체적으로 이클립스 세팅에는 어떤 프로세스가 존재하는지 알아보기로 했다. 0. 사용할 도구의 환경변수 설정 언어를 어떤 것을 ..
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: "셋"
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를 읽다가 알게 된 사실이다. 역시 책을 읽으면 당연하게 여겼던 것도 왜 그렇게 작동되는지 알게 되니 돈이 아깝..