DB 25

JPA Entity Timestamp 관리 전략: DB Level vs Application Level

JPA Entity에서 생성 시간(created_at)과 수정 시간(updated_at)을 관리하는 방식은 크게 두 가지로, 데이터베이스 레벨(columnDefinition)과 애플리케이션 레벨(@CreationTimestamp/@UpdateTimestamp)입니다. 각 방식의 특징과 적합한 사용 환경에 대해 알아보겠습니다.1. 데이터베이스 레벨 관리 (columnDefinition)1.1 구현 방식@Column(name = "created_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")@Generated(event = EventType.INSERT)private Instant createdAt;@Column(name = "updated_a..

DB/JPA 2025.01.20

인덱스(Index)의 원리와 성능 최적화 방법

데이터베이스를 사용하다 보면 쿼리의 성능을 높이기 위해 인덱스를 추가하는 경우가 있다. 많은 주니어 개발자들이 경험하듯, 인덱스를 추가하면 데이터 조회 속도가 빨라지는 것을 자주 경험하게 된다. 하지만 그 원리를 정확히 이해하지 못하면 잘못된 인덱스를 생성해 오히려 성능을 저하시키기도 한다. 이번 글에서는 인덱스의 원리와 성능에 미치는 영향을 그림을 통해 쉽게 설명해보고자 한다.  인덱스의 기본 개념인덱스는 책의 목차와 유사한 개념이다. 책에서 원하는 내용을 찾을 때 처음부터 끝까지 한 페이지씩 넘겨보는 것보다 목차를 통해 원하는 챕터나 페이지를 바로 찾는 것이 훨씬 빠르듯이, 데이터베이스에서도 인덱스는 특정 열(column)에 대한 참조 테이블을 만들어서 데이터 조회를 빠르게 도와준다. 인덱스의 작동 ..

DB 2024.09.26

Redis, 초면입니다. - 정의, 구조, 장단점, 활용 사례

Redis의 정의 Redis는 Remote Dictionary Server의 약자로, 오픈 소스 인메모리 데이터 구조 스토어이다. 주로 키-값 형태의 데이터 저장소로 사용되며, 고속의 읽기 및 쓰기 성능을 자랑한다. Redis는 다양한 데이터 구조를 지원하는데, 문자열, 해시, 리스트, 세트, 정렬된 세트, 비트맵, 하이퍼로그로그, 지리공간 인덱스 등이 포함된다.  Redis의 원리 Redis는 메모리 내에서 모든 데이터를 저장하며, 필요 시 디스크에 지속적으로 데이터를 저장하여 데이터를 보호한다. 데이터는 메모리에서 직접 읽고 쓰기 때문에 매우 빠른 성능을 제공한다. Redis는 싱글 스레드로 동작하여 동시성 문제가 발생하지 않으며, 이는 데이터 일관성을 유지하는 데 도움이 된다.  Redis의 구조 ..

DB/Redis 2024.06.16

PL_SQL(Procedural Language extension to SQL)

PL_SQL(Procedural Language extension to SQL) PL/SQL은 오라클에서 제공하는 절차적인 프로그래밍 언어이다. SQL 문의 반복적인 실행이나 조건에 따른 분기 등 다양한 기능을 제공한다. PL/SQL은 선언부(DECLARE SECTION), 실행부(EXECUTABLE SECTION), 예외 처리부(EXCEPTION SECTION)로 구성된다. 오라클에서 내장되어 있는 절차적 언어로 SQL 문장 내에서 변수를 정의, 조건 처리(IF), 반복 처리(LOOP, WHITE, FOR)등을 지원한다. -- 출력 기능 활성화 (환경 변수를 ON으로 바꿔준다.) SET SERVEROUTPUT ON; DECLARE -- 선언부 ... BEGIN -- 실행부 ... EXCEPTION --..

DB/SQL 2022.09.15

OBJECT - TRIGGER

TRIGGER TRIGGER는 오라클에서 제공하는 객체로 테이블이나 뷰가 DML(INSERT, UPDATE, DELETE)문에 의해 변경될 경우(테이블에 이벤트 발생 시) 자동으로 실행될 내용을 정의하여 저장한다.**** TRIGGER 생성 TRIGGER는 CREATE 구문을 사용해서 생성한다. CREATE [OR REPLACE] TRIGGER 트리거명 BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명 [FOR EACH ROW] --> 행 트리거 [DECLARE 선언부] BEGIN 실행부 (해당 위에 지정된 이벤트 발생 시 자동으로 실행할 구문) [EXCEPTION 예외처리부] END; / 트리거 종류 STATEMENT TRIGGER 해당 SQL문에 대해 한 번만 트리거를 실행한..

DB/SQL 2022.09.14

OBJECT - CURSOR

CURSOR SQL문의 처리 결과(처리 결과가 여러 행)를 담고있는 객체이다. 커서 사용시 여러 행으로 나타난 처리 결과에 순차적으로 접근이 가능하다. 묵시적 커서 오라클에서 자동으로 생성되어 사용하는 커서이다. PL/SQL 블록에서 실행하는 SQL문 실행 시마다 자동으로 만들어져서 사용된다. -- 실습에 사용한 테이블 생성 CREATE TABLE EMP_COPY AS SELECT * FROM EMPLOYEE; SELECT * FROM EMP_COPY; -- PL/SQL을 사용해서 EMP_COPY에 BONUS가 NULL인 사원의 BONUS를 0으로 수정 BEGIN UPDATE EMP_COPY SET BONUS = 0 WHERE BONUS IS NULL; -- 묵시적 커서 사용 DBMS_OUTPUT.PUT..

DB/SQL 2022.09.13

OBJECT - FUNCTION

FUNCTION FUNCTION은 오라클에서 제공하는 객체로 PROCEDURE와 거의 유사한 용도로 사용하지만 PROCEDURE와 다르게 OUT 변수를 사용하지 않아도 실행 결과를 되돌려 받을 수 있다. (RETURN)**** FUNCTION 생성 FUNCTION은 CREATE 구문을 사용해서 생성한다. FUNCTION은 PROCEDURE와 다르게 RETURN 구문이 추가된다. CREATE OR REPLACE FUNCTION 함수명 ( 매개변수 1 타입, 매개변수 2 타입, ... ) RETURN 데이터 타입 IS [AS] 선언부 BEGIN 실행부 RETURN 반환값; [EXCEPTION 예외 처리부] END [함수명]; / -- 사번을 입력받아 해당 사원의 보너스를 포함하는 연봉을 계산하고 리턴하는 함..

DB/SQL 2022.09.12

OBJECT - PROCEDURE

PROCEDURE PROCEDURE는 오라클에서 제공하는 객체로 PL/SQL 문을 저장하여 필요할 때마다 복잡한 구문을 다시 입력할 필요 없이 간단하게 호출해서 실행 결과를 얻을 수 있다. 함수는 특정 연산을 수행한 뒤 결과 값을 반환하지만 프로시저는 특정한 로직을 처리하기만 하고 결과 값은 반환하지 않는 서브 프로그램입니다. PROCEDURE 생성 PROCEDURE는 CREATE 구문을 사용해서 생성한다. PROCEDURE를 실행할 때는 EXCUTE(EXEC) 명령을 사용합니다. CREATE [OR REPLACE] PROCEDURE 프로시저명 ( 매개변수 1 [IN|OUT] 데이터 타입 [:= DEFAULT 값], 매개변수 2 [IN|OUT] 데이터 타입 [:= DEFAULT 값], ... ) IS [..

DB/SQL 2022.09.11

OBJECT - SYNONYM

SYNONYM SYNONYM은 오라클에서 제공하는 객체로 데이터베이스 객체에 별칭을 생성한다. SYNONYM을 사용하면 다른 사용자가 제공하는 객체를 참조할 때 간단하게 사용할 수 있다. SYNONYM 생성 SYNONYM은 CREATE 구문을 사용해서 생성한다. 1) 비공개 SYNONYM 객체에 대한 접근 권한을 부여받은 사용자가 정의한 동의어로 해당 사용자만 사용이 가능하다. -- 사용자 계정에서 실행한다. CREATE SYNONYM EMP FOR EMPLOYEE; -- KH 계정으로 접속 CREATE SYNONYM EMP FOR EMPLOYEE; -- 권한이 없어서 오류 -- 관리자 계정으로 KH 계정에 SYNONYM 생성 권한을 준다. GRANT CREATE SYNONYM TO KH; -- 다시 K..

DB/SQL 2022.09.10

OBJECT - INDEX

INDEX INDEX는 오라클에서 제공하는 객체로 SQL 명령문의 처리 속도를 향상시키기 위해서 행들의 위치 정보를 가지고 있다. (내부 구조는 B-트리 형식으로 구성) 검색 속도가 빨라지고 시스템에 걸리는 부하를 줄여 시스템 전체 성능을 향상시킨다. 인덱스 구조 ROWID는 데이터베이스에 저장되어 있는 데이터의 주소이다. 인덱스는 KEY와 ROWID를 가지고 있는데 KEY는 인덱스를 생성할 때 지정한 컬럼의 값이고 ROWID는 KEY에 해당하는 데이터의 주소 이다. SELECT ROWID, EMP_ID, EMP_NAME FROM EMPLOYEE; 인덱스 종류 -- 춘 대학교 계정(STUDY)으로 이동 SELECT * FROM TB_STUDENT WHERE STUDENT_NAME = '황효종'; --WH..

DB/SQL 2022.09.09