본문 바로가기

Java

Java - Collection(List, Set...) 가변(mutable) 객체 초기화 (Arrays.asList()) List.of나 Set.of 함수를 이용하면 List, Set을 간편히 생성 할 수 있다. 하지만 이렇게 생성한 객체는 불변객체(immutable) 여서 변경 작업이 불가능 하다. (add 작업 시 UnsupportedOperationException이 발생한다.) List list = List.of("a", "b", "c"); Set set = Set.of("a", "b", "c"); list.add("d"); // java.lang.UnsupportedOperationException set.add("d"); // java.lang.UnsupportedOperationException 따라서, 변경 가능한 Collection 객체를 만들고 싶을때는 Array.asList 함수를 이용해서 List.of.. 더보기
JAVA - for 문으로 map의 key, value를 탐색하는 방법 (EntrySet 이용) 보통의 경우 for 문으로 map을 순회하고 싶을때는 아래처럼 key 를 받아오고, 이 key를 이용해서 value 를 다시 조회하는 형태로 했다. Map map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); Set keys = map.keySet(); for(String key : keys) { String value = map.get(key); System.out.println(key + " : " + value); } 이 방법은 value를 찾아와야 하는 단계를 더 거치게 되어 비 효율적이고 뭔가 깔끔치 못하다. Key, Value 를 포함하고 있는 데이터 타입인 Entr.. 더보기
JUnit5 테스트 순서 지정하기 JUnit 이 테스트 메소드를 실행하는 순서는 나름의 알고리즘을 사용하여 정렬된다고 하는데, 어떤 규칙인지는 잘 모르겠다. 그리고 보통의 단위 테스트는 실행 순서에 크게 상관 없지만 통합테스트나 기능 테스트를 수행하는 경우에는 테스트의 순서를 지정하고 싶은 경우가 있다. 테스트 함수의 실행 순서를 제어하기 위해서는 아래와 같이 @TestMethodOrder 어노테이션에 MethodOrderer 구현체를 지정하면 된다. MethodOrderer는 이미 정의된 구현체를 사용해도 되고 직접 구현해도 된다. @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class TestMethodOrderTest { @Test @Order(3) @DisplayNa.. 더보기
java.time.format.DateTimeParseException (...could not be parsed: Unable to obtain LocalDate from TemporalAccessor) 년월 데이터를 처리하기 위해 LocalDate를 사용하고 있던중, 문자열을 LocalDate로 변환할 일이 있어 별 생각 없이 LocalDate.parse(문자열, DateTimeFormatter)함수를 사용했다. String yearMonthString = "202210"; LocalDate yearMonth = LocalDate.parse(yearMonthString, DateTimeFormatter.ofPattern("yyyyMM")); 결과... java.time.format.DateTimeParseException: Text '202210' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2022, Mont.. 더보기
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에서는 시간대역(시차)를 처리하기 위해 로.. 더보기