Oracle - 실행 계획으로 복잡한 쿼리 최적화해보기
·
SQL
배경백오피스를 운영하면서 항상 거슬렸던 부분이 있었다. 바로 느리게 로딩되는 주문 관리 페이지다. 원인은 굉장히 오래 걸리는 주문 목록 조회 쿼리였다. 주문 관리 페이지는 고객의 주문 정보, 배송 현황 등 다양하고 복잡한 데이터를 실시간으로 처리하고 표시해야 하는 중요한 화면이다. MD들은 업무 특성상 하루에도 수차례 이 페이지에 접속해야 하는데, 긴 로딩 시간을 감내해야 하는 상황이었다. 이는 단순히 개인의 불편함을 넘어서 전체적인 업무 효율성 저하로 이어질 수 있었다.(라고 생각한다.)그래서 팀에 건의하여 쿼리를 최적화해보기로 했다. 개발 환경Oracle11gDBeaver (Community Edition 24.1) 쿼리 구조쿼리 최적화를 할 때 가장 중요한 건 최적화하려는 쿼리의 역할과 기능을 아는..
IntelliJ - Git Log 화면이 안나올 때 원인과 해결 방법
·
나의 에러 일지
배경IntelliJ에서 커밋 히스토리 확인을 위해 Git Log 화면을 열었는데 빈 화면으로 나왔다.빨리 해결해보자 개발 환경IntelliJ IDEA 2024.1.4 (Ultimate Edition)MacOS (Monterey) 원인JetBrains Support 쪽 질문에 비슷한 현상에 대한 글이 있었고 거기에 담당자가 남긴 답변에서 이러한 현상이 발생할 수 있는 두 가지 원인에 대해 언급하고 있다.Git Log, Branch 등이 전혀 보이지 않는 경우 VCS.xml 파일이 없거나 잘못된 리포지토리를 가리키고 있을 수 있다.(VCS.xml에는 GUI를 사용하여 버전 관리 작업을 수행할 수 있도록 프로젝트의 VCS에 대한 정보가 저장되어 있다.)Git Log만 보이지 않는 경우 특정 분기점에서 인덱싱이..
리팩토링(Refactoring) - 랜덤 쿠폰 뽑기 성능 개선하기
·
Refactoring
배경새해 기념 랜덤 쿠폰 이벤트 페이지를 개발하면서 기존 랜덤 쿠폰 발급 성능을 개선했던 과정을 정리해본다.가중치 기반 랜덤 알고리즘은 다음 글에서 정리했으니 궁금하다면 참고 바란다. Algorithms - 가중치 랜덤 알고리즘(랜덤 쿠폰 뽑기)배경커머스 플랫폼 개발에서 랜덤 쿠폰 지급 이벤트는 빈번히 요구되는 기능이다. 이러한 이벤트에서는 일반적으로 할인율이 낮은 쿠폰일수록 당첨 확률이 높고, 할인율이 높은 쿠폰일수록 당green-bin.tistory.com 개발 환경Java 8SpringIntelliJ 기존 로직기존 랜덤 쿠폰 발급 로직 흐름을 살펴보자가중치 배열을 순회하며 누적 합(runningTotal)을 계산각 누적 합을 리스트(totals)에 추가 총 누적 합 범위 내에서 랜덤 값(rando..
Spring - Spring Boot 3.x에서 View 렌더링되지 않는 원인과 해결 방법
·
Spring
배경Spring Boot 3로 프로젝트를 개발하던 중 에러가 발생했다. 간단한 웹 페이지를 JSP로 구현하고 있었는데, 페이지를 열어보니 JSP 화면 대신 Whitelabel Error Page가 나타났다. 컨트롤러에서 main이라는 뷰 이름을 반환했고, 해당 JSP파일도 정확한 위치에 있었다. 그런데 왜 Spring Boot는 JSP를 찾지 못하고 Whitelabel Error Page를 표시하는걸까? build.gradledependencies { ... // JSP implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'..
Spring Boot - Repository 단위 테스트하기(JPA, Querydsl, Mybatis)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
Algorithms - 가중치 랜덤 알고리즘(랜덤 쿠폰 뽑기)
·
Algorithms
배경커머스 플랫폼 개발에서 랜덤 쿠폰 지급 이벤트는 빈번히 요구되는 기능이다. 이러한 이벤트에서는 일반적으로 할인율이 낮은 쿠폰일수록 당첨 확률이 높고, 할인율이 높은 쿠폰일수록 당첨 확률이 낮다. 이를 구현하기 위해 각 쿠폰에 가중치를 부여하고, 랜덤하게 쿠폰을 발행하는 가중치 랜덤 알고리즘(Weighted Random Algorithm)이 사용된다. 이번 포스트에서는 이 알고리즘을 알아보고 실제 구현, 테스트까지 진행해보자.  가중치 랜덤 알고리즘(Weighted Random Algorithm)가중치 랜덤 알고리즘은 각 요소에 가중치를 할당해서 선택 확률을 조절하여 선택하는 알고리즘이다.가중치가 높을수록 선택될 확률이 높고 가중치가 낮을수록 선택될 확률이 낮다. 사용 사례게임 개발: 디아블로 시리즈를..
Spring Boot - Service 단위 테스트하기(JUnit5, Mockito, AssertJ)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
Spring Boot - Controller 단위 테스트하기(JUnit, MockMvc, Mockito)
·
Spring
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. - 위키백과 배경현재 내가 일하고 있는 조직에서는 테스트 코드 작성을 하지 않는다. 이로 인해 코드 수정이나 기능을 추가해야 할 때 수동으로 테스트를 진행해야 했다. 작은 변경사항에도 전체 기능을 다시 테스트해야 하는 상황이 자주 발생했고, 이는..
JPA - JPA에서 일괄 삭제하는 방법과 주의점 (deleteAllById, deleteAllByIdIn, deleteAllByIdInBatch, Querydsl)
·
JPA
배경현재 프로젝트에서 Mybatis -> JPA로 마이그레이션하는 작업을 하고 있다.기존에 데이터를 일괄 삭제하던 쿼리를 JPA의 deleteAllById 메서드 하나로 쉽게 구현할 수 있었다.하지만 테스트 코드로 테스트를 해보니 내가 의도한 것과 다르게 쿼리가 실행되고 있었다. 내가 생각한 쿼리delete from task where task_id in (?, ?)in 쿼리로 일괄 삭제실제 실행된 쿼리-- 각 ID에 대한 개별 조회select task_id from task where task_id = ?select task_id from task where task_id = ?-- 조회된 엔티티 개별 삭제delete task_id from task where task_id = ?delete task..
JPA - 연관 관계를 위한 불필요한 select 줄이기(getReferenceById())
·
JPA
개요데이터베이스에 연관 관계를 가진 엔티티를 저장할 때, 우리는 종종 연관된 엔티티의 모든 정보를 조회(SELECT)하게 된다. 하지만 이러한 방식은 의문점을 들게한다.'실제로 DB에 저장되는건 연관 객체의 ID뿐인데, 왜 모든 정보를 조회해야 할까?' @Service@Transactional@RequiredArgsConstructorpublic class OrderServiceImpl implements OrderService { private final OrderRepository orderRepository; private final CustomerRepository customerRepository; public void saveOrder(Long customerId) { ..
Cold Bean
'분류 전체보기' 카테고리의 글 목록