전체 글 470

fetch() - 2 : 적정 fetchSize 분석, 그리고 limit의 개념

목차fetchSize의 개념적정 fetchSize를 찾아서global fetchSize와 custom fetchSize결론 : limit과 fetchSize를 적절히 조정하자이전 글인 fetch() -1 : ResultSetType 분석에서 ResultSetType의 개념 및 분석을 정리했다. 이번에는 fetchSize의 개념에 대해 분석해보자.1. fetchSize의 개념--- 커서(>)를 사용하여 다음 10개의 레코드를 가져오는 쿼리 (마지막 ID를 기준으로)SELECT * FROM users WHERE id > 10 ORDER BY id LIMIT 10;statement.setFetchSize(10); // JDBC Statement 객체로 fetchSize 조정상기 native Query와..

fetch() - 1 : ResultSetType 분석

목차fetch()란?fetch()를 뜯어보자rs.next()를 뜯어보자ResultSet의 타입을 뜯어보자로컬에서 로그를 남겨보자로그가 포착됐다1. fetch()란?QueryDSL을 사용하면서 아래와 같은 fetch()는 흔하게 본다. public List findActiveMembers() { return jpaQueryFactory .selectFrom(m) .where(m.active.isTrue()) .orderBy(m.id.asc()) .fetch(); }코드를 보면 짐작이 가겠지만 fetch()는 List로 결과를 반환할 때 사용된다.fetch()와 파생된 메서드는..

자바의 스레드(Daemon Thread vs Non-daemon Thread), 그리고 좀비 프로세스

목차자바의 스레드데몬 스레드(Daemon Thread)일반 스레드(Non-Daemon Thread)좀비 프로세스와 일반 스레드의 이슈참고 자료1. 자바의 스레드모든 자바 프로그램은 기본적으로 Thread(스레드)를 사용한다.Thread는 JVM 안에서 실행되는 실행 단위를 일컬으며, 하나의 프로세스(JVM) 안에 여러 개의 스레드가 동시에 실행될 수 있다.예시로 API를 콜 할때 사용되는 스레드도 JVM안에서 실행되는 스레드이다.JVM이 실행되면 main 스레드 뿐 아니라 가비지 컬렉션, 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다.2. 데몬 스레드 (Deamon Thread)Daemon : 사용자의 직접적인 제어를 받지 않고 백그라운드 프로세스로 ..

@PostConstruct과 @FeignClient의 이슈

목차@PostConsttuct관련 이슈해결책 (1) : 어플리케이션 구동 성공 후 호출해결책 (2) : try - catch로 예외 처리1. @PostConstruct스프링 공식 문서에서 제공하는 @PostConstruct와 관련된 설명은 다음과 같다.The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method must be invoked before the class is put into service. This annotation must be supported on all classes t..

ThreadLocal과 @Async

목차Java의 ThreadLocal이란?@Async로 비동기 호출시 ThreadLocal은?직접 격었던 관련 이슈1. Java의 ThreadLocal이란?Java 공식 문서의 ThreadLocal을 먼저 읽고오자.ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).이 ThreadLocal에는 어떤 데이터가 담기는걸까?일반적으로 ThreadLocal은 하나의 요청 처리 과정 중에서 동일한 Thread 안에서만 유효해야하는 컨텍스트성 데이터를 저장하는데 쓰인다.개인적으로 경험했던 실무 중, Java..

Redis의 기초 개념을 이해해보자

목차Redis는 안써봐서 모르겠어요RDBMS vs NoSQLMySQL vs Redis스키마확장성트랜잭션Redis의 특징디스크 X , 인메모리 O = 빠름싱글 스레드 고가용성 (automatic fail over)기타참고 자료1. Redis는 안써봐서 모르겠어요2024년 한 해 동안 개발자 친구들과 얘기하면서 지식을 공유할 때, 빈번하게 사용됐던 문장은 위의 소제목이 아닐까 싶습니다. 현업에서는 MySQL만을 사용하다보니, 개인적으로는 NoSQL에 대한 경험이 전무한 상황이었습니다.이로 인해 아래와 같은 대화가 나눠진 적이 있었습니다.🙋🏻‍♀️ 어드민에서는 DB 테이블에서 extraData라는 컬럼을 하나 만들어두고, 그 안에 json 형식으로 key - value를 저장하고 -> 데이터를 역직렬화..

🖥️ CS/DB 2025.02.11

복합 인덱스의 순서는 중요하다

목차작성 계기인덱스란?인덱스 컬럼 기준복합 인덱스의 순서는 중요하다예시 사례 - 4개의 복합 인덱스1번 인덱스만 타는 경우1번, 2번 인덱스를 타는 경우2번, 1번 인덱스를 타는 경우 (역방향)1번, 4번 인덱스를 타는 경우2번 ~ 4번 인덱스를 타는 경우결론참고 자료0. 작성 계기현업에서는 쿼리 작성 후 해당 쿼리가 적절한지에 대한 판단을 DBA분께 문의를 드립니다.만약 성능이 좋지 못한 쿼리라면 개선책을 제시해주시며, 개발자는 이를 따라 쿼리를 수정하게 됩니다.개발자가 DB에 대한 깊은 이해를 하지 못한 상황에서도 적절성에 대한 유효성을 체크해주시니 좋은 일이지만,이에 의존하여 가끔은 내가 짠 쿼리가 제대로 인덱스를 타는지 아닌지를 모르는 경우가 발생합니다.특히 업무가 바쁘거나, 생각보다 단순한 쿼리..

🖥️ CS/DB 2025.01.06

@EntityListener와 @PostLoad의 이슈

목차findBy에서 왜 UPDATE 쿼리가 나가지?프로시저와 연관이 있을까?범인은 @EntityListeners일부 중요한 비즈니스 변수명은 임의의 값으로 변경했다는 점을 알아두자.1. findBy에서 왜 UPDATE 쿼리가 나가지?아래와 같은 비즈니스 로직이 있었다. @Override @MyProjectWriteTransactional // 커스텀 트랜잭션 어노테이션 public String changeMoney(ChangeMoneyCommand command) { // entity를 flush 하는 로직 // procedure를 콜 하는 로직 return MemberRatingQuery.getMemberRatingMandatory(command.memberId()).getMemb..

DB 데이터 동시성 이슈 해결법

목차작성 계기동시성 이슈의 원인해결책 (1) - 물리적 DB 1개 사용해결책 (2) - DB간의 동기화 (MQ)해결책 (3) - Kafka + 물리적 DB 1개 사용1. 작성 계기Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)의 강의를 듣고 인상 깊은 내용을 정리 중이다.현업에서는 Master DB 1대 Slave DB 1대로 레플리카구조로 이루어진 프로젝트가 대부분이다.만약 동일 서비스에 Master DB가 여러대일때의 상황을 고려해본 적이 별로 없다.(레플리카에 대한 설명은 클러스터링, 레플리카, 그리고 샤딩 게시글에서 확인해보자.)강의를 통해 학습했으니 내용을 정리해보자.2. 동시성 이슈의 원인해당 프로젝트에서는 USER SERVICE 에서 ORDER SERVICE API를 ..

🖥️ CS/DB 2024.11.13