인덱스(Index)

데이터베이스에서 Index라는 개체는 테이블의 검색 능력을 향상시키는 데에 중요한 역할을 합니다. 인덱스는 어떻게 생성하는 거고 왜 사용해야 할까요?

 

검색 능력 향상

인덱스를 사용하지 않고 검색하면 조건에 맞는 데이터를 찾기 위해 테이블에 있는 데이터를 모두 조회합니다. MySQL에서 제공하는 샘플 데이터 employees에서 데이터를 조회하여 확인해봅시다.

 

explain select * from employees where first_name = 'Georgi';

 

샘플 데이터를 가지고 위 쿼리를 실행했습니다.

 

결과를 보면 네번째 컬럼 type에 ALL이 들어간 걸 볼 수 있습니다. 또 row 컬럼의 값이 299778인데 이는 해당 데이터를 조회하기 위해 순회한 열의 갯수입니다. 즉, 인덱스를 사용하지 않고 검색을 했을 때는 테이블에 있는 모든 데이터를 순회하기 때문에 속도가 느려집니다. 그러면 인덱스를 사용하면 어떻게 될까요?

 

인덱스 생성

create index idx_employees_first_name on employees(first_name);

 

위 쿼리는 테이블 'employees'의 컬럼 'first_name'에 인덱스를 생성하는 쿼리입니다. create index 뒤에 'idx_employees_first_name'에서 idx는 index를 의미하고 그 뒷부분은 테이블 이름과 컬럼 이름입니다. 이렇게 생성하고 앞에서 검색했던 내용을 다시 검색해보겠습니다.

 

아까는 type에 ALL이라고 적혀있었으나 ref(참조)로 바뀐 것을 볼 수 있고 rows도 253으로 줄어든 것을 볼 수 있습니다. 기존에 모든 데이터를 순회하여 찾는 방식과 다르게 인덱스를 이용하면 해당 데이터가 어디 있는지 알고 있기 때문에 검색 속도가 줄어들게 되고 데이터가 많을 때 검색 속도를 향상시킬 수 있는 데이터베이스 튜닝은 한 가지 방법입니다.

Spriong Boot Devtools

Devtools는 Spring Boot에서 코드가 수정되면 어플리케이션을 재실행해야 되는 불편한 점을 해결할 수 있도록 제공되는 모듈입니다.

 

설정 방법

1) build.gradle의 dependencies에 내용 추가

 

17번째 줄에 있는 내용 추가

 

2) Settings > Advanced Settings > Allow auto-make to start even if developed application is currently running 체크

 

 

3) Settings > Build, Execution, Deployment > Complier > Build project automatically 체크

 

 

DTO(Data Transfer Object)

계층 간 데이터 교환을 위해 사용하는 객체로 데이터 교환만을 위해 사용하므로 로직이 없으며 getter, setter 메소드만 갖습니다. View와 Controller 사이에서 데이터를 주고 받을 때 사용합니다.

 

public class Student {

    private Integer id;
    private String name;
    
    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

}

 

 

프로시저(Procedure)

 

미리 SQL문을 선언하고 데이터베이스에 저장해서 사용하는 것으로 함수처럼 호출하여 사용할 수 있습니다.

 

프로시저를 사용하는 이유

1) 하나의 요청으로 여러 SQL문을 실행할 수 있습니다.

2) 미리 구문 분석 및 내부 중간 코드로 변환을 끝내므로 처리 시간이 단축됩니다.

3) 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지가 가능하게 됩니다.

4) Java 등의 호스트 언어와 SQL 문장이 확실하게 분리되고 웹사이트 운용 중에도 프로시저의 교체에 의한 수정이 가능하기 때문에 보수하기 편해집니다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


 

프로시저 생성 및 호출 방법

아래 코드는 MariaDB(혹은 MySQL)에서 학생 정보를 불러오는 프로시저를 생성하고 호출하는 코드입니다.

 

-- 프로시저 생성

DELIMITER $$
CREATE PROCEDURE getStudent()
BEGIN
    SELECT ID, NAME, AGE, DEPT_ID
    FROM STUDENT
    ORDER BY ID
END $$
DELIMITER;


-- 프로시저 호출

CALL getProcedure();

 

+ Recent posts