본문 바로가기

전체 글

Java - Json(ObjectMapper) 배열(Collection) 타입이지만, 데이터가 1개인 경우 Object로 작성되는 배열 필드 처리하기 최근 공공 API를 이용해 데이터를 수집하는 어플리케이션을 개발했고, 테스트 후 실제 데이터를 처리하기 위해 어플리케이션을 가동 했다. 특별한 문제 없이 잘 동작할 거라고 생각했지만 이상한 에러를 발견했고 (사실 이 전에도 숫자 타입인데 문자열이 튀어나와서 오류가 발생하는 등의 자질구레한 문제가 있었다.) 원인을 파악 해 봤는데.... 원래 아래와 같이 item 필드는 배열로 결과가 나와야 한다. {"Response": { "head": { "pageNo": "1", "resultCode": "0", "totalCount": "17", "numOfRows": "1000", "resultMsg": "NORMAL_SERVICE" }, "items": {"item": [ { "tong": "", "male50.. 더보기
(spring boot 3.1 이상) 간단한 설정(@ServiceConnection)으로 testcontainer 사용하기 SpringBoot 3.1 이후로 testcontainer 를 지원하기 시작하면서 자동 설정기능이 등장했다. 기존 버전에서는 testcontainer를 생성하면서 사용자 id, password 등의 값을 변경하는등 귀찮은 작업들이 필요했지만 @ServiceConnection 어노테이션의 등장으로 이런 것들이 필요 없어 졌다. 아래는 mysql 을 testcontainer 로 띄워서 테스트 하는 예제 이다. @TestConfiguration(proxyBeanMethods = false) public class TestContainerConfiguration { @Bean @ServiceConnection MySQLContainer mysqlContainer() { return new MySQLContain.. 더보기
Java - Srping 시작할 때 동작하는 코드 작성하는 법 Spring Framework는 Event 와 Event가 발행되었을때 이를 처리하는 EventHandler(Listener)기능을 지원한다. Event 와 Listener 모두 사용자가 직접 정의하고 발행 할 수 있다. 사용자 정의 Event 외에도 기본적으로 제공하는 Event 가 존재하며, Spring Application 의 동작과 관련해서는 ApplicationEvent 가 존재한다. 따라서 Spring 이 시작할때 어떤 코드를 실행하고 싶다면 ApplicationEvent 클래스 중 시작과 관련된 Event인 ContextRefreshedEvent를 수신하는 Listener를 정의 하면 된다. @Component @Slf4j public class ApplicationEventListener .. 더보기
Java - LocalDateTime (LocalDate, LocalTime), ZonedDateTime, Period, Duration LocalDate, LocalTime, LocalDateTime, ZonedDateTime 과 같은 API들은 java.util.Date, java.util.Calendar의 단점을 보완하기 위해 Java8에 추가되었다. 기존 (java.util.Date, java.util.Calendar) API의 단점 Thread safe 하지 않다. 동시성 이슈(Concurrency issues)가 존재한다. 향상된 설계와 이해가 용이하다. Date와 Calendar API는 날짜 연산에 적합하지 않게 설계되었다. 새로운 API는 ISO 중심이고, 일관적인 날짜 시간, 기간 도메인 모델을 따르고, 다양한 편의 기능들을 제공한다. 시간대 (시차) 처리가 불편하다. 기존 API에서는 시간대역(시차)를 처리하기 위해 로.. 더보기
Java Record (레코드) 참고: https://www.baeldung.com/java-15-new https://www.digitalocean.com/community/tutorials/java-records-class Record는 왜 만들어졌나? Record는 java 14에서 처음 소개된 새로운 클래스 타입이며, 변경불가(immutable) 데이터 객체를 쉽게 만들수 있게 한다. Record 타입이 생기기전에는 값이 변경이 불가능한 테이터 객체를 정의해서 사용했다. 변경 불가 데이터 객체를 만들기위 해서는 매번 아래 내용들을 작성해야 했다. 필드를 private final 로 정의 getter 메소드 작성 생성자 생성 hashCode, equals, toString 함수 재정의 클래스의 상속을 막고 싶다면 final cla.. 더보기
Java Optional 사용법 원문 : https://www.baeldung.com/java-optional, https://www.baeldung.com/java-9-optional 1. 개요 Java SE 8 에 소개된 java.util.Optional 클래스는 Haskell과 Scala 로부터 영감을 받아 개발 되었고, 아무 값도 없는(null) 값을 표현하는데 사용된다. NPE(NullPointException)를 방지하기 위한 null 체크와 같은 역할을 하는데 편리한 기능을 제공하기때문에 객체타입을 반환하는 함수를 작성할때 null 반환될 여지가 있는 경우 반환타입을 Optional로 해주면 좋다. 2. Optional 객체 생성하기 값이 비어 있는 Optional 객체를 생성할때는 간단히 Optional.empty() 정.. 더보기
Java 람다(Lambda) 표현식, Functional Interface 에 대한 조언 https://www.baeldung.com/java-8-lambda-expressions-tips Lambda Expressions and Functional Interfaces: Tips and Best Practices | Baeldung Tips and best practices on using Java 8 lambdas and functional interfaces. www.baeldung.com 1. 표준 함수형 인터페이스(Functional Interfaces) 위주로 사용하라 함수형 인터페이스는 java.util.function 패키지에 모여 있고, 거의 대부분의 람다 표현식이나 페소드 참조에 사용할 수 있다. 대표적인 함수형 인터페이스로는 아래와 같은 타입들이 있다. 파라미터 없이 어떤 .. 더보기
Java8 이후 람다를 이용하여 Collection 정렬하기 (정렬을 깔끔하게 작성하는 법) 원문 : https://www.baeldung.com/java-8-sort-lambda 우선 아래와 같은 class가 있다고 했을때 public class Human { private String name; private int age; public String getName() { return name; } public int getAge() { return age; } public Human(String name, int age) { this.name = name; this.age = age; } } Java8 이전에는 아래 코드와 같이 Comparator를 구현하여 정렬에 사용했다. void givenPreLambda_whenSortingEntitiesByName_thenCorrectlySorted.. 더보기