본문 바로가기

Null Pointer Exception으로 고통 받았다면 Java Optional을 사용해보세요(더 쉽고 깔끔하게 처리할 거에요) Java8 Optional 자바8이 나온지도 3년이 되었고 오라클 JDK의 LTS 버전인 자바11도 나왔는데 웬 자바8의 기능을 소개하냐! 하는 분도 있겠지만, 이제서야 자바8을 도입하는 회사들도 많이 있고 제 공부를 위한 것이니 즐겁게 사용해봅시다.Optional은 Null Pointer Exception(이하 NPE) 처리를 돕는 Wrapper Class다.보통 자바 개발을 하면서 당연하게 객체(Object)를 만들어 사용한다.그런데 C,C++에서 사용하던 포인터를 감췄다는 자바에서도 객체에는 포인터를 사용한다. (reference)그렇기 때문에 모든 객체는 NPE에 대한 검사가 필요하고 방지하는 코드도 필요하다.12List list = getList();List listOpt = list != nu..
메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? (pom.xml 분석하며 가볍게 정리하는 빌드 툴, Maven) 메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? 제목과 같은 질문에 필자는 제대로 답변할 수 없었다.단순하게는 maven repository에서 dependency 추가해서 필요한 라이브러리 쓰는 정도?무엇을 위해 쓰는지, 왜 쓰는지, 어떻게 쓰는지에 대한 구체적으로 알지 못했다. 사실 지금까지 알 필요도 없었고, 초보 프로그래머의 기준에서는 Maven을 몰라도 대중적이면서도 다양한 라이브러리를 많이 접하고 써보면 "장땡"이었기 때문이었다.사실 지금도 자세히는 모른다.그러나, 조금 더 나은 프로그래머가 되기 위해서 maven에 대한 이해가 필요하다고 생각해서 정리한 것이다. ("maven을 빠삭하게 알아야 해!"가 아니라 "maven을 알아가는 길에 한 발자국을 떼보자!"다.)pom.xml을 ..
Spring boot Bean 생성 순서 정하는 방법, 생성되지 않은 Bean을 주입받으려고 하다가 실패했을 때 해결 방법, IoC 컨테이너를 공부해야하는 이유.. (※생명 주기 아님) Spring boot에서 bean 등록 순서를 결정하는 방법 스프링/스프링부트에서 bean을 등록하는 방법은 여러가지가 있다.스프링부트에서는 Bean을 등록할 때 자바코드(Annotation)로 등록하는 것을 권장한다.따라서 스프링 부트를 사용하는 개발자들은 @Component, @Service, @Controller, @Repository, @Bean, @Configuration 등으로 Bean들을 등록하고 주입받아 사용하는게 일반적이다.그런데 프로그램 개발중에 아무 생각없이 여러 개의 Bean들을 등록해놓고 어떤 Bean에서 @Autowired로 자연스럽게 주입받아서 '사용'하려다가 에러를 만났다.바로 Bean에 '아직' 등록되지 않은 Bean을 클래스에서 사용하려고 했기 때문이다.무슨 얘기인지 Sp..
자바 파일 변경 감지, 와치서비스를 이용한 파일 변경 알림 받기(WatchService, WatchKey) Java File Change Notification, Monitoring, WatchService 0. 긴~~ 사족다양하게 키워드를 준비해봤다.업무에서 Application Runtime중에 어떤 파일의 데이터(meta-data, properties 등...)가 변경되면 이벤트를 받아 다시 데이터를 메모리로 적재하는(reload) 기능이 필요했다.이 기능은 꽤나 광범위하게 쓰이고 있다.eclipse, IntelliJ 같은 IDE에서 파일이 변경되면 즉시 변경된 파일에 (*)별 표시가 뜨는 것과 Spring 같은 경우는 devtools를 dependency로 추가하면 파일이 변경될 때마다 서비스를 재시작해주는 기능등이 있다.또한 설정 값(Properties) 변경을 알려주는 기능은 그냥봐도 너무 많다.a..
자바 스트림(Stream) API 정리, 스트림을 이용한 가독성 좋은 코드 만들기(feat. 자바 람다, 함수형 프로그래밍, 자바8) Java Stream 자바 공부를 하면서 Stream이 무엇인지, 어떻게 사용되고 있는지 인지는 하고 있었으나 실제 코드로 타이핑해보지 않았다.그러던 중 이번에 가볍게 API 훑어보는 식으로 공부를 하면서 코드를 쳐보면서 조금 더 익히게 되었다.Stream은 자바 8부터 추가된 기능으로 "컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"이다. (InputStream, OutputStream같은 I/O Stream이 아니다.)1234567891011121314List names = Arrays.asList("jeong", "pro", "jdk", "java");// 기존의 코딩 방식long count = 0;for (String ..
스프링 부트 애플리케이션 더블 클릭으로 실행하는 방법, Fully Executable Jar (JSmooth로 .exe파일은 이제 그만!) Running Spring boot Applications by using double click 제목은 거창해보이나 아주 간단한 설정만으로 스프링 부트 애플리케이션을 "완전히 독립적으로 실행" 할 수 있다.기존에는 빌드를 통해서 .jar 파일을 만들고 명령 프롬프트 창에서 "java -jar XXXXX.jar" 이런 식으로 명령어를 작성해서 실행했다.지금도 특별한 불만이나 요구사항이 없으면 그대로 사용하는 것이 좋다.그런데 가끔은 스프링 애플리케이션을 더블 클릭만으로 실행해야할 때가 있다.특히 소프트웨어를 제공할 때, 사용자는 개발자가 아니기 때문에 명령어 실행에 대해 거부감이 들 수 밖에 없다. 따라서 최대한 단순하게 실행하기를 원하는 경우에 아래와 같은 방법을 사용하는 것을 고려해볼 수 있다.Set..
JAVA에서 날짜,시간 제대로 사용하는 LocalDate, LocalTime, LocalDateTime (NTP 시간 서버에서 정확한 시간 받아오기, json object 받기, JPA 테스트 with LocalDateTime) 아직도 Calendar, Date 사용하니? 자바에서 아직도 Calendar.getInstance해서 시간/날짜를 표현하는 프로그래머가 있을까?처음 공부할 때나 단순하게 표현해야할 때는 사용할 수 있지만 단점이 극명한 클래스라 사용하지 않는게 좋다는 것을 미리 말한다.어떤 문제점이 있는지는 네이버 D2의 글에서 잘 설명해준다.Calendar, Date 클래스의 문제점 (출처 : https://d2.naver.com/helloworld/645609 )1. 불변 객체가 아니다.-> 즉 set으로 변경이 가능하다는 점은 누군가 악의적으로 변경할 수 있기 때문에 get/set 메서드에서 직접 Date클래스를 사용하는 것이 위험하다.2. 상수 필드 남용-> calendar.add(Calendar.SECOND, 2..
스프링 부트 2.0의 default DBCP, hikariCP가 그렇게 빠르다던데? (hikariCP 저만의 성능 테스트를 해봤습니다.) HikariCP hikariCP는 스프링 부트 2.0부터 default JDBC connection pool이다. hikariCP github사이트에 가보면 엄청 빠르고, 가볍고, 신뢰할 수 있다고 설명한다.심지어 "zero-overhead"라며 엄청나게 높은 성능을 강조하고 벤치마크 결과도 보여준다.원하면 벤치마크 테스트 소스도 가져가서 직접 돌려보라고도 하는데 자세한건 모르겠고 나만의 테스트 환경을 만들어서 테스트 해보기로 했다.스프링 부트에서 hikariCP 성능 테스트 PC 사양도 중요하고 인터넷 사양도 중요하고 로컬 DB냐 원격 DB냐도 갈리고 여러 환경이 중요한 것으로 아는데 크게 생각 안하고 단순히 직접 경험해본다에 중점을 두었다.먼저 hikariCP는 스프링부트 2.0부터 default로 ..