java

JVM/JPA

[QueryDSL] return 으로 Map(집합) 받기

😀서론 테이블 목록을 가져와 목록에서 ID를 통해 내부 정보를 여러 번 조회할 일이 있었다. 쿼리에서 List 로 조회해서 for문으로 돌리기에는 중복된 ID를 여러 번 조회할 수도 있고, 결국 ID를 통해 다른 값들을 얻고 싶은 게 목표 이기에 QueryDSL에서 return으로 Map도 받을 수 있는지 찾게 되었고, 찾아서 정리를 해본다. 🙄준비 위 데이터를 기준으로 결과 값 확인을 진행합니다. 🙂본론 Querydsl에서는 결과 집합(aggregation) 이라는 걸 제공해주는 걸 알았습니다. 결과 처리 방법 쿼리에서 데이터 조회 후 메모리에서 결과에 대한 집합 연산을 수행하는 집합 함수를 의미 합니다. 간단한 예시로 살펴보겠습니다. 1️⃣Map Value 하나 받기 select는 transform에..

JVM/Java

[Java] 22년 부터는 Integer 타입을 사용할 때 조심하자!

😲서론 21년까지 잘 작동하던 Integer.valueOf() 에서 NumberFormatException이 발생했다. 🤔본론 (코드는 보기 쉽게 하기 위해 실제 코드와 다르게 작성하였습니다.) public static void main(String[] args) { String value = "2201060002"; String defaultValue = "221060001"; Optional.ofNullable(value) .map(Integer::valueOf) .map(num -> num += 1) .map(String::valueOf) .orElse(defaultValue); } 간단한 패턴 값을 만드는 로직이었다. 패턴 - YYMMDDXXXX 해당일자의 고유한 값을 저장하기 위해서, value..

JVM/Java

[Java] static inner class 는 언제 로드가 될까? 로드와 초기화?

😣서론 최근 싱글톤을 직접 구현하여 사용하게 되었고, 스레드 세이프를 하기 위해서 static inner class를 사용하게 되었다. public class LottoTicketBooth { private LottoTicketBooth() { } private static class LottoTicketBoothHolder { private static final LottoTicketBooth LOTTO_TICKET_BOOTH = new LottoTicketBooth(); } public static LottoTicketBooth getInstance() { return LottoTicketBoothHolder.LOTTO_TICKET_BOOTH; } } 위와 같이 사용하게 된다면 LottoTicketB..

JVM/Java

[Java] junit5 파라미터로 List 전달하는 방법

😎서론 junit으로 파라미터 전달하는 어노테이션은 여러가지가 존재한다. @ValueSource @CsvSource @NullSource @NullAndEmptySource 이 외에 더 있다.. 그 중에서 List로 Parameter를 전달하는 방법이 필요해서 검색한 도중에 찾게 되었고, 자주 사용할 것 같아서 기록해두려 한다. 😀본론 @ParameterizedTest - 파라미터를 전달받을 수 있는 테스트를 만든다. @MethodSource("메소드 명") - 메소드의 리턴 값으로 파라미터를 전달한다. static Stream generateData() { return Stream.of( Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 46), "MethodSource 테스트..

JVM/JPA

[JPA] save() isNew를 사용하여 성능개선 하기

😎 서론 사내 모든 프로젝트에서는 데이터베이스에 값을 저장할 때 아이디를 유니크한 값으로 자동생성해주는 로직을 만들어 별도로 태운 후 save()를 하게 된다. 결국 이로 인해 처음 INSERT를 하기 위해서 save를 보낸 모든 데이터 또한 SELECT를 꼭 호출하고, INSERT를 호출하게 되는 문제가 있다. 이는 데이터가 많으면 많을 수록 성능저하에 큰 문제가 있기에 이 로직을 파악하고 성능개선하는 방법을 공유해본다. 😉 본론 ⏳ save() 로직 파악하기. SimpleJpaRepository 클래스에 있는 save()메소드는 아래와 같이 동작을 한다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity ..

JVM/Java

[Java]Stack 대신 Deque 사용하기

😮서론 스택이 필요해서 사용하려고 하던 중 소나린트에서 Stack 대신 Deque를 사용하는게 좋다는 안내가 나왔고, 왜 그런지 알아보려 한다. 😎본론 스택(Stack)이란? - 자료구조의 하나로서 후입선출(Last In First Out)를 의미한다. - 후입선출이란 마지막에 들어온 데이터가 가장 먼저 나가는 방식을 의미한다. - 자바에서는 Stack을 class 형태로 지원해주고 있다. 반대개념 큐(Queue) - Queue의 경우는 선입선출(First In First Out)를 의미한다. - 선입선출이란 처음에 들어온 데이터를 가장 먼저 내보내는 방식을 의미한다. - 자바에서 Queue는 인터페이스로 구현이 되어 있어 보통 LinkedList를 사용해서 구현하곤 한다. 그럼 Deque란? - 자바 ..

JVM/Java

[Java] HashMap. stream으로 sum하기

😎서론 이번 HashMap에서 sum을 해야하는 상황이 생겨서 분명 get으로 꺼내서 하나씩 sum하는 것 말고 stream으로 하는 방법이 있을 것 같아서 찾아봐서 기록한다. 😋본론 mapToInt와 reduce 방식 두 가지를 보게 되었는데 reduce가 개인적으로 더 깔끔해보여서 자주 사용하게 될 것 같다. public static int getSum(final Map data) { return data.values().stream().mapToInt(Integer::intValue).sum(); } public static int getSum(final Map data) { return data.values().stream().reduce(0, Integer::sum); } 역시.. 항상 '이런거..

JVM/Spring

[SPRING] @Transactional readOnly 성능향상 이유

🙄서론 트랜잭션에 있는 readOnly가 읽기전용모드로서 cud가 발생하게 되면 에러를 뱉어주고, 읽기만 가능한 기능으로 알고 있었다. 그런데, 왜 성능향상에도 도움이 되는가에 대해선 자세히 몰라서 알아보았다. 😎본론 @Transactional(readOnly = true) 트랜잭션에서 readOnly=true 라는 옵션을 설정한다. FlushMode 를 MANUAL로 변경하여 dirty checking(변경감지) 을 생략한다. flush와 commit이 일어나지 않고, 이로 인해 영속성 컨텍스트에서는 스냅샷을 보관하지 않아 약간의 성능향상이 이루어지는 것. 크게 눈에 띄게 성능향상이 이루어지지는 않는다고 한다. 보통 사용하는 이유로는 해당 메소드가 변경이 되면 안되고, 조회하는 걸 명확하게 명시해주기 ..

Hyo Kim
'java' 태그의 글 목록 (2 Page)