☕️ JAVA
[Effective Java] 아이템 33 : 타입 안전 이종 컨테이너를 고려하라
아이템 33 : 타입 안전 이종 컨테이너를 고려하라 제네릭은 Set이나 Map과 같은 컬렉션이나 ThreadLocal, AtomicReference처럼 하나의 원소만을 담는 컨테이너에 가장 많이 쓰입니다. 이 때 보통의 경우 컨테이너별로 매개변수화 할 수 있는 타입의 수는 하나로 제한됩니다. Set intSet = new HashSet(); Map map = new HashMap(); 이 때, 타입의 수가 하나로 제한되는 것은 컨테이너의 제네릭 타입이 정해졌을 때, 해당 타입만으로 자료형이 제한되는 것을 의미합니다. Set set = new HashSet(); 맞습니다. 하지만, 위 방법대로 사용할 경우 해당 컨테이너에서 얻은 객체가 어떤 타입인지 정확히 알 수 없으며, 로직을 이해하고 캐스팅해 사용해도..
SXSSFWorkbook 생성 시 FontConfiguration에서 NullPointerException이 발생할 때
흔히 대용량 데이터를 엑셀 파일로 내보낼 때, SXSSFWorkbook을 사용합니다. SXSSFWorkbook은 다른 Workbook과는 달리 Streaming api를 사용하기 때문에 대용량 데이터의 경우 보다 적합합니다. 저도 엑셀 다운로드 기능 구현 시 SXSSFWorkbook를 사용했는데요, 특정 서버에서만 SXSSFWorkbook 생성 시 FontConfiguration에서 NullPointerException이 발생하는 문제가 있었습니다. 아래는 그 문제와 해결 방법입니다. 오류 내용 및 원인 그런데 이번에 서비스를 오픈하면서, 특정 서버에서만 SXSSFWorkbook.createSheet()을 했을 때 아래와 같은 예외가 발생했습니다. Caused by: java.lang.InternalEr..
[Effective Java] 아이템 23 : 태그 달린 클래스보다는 클래스 계층구조를 활용하라
아이템 23 : 태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스 두 가지 이상의 의미를 표현하며, 이를 특정 필드(이 책에서는 태그)로 구분하는 클래스가 종종 있습니다. class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 아래 필드는 RECTANGLE 일 때만 쓰임 double length; double width; // 아래 필드는 CIRCLE 일 때만 쓰임 double radius; // RECTANGLE 생성자 Figure(double length, double width) { this.shape = Shape.RECTANGLE; this.length = leng..
[Effective Java] 아이템 13 : clone 재정의는 주의해서 진행하라
아이템 13 : clone 재정의는 주의해서 진행하라 Cloneable은 메서드가 없는 인터페이스입니다 clone 메서드는 원본 객체의 필드 값과 동일한 값을 가지는 새로운 객체를 생성해줍니다. clone 메서드를 사용하기 위해서는 해당 클래스에서 Cloneable 인터페이스를 구현해주어야 합니다. 이러한 스펙이라면, 아래와 같은 생각이 들 수 있습니다. 저도 그랬구요. Cloneable 인터페이스를 구현해야 clone 메서드를 사용할 수 있다면, Cloneable 인터페이스에 clone 메서드가 선언되어있겠군! 하지만, 아닙니다. clone 메서드가 선언되어있는 곳은 Object이고, protected이며, Override 해주어야 하면 사용할 수 있습니다. @Override public PhoneNu..
[Effective Java] 아이템 10 : equals는 일반 규약을 지켜 재정의하라
아이템 10 : equals는 일반 규약을 지켜 재정의하라 equals를 재정의해야하는 Case 객체의 식별성이 아니라 논리적 동치성을 비교해야하는 경우 String, Integer 와 같은 값 클래스 String a = "가나다"; String b = "abc"; assertTrue(a.equals(b)); 위와 같이 String 같은 값 클래스는 equals 메서드에게 객체 자체가 동일한지 여부보다 값이 동일한지 여부를 기대할 것이다. JPA 영속성 Entity 클래스 (case by case) @Entity @EqualsAndHashCode(of = {"id"}) public class User { @Id @GeneratedValue private Long id; private String name..
[자바로 배우는 리팩토링 입문] 리팩토링이란?
저희 회사에는 각 층에 작은 도서관이 있습니다. 개발 서적은 물론이고 비개발 서적도 많아 사옥 이름이 그렇게 지어진 게 아닌가 싶을 정도입니다. 지난주에 오랜만에 출근을 해 이번 연휴(토~월) 동안 읽을만한 책을 하나 빌려왔는데, 선정 기준은 아래와 같았습니다. 3일 동안 읽을 수 있는 분량 지금 진행중인 프로젝트에 도움이 될만한 내용 젠킨스 책을 빌릴까 고민했다가 이게 좀 더 읽기 쉬울 거 같기도 하고, 동료의 추천도 있어 이 책을 빌려오게 되었습니다! 이 책은 0장에서 리팩토링에 대한 이해, 그 이후 장에서 예제 코드와 함께 리팩토링을 진행합니다. 이번 포스팅에서는 0장에서 소개하는 리팩토링에 대해 포스팅하도록 하겠습니다. 리팩토링 리팩토링은 외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램 내부 ..