Dev/DataBase7 『DataBase』 Oracle SQL & MyBatis Mapper 부먹 복잡한 결재 시스템을 구축한다고 가정하고, Oracle SQL과 MyBatis Mapper를 조합해서 다양한 쿼리들을 구현해 보자.간단한 예제 쿼리로는 복잡한 비즈니스 로직이 녹아있는 실무의 쿼리를 이해할 수 없기에 조금 복잡한 내용들을 다루어 보려고 한다. 우선 쿼리를 작성하려면 테이블이 존재해야 되기 때문에 아래와 같이 4개의 예제 테이블을 정의하겠다. 하나의 사용자는 여러 결재 요청을 생성할 수 있어 둘 사이에는 1대 N(One-to-Many) 관계가 성립한다. 동시에 결재 단계 테이블을 매개로 하나의 결재 요청은 여러 사용자에게 결재를 받을 수 있고, 한 사용자도 여러 결재 요청의 승인자가 될 수 있어 결재 단계와 사용자 사이에는 N대 N(Many-to-Many) 관계가 성립한다. 또한 사용.. 2024. 12. 22. 『DataBase』 Oracle SQL 중급 문법 Oracle SQL 기초 문법에 이어서 Oracle 중급 문법을 살펴보자.기초 문법에서 Oracle에서 제공해 주는 기본적인 내장 함수들 몇 개를 살펴봤다. 중급 문법에서는 실질적으로 실무에서 자주 사용하는 문법에 대해 알아보자. GROUP BY GROUP BY 절은 쿼리 결과를 지정한 표현식(expression)에 따라 그룹으로 묶어 집계 작업을 수행할 때 사용한다. 각 그룹에 대해 하나의 행을 반환하며 집계 함수와 함께 사용하여 그룹별 통계 값을 얻을 수 있다. department_id별로 그룹화한 후 HAVING 절을 사용하여 평균 급여가 5000 이상 인 부서만 선택한다. GROUP BY 확장 기능 Oracle SQL은 그룹화 및 집계 작업을 더욱 유연하게 수행할 수 있도록 ROLLUP,.. 2024. 11. 18. 『DataBase』 Oracle SQL 기초 문법 MySQL, MariaDB만 사용해 왔는데 어쩌다 보니 Oracle을 사용하게 되었다.다음에 진행할 프로젝트에서 ORM을 사용할지 Mapper를 사용할지 결정된 게 없기 때문에 우선 Oracle 기초 문법부터 살펴보자. SELECT문과 별칭 사용DISTINCT 키워드를 사용하여 조회 결과에서 중복된 행을 제거할 수 있다.AS 키워드를 사용하여 열이나 테이블에 별칭을 지정할 수 있다. 날짜 함수NEXT_DAY(date, char): 주어진 날짜 이후의 다음 특정 요일의 날짜를 반환한다.ADD_MONTHS(date, n): 주어진 날짜에 n개월을 더하거나 뺀다.MONTHS_BETWEEN(date1, date2): 두 날짜 사이의 개월 수를 계산한다. 조건문(CASE) 사용 CASE 문은 SQL에서 조건.. 2024. 11. 18. 『DataBase』 MyBatis 문법 MyBatis 문법 SQL 매핑 파일 (XML)MyBatis는 SQL 매핑 파일을 사용하여 SQL 쿼리와 자바 메서드를 매핑한다.이 파일은 요소로 시작하고,, , , 등의 요소를 사용하여 각각의 SQL 쿼리를 정의한다. #{}MyBatis에서는 SQL 쿼리에 매개 변수를 바인딩하여 동적인 쿼리를 생성할 수 있다.#{} 형식을 사용하여 매개 변수를 바인딩할 수 있다.예를 들어, WHERE id = #{userId}와 같은 형식으로 매개 변수를 사용할 수 있다. resultMapSQL 쿼리의 결과를 자바 객체에 매핑할 수 있다. 요소를 사용하여 결과 매핑을 정의하고, resultType 속성을 사용하여 자바 객체의 클래스를 지정할 수 있다. 요소를 사용하여 각 열을 자바 객체의 속성에 매핑한다. .. 2024. 11. 1. 『DataBase』 MyBatis 내부 구조 MyBatis Java 객체와 SQL문 사이의 자동 매핑 기능을 지원하는 Persistence Framework다. SQL을 별도의 파일로 분리해서 관리하며, 객체와 SQL 간의 파라미터 매핑 작업을 자동으로 처리한다. ✅ Persistence Framework 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다. MyBatis 특징간단하고 직관적인 Persistence Framework다. SQL을 그대로 사용할 수 있다. Spring MyBatis Core ComponentDataBase Access Architecture 위 이미지는 MyBatis와 MyBatis-Spring을 사용하여 데이터베이스에 접근하는 구조를 보여준다.각 계층의 역할은 다음과 같다. 계층.. 2024. 11. 1. 『DataBase』 대용량 데이터를 마이그레이션 할 때 무엇을 고려해야 할까 1️⃣편 Multi Column Index다중 컬럼 인덱스는 데이터 조회 시 함께 사용되는 컬럼들의 조회 성능을 최적화하기 위해 사용된다.각 컬럼에 개별 인덱스를 설정하는 것과 다중 컬럼 인덱스를 사용하는 것에는 차이점이 존재하는데 아래와 같다. 개별 인덱스를 각 컬럼에 설정한 경우, 데이터베이스는 쿼리 실행 시 어느 인덱스를 우선 사용할 것인지 판단한 후, 선택된 인덱스에 따라 순차적으로 검색을 진행한다. 이 과정에서 필요한 경우 여러 인덱스를 결합하여 사용할 수 있지만 추가적인 비용이 발생할 수 있다. 반면, 다중 컬럼 인덱스는 상위 컬럼의 인덱스 값에 대해 하위 컬럼의 값을 함께 저장한다. 따라서 쿼리 실행 시 어떤 인덱스를 먼저 사용할지를 판단하는 과정이 생략되고, 상위 인덱스에 의해 이미 필터링된 결과 .. 2024. 8. 20. 『DataBase』 Legacy Query 성능 개선 과정 Query 성능 개선이 필요했던 이유약 28,000개의 데이터 행을 처리하는 조회 기능에서 성능 저하 현상이 발생했다. 데이터가 많지 않았기 때문에 성능 저하를 예상하지 못했다. 조회 응답 시간이 5,500ms ~ 6,000ms 정도 소요되었고, 유저 입장에서는 해당 기능이 중지된다고 느껴질 정도였다. 해당 기능은 장애 발생 시 모니터링 인원의 편의성을 위해 만들어진 것으로, 평상시 자주 사용하지는 않지만, 소 잃기 전에 외양간을 고친다는 마음으로 성능 개선을 시도했다. 총 2번의 개선 시도가 있었으며, 그 내용은 다음과 같다. 1차 개선1. 서브 쿼리를 사용하던 기존 구조를 조인 구조로 리팩토링2. 총행수를 계산하기 위해 전체 쿼리를 서브 쿼리로 감싸던 방식을 명시적으로 조인된 테이블에서 직접 계산하도.. 2024. 7. 25. 이전 1 다음