본문 바로가기
관리자

Programming-[Backend]/Database

JPA, ddl-auto, MYSQL, index 등 테이블 생성 기초 정리

728x90
반응형

 

 

Spring Boot + JPA + Hibernate + MYSQL 조합으로 DB를 구축할 때 주의해야할 점들에 대해 기록해둔다.

 

1. ddl-auto로 만들어진 순서 그대로 DB 컬럼의 순서들을 그대로 두지 말 것 

 

hibernate.ddl-auto = create로 처리하면 아무런 세팅이 되지 않은 DB에서 Entity들을 이용해 빠르게 Table 들을 만들어낼 수 있다. 하지만 여기서 컬럼들의 순서들을 변경하지 않으면 안된다.

 

왜냐하면 DB 컬럼의 순서대로 차례대로 데이터를 읽어나가기 때문이다.

 

DB는 블록 단위로 데이터를 저장하고, 조회 시에 레코드의 앞에서부터 읽어들이기 시작한다. 따라서 DB 컬럼의 순서는 PK, FK, 카디널리티가 높은 순서대로 배치하고 날짜 등 Range로 조회될 가능성이 있는 컬럼들은 뒤쪽에 배치해야한다.

 

intellij에서는 테이블에 오른쪽 마우스를 누른 뒤 Modify table -> 컬럼 클릭 후 위/아래 화살표를 누르면 컬럼의 순서를 바꿀 수 있는 SQL문이 표시되고 적용이 가능하다.

 

 

2. Index는 카디널리티가 높은 순대로, 컴포지트 형태로 짤 것

여러 컬럼들에 대해 각각의 index를 잡으면 비효율적이다. 각 인덱스를 DB에서 독립적으로 관리해야할 뿐만 아니라 쿼리 실행 시마다 각각의 인덱스를 조합해야하기 때문이다. DB 옵티마이저가 비효율적으로 작성된 인덱스를 조합하지 않고 무시하는 경우도 많다.

 

인덱스를 작성할 때, 카디널리티가 높은 순서대로 작성한다. 그리고 보통 많이 사용하는 type등 종류가 몇 개 안되는, 즉 카디널리티가 낮은 컬럼이 있는 경우 옵티마이저에 의해 무시될 수도 있다.

 

 

3. Varchar(255) 이상은 text로 작성 가능

varchar(255)가 넘어가면 mysql의 경우 참조하는 키를 본래 테이블에 두고, 실제 내용은 외부에 작성한다. 이는 Text 타입으로 컬럼을 작성한 경우와 같다. 따라서 그냥 Text로 작성해줘도 무방하다.

 

 

4. comment

각 컬럼을 설명하는 comment는 컬럼의 목적이 이름만으로 완벽하지 않은 경우에는 써주는 것이 좋다.

 

 

5. id 값은 unsigned 붙이기

예를 들어 int로 작성하는 경우, 약 -21억 ~ 21억의 범위를 갖는다. 그런데 unsigned를 붙여서 양수만 사용할 것이라고 선언하면 약 42억까지도 사용이 가능하다.

 

 

6. enum 사용하지 않기 (MYSQL)

ddl-auto로 create하는 경우 @Enumerated 어노테이션이 붙은 컬럼은 MYSQL의 enum 타입으로 생성된다. 이를 직접 변경하는 것이 좋다. enum의 종류가 코드에서 늘어나면 DB에서도 업데이트가 필요하고, 이는 관리의 요소일 뿐만 아니라 데이터가 많아지면 변경이 어려워지는 상황이 올 수도 있기 때문이다.

 

 

728x90
반응형