객체간에 변경할 수 없는(immutable) 데이터를 전달하는 것은 가장 흔하게 웹 어플리케이션을 개발하면서 만날 수 있는 작업입니다. Java 14 이전에는 boilerplate code 가 포함된 클래스를 만들어야 했으며 이는 사소한 실수와 복잡한 의도 등에 취약했습니다. Java14가 출시되면서 이제 record 키워드를 사용하여 이런 문제들을 해결할 수 있었습니다. Record record 키워드 사용하기 이전 대부분의 많은 상황에서 데이터를 전달하는 클래스는 데이터베이스에서 데이터를 꺼내와서 http 통신 너머의 유저에게 데이터를 전달하여 보여주는 역할을 하게 됩니다. 대부분 말씀하시는 DTO가 이런 역할로 볼 수 있습니다. 많은 경우 이러한 데이터를 변경하여 전달하기보다 해당 디비 raw 데이..
switch 문을 사용하는 여러 예제들을 정리해보자! public enum RoomType { BILLA, OFFICETEL, APT; } 위 enum이 있을 때, switch문이 없는 경우 아래처럼 코드를 짤 수 있을 것입니다. public void exampleOfIf(RoomType roomType) { if (roomType == RoomType.APT) { System.out.println("아파트"); } else if (roomType == RoomType.BILLA) { System.out.println("일반주택"); } else if (roomType == RoomType.OFFICETEL) { System.out.println("오피스텔"); } } 위 처럼 코드를 짜는 경우는 보기도..
안녕하세요. 업무하는 도중에 JsonNode 인스턴스를 다루었는데 해당 json의 field name들을 List로 가져와야 하는 일이 있었습니다. 이 때, jsonNode.fieldNames() 해당 코드가 반환타입이 Iterator 이었고 이를 List 타입으로 변환이 필요하여 찾아보았고 업무를 종료하고 정리를 해두면 다른분들도 결정하실때 좋을 것 같아서 공유합니다. JsonNode jsonNode = ...; Iterator fieldNameIterator = jsonNode.fieldNames(); 해당 iterator 변수를 List 타입으로 바꾸어 보자! 반복문(for, while 등) List fieldNameList = new ArrayList(); while(fieldNameIterato..
해당 포스팅은 해당 게시글을 토대로 서술되었습니다. Java 8 에서는 컬렉션을 데이터 스트림으로 쉽게 반복할 수 있는 Stream API를 도입했습니다. Stream은 병렬로 실행할 수 있고 여러 프로세서 코어를 사용하는 것도 매우 쉽습니다. 그에 따라 더 많은 코어에 작업을 할당하여 나누는 것이 항상 더 빠르다고 생각하기 쉽습니다. 하지만 그렇지 않은 경우도 있습니다. 해당 포스팅에서는 순차 스트림과 병렬 스트림의 차이점에 대해서 살펴보겠습니다. 먼저 병렬 스트림에서 사용하는 default fork-join pool을 살펴보겠습니다. 또한, 메모리 지역 및 분할/병합 비용을 포함하여 병렬 스트림 사용의 성능 영향을 다뤄보겠습니다. 마지막으로 순차 스트림을 병렬 스트림으로 변환하는 것이 합리적인 경우를..
회사업무에서 특정 요건을 처리한 후 서버에 배포하였다. 그런데 내가 배포한 이후에 QA 담당자께서 되던 기능이 안된다고 하시는데... 불길한 맘으로 서버 로그를 확인한 결과 잉?? NullPointerException이 떨어져 있었다... 아무리 생각해도 해당 라인에서는 NullPointerException이 발생할 여지가 전혀 없는 코드였는데 배포가 잘 안된건가? 하고 팀장님께 해당 라인의 코드와 배포상황을 말씀드렸고 배포는 정상적으로 진행되었음을 확인했다. 그렇다면 실제로 해당 코드에서 NullPointerException이 발생했다는 건데.. 예제 코드로 상황을 재현해 보겠다. 삼항연산자 NullPointerException 예제 class Scratch { public static void mai..
안녕하세요. 오늘은 모던자바 인 액션이라는 책을 읽으면서 확인한 동작의 파라미터화라는 키워드에 대해서 이야기해보려고 합니다. 모던 자바 인 액션이라는 책을 간단히 소개하자면 자바 8 이후에 등장하는 드라마틱한 자바 프로그래밍의 패러다임을 정리하여 전달해주고 있습니다. 현업에서 이미 자바8은 너무나도 깊게 자리잡게 되었고 그 원리를 이해하고 그로인해 어플리케이션의 전체적인 성능까지도 고려할 줄 아는 프로그래밍을 위해 자바개발자 독자들에게 그 원리를 전달해주고 있습니다. http://www.yes24.com/Product/Goods/77125987 모던 자바 인 액션 자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 ..
최근 Modern Java In Action 이라는 책을 보면서 예제를 작성하여 깃에 커밋하고 있었다. 이참에 Java 8 버전을 벗어나서 개인적으로 파격적이었던 Java 11로 코딩을 해보고 싶어서(물론 익숙한 방법을 쓰게된다) Modern Java In Action 혹은 이 블로그를 채우면서 새롭게 알아가는 내용들을 Java 11로 예제를 짜보기로 했다. 자바 8 이후에 등장한 내게 있어서 가장 써보고싶었던 기능은 LIst.of() 라는 메소드였다. 단지 Arrays.asList() 메소드가 있는데 괜스리 내가 쓰던 버전보다 진보적인 기능의 등장은 "이건 못참지" 수준이었고, 마침 컬렉션 정렬예제가 있길래 바로 써봤는데... 웬걸... Exception in thread "main" java.lang..
안녕하세요. 이번 포스팅은 자바 프로젝트를 진행할때 시간대를 매번 계산하기 어려워서 시간대 설정이 필요한 부분에 대해서 전체적으로 프로젝트의 시간대를 설정하는 방법과 원리에 대해서 소개해보고자 합니다. 일단 시간대는 기본적으로 시스템 default를 따르게 됩니다. 대한민국에서 이 블로그를 보고 있으시면 그냥 KST 한국 표준시라고 생각하시면 됩니다. 하지만 다국어 및 다양한 시간대를 제공해야하는 어플리케이션의 경우 기본적으로 UTC 시간대를 기준으로 잡고 해당 시간대를 기준으로 날짜/시간 객체를 처리하곤 할 것입니다. 일단 먼저 프로젝트의 전체 시간대를 시스템 default 시간대가 아닌 UTC 시간대를 바라보도록 수정해보겠습니다. 프로젝트 UTC 시간대 바라보기 TimeZone.setDefault(T..