Hibernate 를 이용한 토이프로젝트를 수행하면서... 큰 삽질을 해서 정리해보는 포스팅 ㅜㅜ


hbm2ddl.auto 설정은 hibernate 포함된 매핑 설정으로 Database 스키마 생성 스크립트를 만드는데 사용된다


시작시마다 Mapping 설정대로 Schema 세팅할 있는데 설정 값에 따라 다음과 같이 동작한다.


-      Create : Session Factory 실행될 스키마를 지우고 다시 생성. 생성 후에는 classpath import.sql 파일이 있는지 찾아 등록된 쿼리문을 실행한다.


-      Create-drop : 기본적으로 create 동일하지만 session 팩토리가 내려갈 db 스키마를 삭제한다. (이걸로 설정했다가 디비 날려먹었었다.)


-      Update ; 도메인 객체구성과 스키마를 비교해서 도메인 객체에 맞춰서 db 스키마를 변경한다. 데이터나 스키마를 지우지 않는다.


-      Validate : 도메인 객체구성과 db스키마가 같은지만 확인할 변경하지 않는다. 다를 session Factory 시작시 확인하고 예외를 발생시킨다.


다음은 Hibernate 사용시 알아두어야 하는 JPA 프로퍼티들이다.






DB가 복잡해지다보면, 모든 스키마를 외우고 있을 수는 없다. 

그래서 테이블들의 스키마를 조회하게되는 경우가 많아지는데, 그 중에서도 실무에서 자주 사용하는 테이블에 적용되어있는 Key 특성을 조회하는 쿼리들을 정리해보았다.


(1) SHOW INDEXES IN "table이름"

 : 해당 DB 내에서 사용해야하며, 테이블에 정의되어있는 Key 가 걸려있는 Column과, Cardinality 등까지 자세한 정보를 제공해준다.



(2) SELECT * FROM Information_schema.table_constraints

 : DB를 관리할 수 있다면 Information Schema 를 조회하는 방법은 알아두는게 좋다. 굳이 포스팅에서 다루는 Key 조회 이외에도 Information Schema 는 많은 정보를 담고 있다.

다음과 같이 테이블에 대한 정보를 얻어낼 수 있다.


SELECT * FROM Information_schema.table_constraints WHERE table_schema="db이름”;


SELECT * FROM Information_schema.table_constraints WHERE table_schema="db이름” AND table_name="table이름";



(3) SHOW CREATE TABLE "table이름";

 : 이 쿼리가 사실 만능이라고 여겨진다. (강조) 세부적인 정보를 도출하기는 힘들지만, 가장 쉽게 자주 필요한 정보들을 조회할 수 있다.

이 쿼리는 테이블 생성 쿼리를 그대로 보여준다.



개인적으로 가장 많이 사용하는 쿼리는 3번의 SHOW CREATE TABLE 구문이지만, 가장 강력한 건 Information_schema 정보를 다룰줄 아는것이다.

다양한 MySQL 의 시스템 테이블들과의 JOIN 연산을 통해 스키마 정보를 디테일하게 추출해낼 수 있으며, 이는 좀 더 자세하게 다룰 예정이다.





 MyBatis 를 접하고 업무를 할 때 대부분의 일은 Sql Mapper 를 만들고, SELECT, INSERT, UPDATE, DELETE 와 같은 CRUD 작업을 위한 DML(Data Manipulation Language) 를 작성하는 업무이지만, 간혹 Create Table, Drop Table 과 같은 DDL(Data Definition Language) 을 작성해야할 경우가 있다.


 Mybatis를 이용해서 DDL 쿼리도 적용이 가능하다. 

예를들어 CreateTable / DropTable / ShowCreateTable / DescTable 등인데 이 내용이 Mybatis 백서에도 제대로 안나와있다.

결론적으로 말하면 그냥 사용하면 되는데, 사용방법은 다음과 같다.



<select id="existTable" resultType="Integer">
SELECT count(TABLE_NAME)
FROM
INFORMATION_SCHEMA.TABLES
where
TABLE_SCHEMA = #{databaseName, jdbcType=VARCHAR}
AND
TABLE_NAME=#{tableName, jdbcType=VARCHAR}
</select>

<select id="showCreateTable" resultType="java.util.Map" parameterType="java.lang.String">
show create table ${value}
</select>

<update id="dropTable" parameterType="java.lang.String">
drop table IF EXISTS ${value}
</update>

<update id="createNewTable" parameterType="java.lang.String">
${value}
</update>


 (참고로 위의 예제에 ${value} 부분은 MyBatis 의 동적쿼리문을 사용한 부분으로 Parameter Type 을 String 으로 한다면 value 라는 명칭을 사용해야 한다. 내부적으로 String.value 를 이용하기 때문이다. 또한 위의 예시에서 createNewTable 로 매핑된 부분의 ${value} 에는 Create Table 쿼리가 포함되면 된다.)


 다만 한가지 주의할 점은, DML(Data Manipulation Language)가 아닌 위와 같은 DDL(Data Definition Language) 들은 대부분 트랜잭션을 사용하더라도 롤백이 되지 않는다.


몇가지 SQL 구문들은 MySQL 이 암묵적으로 커밋을 하기 때문에 트랜잭션을 감싸더라도 실행하면 롤백이 불가능하다. 트랜잭션이 불가능한 대표적 구문들은 다음과 같다.


CREATE / ALTER / DROP DATABASE

CREATE /ALTER / DROP / RENAME / TRUNCATE TABLE

CREATE / DROP INDEX

CREATE / DROP EVENT

CREATE / DROP FUNCTION

CREATE / DROP PROCEDURE



+ Recent posts