본문 바로가기

Back/Java

(13)
싱글턴은 빈 스코프의 일부일 뿐이다. 스프링을 공부하다가, 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이라면 타입변환하여 반환하면 된다.
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 내부에서 할당받아서 연산하는 추가적인 문장이 있을 경우에만 발생한다!
Java transient 사용하는 이유가 뭘까? 심심해서 눈에 띈 Exception 클래스를 하나하나 까보다가 특이한 것을 발견했다. transient 처음 보는 용어였다. 클래스도 아니고 접근제어자도 아닌데 떡하니 적혀있다. private transient Object backtrace; 이런 식으로 말이다. 정말 특이한 녀석이라서 궁금증이 생겨서 찾아봤다. 생각보다 결론은 간단하다. 직렬화 과정(Serialize)에서 특정한 정보를 배제하여 null 값을 출력하도록 하는 녀석이다. 비밀번호 같은 민감한 개인정보를 노출할 우려가 있다면 직렬화시 배제하도록 명령하는 것이다. 따지고 보면 접근제어자 느낌인데 그런 놈은 배운 적이 없다. 신기방기. 직접 사용처가 보고 싶다면, Exception 클래스를 찾아보면 된다. 예시는 다음과 같다. public c..
자바독을 간단하게 알아보자 (JavaDoc) 자바를 사용하면 주석을 자연스럽게 활용하게 된다. 그런데 주석에도 종류가 있고 그 중에는 JavaDoc이라고 불리는 주석도 존재한다. /** * * */ 이런 형태로 작성된 주석을 JavaDoc, 자바 문서화라고 부른다. 실제로 저런 클래스, 메서드 위에 자바독 어노테이션과 함께 작성하면 해당 내용을 HTML로 바꿔서 자동으로 문서로 제작해준다. 문서화가 필수인 기업용 어플리케이션에서는 자주 사용하는 기능이다. 자바독 어노테이션에서 알아두면 좋은 어노테이션은 다음과 같다. serializable 관련된 어노테이션은 자주 안 쓰는 것 같아서 배제했다. /** * * @author : 작성자 * * @deprecated : 지원 중단 * * @exception : 예외 처리 * * @param : 매개변수 ..
JDK를 왜 변수에 추가해야 할까? 시간이 나서 처음부터 올라가자보자는 마음에 메모장에서 자바 파일 만들기부터 시작해봤다. 그런데 은근히 절차가 기억이 안 나더라... 이런 게 기초가 부실하다는 걸까? 마음을 다 잡고 과정을 천천히 되새겨 봤다. 1. 메모장에 메인 클래스와 메인 메서드를 작성한다. 2. 내용을 적고 사용할 기능이 담긴 라이브러리를 추가한다. 3. 파일 확장자를 모든 파일로 설정한 뒤, 파일이름.java 형식으로 저장한다. 4. 저장한 파일을 JDK의 bin 폴더에 넣는다. 5. 자바 컴파일러를 활용해 바이트 파일을 생성한다. 6. 자바 런타임을 활용해 바이트 파일을 읽어 프로그램을 실행한다. 런타임 과정을 보다 세부적으로 본다면, 7. 바이트 파일을 자바 클래스 로더에 담아서 자바 클래스 라이브러리를 로딩한다. 8. 메모..