본문 바로가기

자바56

AssertJ 기본 사용법 1. AssertJ란? AssertJ란 asssertion(직역 : 주장)을 제공하는 자바 라이브러리로 에러 메세지와 테스트 코드의 가독성을 높여주는 라이브러리이다. junit5에서 제공하는 Assertions의 assert는 인자 순서 (expected, actual)의 순서가 헷갈릴 수 있는데 Assertions보다 가독성이 좋아진다. assertEquals(expected, actual); assertThat(actual).isEqualTo(expected); 메소드 체이닝을 지원하기 때문에 좀 더 깔끔하고 읽기 쉬운 테스트 코드를 작성할 수 있다. 개발자가 테스트를 하면서 필요한 거의 모든 메소드를 제공한다. 2. 의존성 추가 //maven org.assertj assertj-core 3.21.0.. 2021. 11. 15.
[Effective Java] 아이템73 추상화 수준에 맞는 예외를 던지라 ■ 추상화 수준에 맞는 예외를 던져라 수행하려는 일과 관련 없이 보이는 예외가 튀어나오면 당황스러울 수 있다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 종종 일어나는 일이다. 이는 내부 구현 방식을 드러내어 윗 레밸 API를 오염시킨다. 이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다. 이를 예외 번역이라 한다. try { // ... } catch (LowerLevelException e) { throw new HigherLevelException(); } 예외 연쇄 예외를 번역할 때, 저수준 예외가 디버깅에 도움이 된다면 예외 연쇄를 사용하는게 좋다. 근본 원인이 되는 저수준 예외를 고수준 예외에 실어 보내는 방식(Throw.. 2021. 8. 22.
[Effective Java] 아이템72 표준 예외를 사용하라 ■ 표준 예외를 사용하라 표준 예외를 사용하면 다른 개발자들이 익히고 사용하기 쉬워진다는 장점이 있다. 또한 예외 클래스의 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. Exception, Throwable, Error, RuntimeException 은 직접 재사용하지 말자. 이 클래스들은 추상 클래스라고 생각하길 바란다. 이 예외들은 다른 예외들의 상위 클래스이므로 안정적으로 테스트할 수 없다. 다음 표는 널리 재사용하는 예외들이다. IllegalArgumentException 허용되지 않는 값이 인수로 건내졌을때(null이면 NullPointException을 사용) IllegalStateException 객체가 메소드를 수행하기 적합하지 않은 상태일때 NullPoint.. 2021. 8. 22.
[Effective Java] 아이템71 필요 없는 검사 예외 사용은 피하라 ■ 검사 예외의 문제 검사 예외를 남발하면 쓰기 불편한 API가 된다. 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다. API 사용자에게 부담을 준다. 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더 커졌다. API를 제대로 사용해도 발생할 수 있거나, 프로그래머가 의미있는 조치를 취할 수 있다면 받아들일 수 있지만, 둘다 해당이 안되면 비검사 예외를 사용하는 게 좋다. 특히 검사 예왹사 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다. 이미 다른 검사 예외도 던지는 상황에서 또 다른 검사 예외를 추.. 2021. 8. 22.
[Effective Java] 아이템69 예외는 진짜 예외 상황에만 사용하라 ■ 예외는 예외 진짜 예외 상황에서만 사용하라 아래 코드는 예외를 잘못 사용한 코드이다. 무한 루프를 돌다가 배열의 끝에 도달해 예외가 발생하면 끝을 내는 코드이다. try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 반복문에서 배열의 크기보다 커졌는지 검사를 하는 부분을 줄이려고 의도한 코드 였을 텐데, 이는 잘못된 추론이다. 예외는 예외 상황에 쓸 용도로 설계되었으므로 JVM 구현자 입장에서는 명확한 검사만큼 빠르게 만들어야 할 만큼 최적화에 신경쓰지 않았을 확률이 높다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. 배열을 순회하는 표준 관.. 2021. 8. 22.
[Effective Java] 아이템64 객체는 인터페이스를 사용해 참조하라 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다. 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다. 단, 주의할 점이 하나 있다. 원래 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다. 따라서 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 적합한 인터페이스가 없는 두번쨰 부류는 클래스 기반으로 작성된 프레임 워크가 제공하는 객체들이다. OutputStream 등 java.io 패키지의 여러 클래스가 이 부류에 속한다. 적합한 인.. 2021. 8. 1.