JVM

JVM/Java

[Java] GC (Garbage Collection) ??

😎서론 Java가 유명해진 큰 이유 중 하나로는 역시 다른 언어와는 다르게 GC라는 녀석이 있기 때문이다. 그렇기에 Java를 제대로 이해하고 사용하려면 GC가 무엇이고, 어떤 걸 하는지, 어떻게 무엇을 튜닝해야 할지를 알아야 Java 개발자로서 성장하는 데에 필수 조건이라 생각하기에 한번 정리를 해본다! 😏본론 GC(Garbage Collection) ? 직역하자면, 쓰레기 수거를 의미합니다. 결국 불필요한 즉, 사용되지 않는 메모리에 할당된 객체들을 직접 정리해주는 역할을 하고 있습니다. 한 줄로 정의하자면, Heap 영역에서 더이상 사용되지 않는 객체들을 메모리에서 제거합니다. GC가 왜 필요하지? GC가 없는 다양한 언어들에서는 메모리를 직접 정리해주어야 합니다. 그렇기 때문에 객체를 하나하나 연..

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/Spring

[SPRING] 스프링의 컨트롤러는 어떻게 여러 작업을 처리할까?

🤔서론 'TDD, Clean Code with Java' 자동차 경주 미션을 진행하던 도중 해당 리뷰를 받았고, 궁금한 게 생기게 되었다. 스프링의 컨트롤러는 Bean을 통해 싱글톤으로 하나의 객체만이 생성이 될텐데.. 어떻게 여러 작업을 처리하지..?🤔 😲본론 제가 이상하다고 생각했던 부분은 이 부분입니다. 1개만이 생성된 컨트롤러가 어떻게 동시에 10건이든 10만건이든 아무 문제 없이 잘 처리할 수 있지?? 고민의 답을 찾기 위해 구글을 돌아다니던 중 저와 같은 고민을 한 글을 발견하고 답을 찾았습니다. (블로그) Controller 1개가 어떻게 수 많은 Request를 처리하는가? (spring mvc, tomcat thread, singleton bean) Controller 1개가 어떻게 수 ..

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란? - 자바 ..

Hyo Kim
'JVM' 카테고리의 글 목록 (5 Page)