__mysql 5.7 에서 H2 1.4.200 호환을 위한 SCHEMA 수정__

이전 상황

version: '3.8'

services:
  mysql:
    image: "mysql:5.7.16"
    container_name: item-browser-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ?
      MYSQL_DATABASE: item-browser
      MYSQL_USER: item-admin
      MYSQL_PASSWORD: ?
      # 문자 인코딩 설정
      MYSQL_CHARSET: 'utf8mb4'
      MYSQL_COLLATION: 'utf8mb4_unicode_ci'
    command: --lower_case_table_names=1  --character-set-server=utf8mb4
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3307:3306"

volumes:
  mysql-data:

이후 상황

version: '3.8'

services:
  h2:
    image: oscarfonts/h2
    ports:
      - "9092:9092"
    volumes:
      - h2-data:/opt/h2-data
    environment:
      - H2_OPTIONS=-ifNotExists -web -webAllowOthers -webPort 8082 -tcp -tcpAllowOthers -tcpPort 9092
      - H2_PASSWORD=2H#@(#Jksj@kkwje

volumes:
  h2-data:
  • 옵션 설명
    • volumes
      • h2 파일을 저장할 볼륨을 정의한다.
    • \-ifNotExists
      • 해당 옵션은 시작시 새 데이터베이스를 자동으로 생성하지 않도록 하는 방법이다.
    • \-web, -webAllowOthers, -webPort
      • 웹 콘솔을 활성화
      • 다른 컴퓨터에서도 접근이 가능하도록 설정하는 옵션이다. ( webAllowOthers )
    • \-tcp, -tcpAllowOthers, -tcpPort
      • TCP 서버 활성화
      • 다른 컴퓨터에서도 접근이 가능하도록 설정 ( tcpAllowOthers )
    • H2\_PASSWORD
      • H2 패스워드 설정

APPLICATION-LOCAL.YAML 변경

  datasource:
    password: ㅇㅅㅇ
    driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    username: item-admin
    url: jdbc:log4jdbc:mysql://localhost:3307/item-browser?serverTimezone=Asia/Seoul&useUnicode=true&characterEncoding=UTF-8
  • 에서 변경하려면 찰나..
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "ALTER TABLE ORDsRS_PRODUCT_RELATION ADD CONSTRAINT FOREIGN[*] KEY (PRODUCT_ID) REFERENCES PRODUCT (ID) ON DELETE RESTRICT ON UPDATE RESTRICT  "; expected "identifier"; SQL statement:
ALTER TABLE orders_product_relation ADD CONSTRAINT FOREIGN KEY (PRODUCT_ID) REFERENCES product (ID) ON DELETE RESTRICT ON UPDATE RESTRICT  [42001-199]
  • 가 발생했다..

해결한 방법.

일단 h2 DB 에서는 CONSTRAINT ⁠의 경우 별도 fk 키값을 명명해줘야하는 것 같다.

그냥 DB 돌릴떈 문제없었는데..

ALTER TABLE orders_product_relation
    ADD CONSTRAINT fk_orders_product_relation_product_id FOREIGN KEY (PRODUCT_ID)
        REFERENCES product (ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

- 으로 변경하였다.


문제 상황2

-- cart Table Create SQL
-- 테이블 생성 SQL - cart
CREATE TABLE cart
(
    `ID`           BIGINT       NOT NULL AUTO_INCREMENT COMMENT 'pk값',
    `USER_ID`      varchar(255) NOT NULL COMMENT '사용자 이메일 ID',
    `CREATED_DATE` timestamp    NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATED_DATE` timestamp    NULL DEFAULT CURRENT_TIMESTAMP,
    `DELETED_DATE` timestamp    NULL,
    PRIMARY KEY (ID)
);

-- 테이블 Comment 설정 SQL - cart
ALTER TABLE cart
    COMMENT '장바구니';
  • 에서
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "ALTER TABLE CART COMMENT[*] '장바구니' "; expected "., ADD, SET, RENAME, DROP, CHANGE, MODIFY, ALTER"; SQL statement:
ALTER TABLE cart COMMENT '장바구니' [42001-199]
  • 이 발생했다.

해결 및 원인

  • 원인
    • H2 데이터베이스는 ALTER TABLE 구문 뒤에 COMMENT 키워드를 예상하지 않기 떄문이라고 한다.
    • 뭐 H2 의 한계라면 한계일듯?..
  • 해결(?)
-- cart Table Create SQL
-- 테이블 생성 SQL - cart
CREATE TABLE cart
(
    `ID`           BIGINT       NOT NULL AUTO_INCREMENT COMMENT 'pk값',
    `USER_ID`      varchar(255) NOT NULL COMMENT '사용자 이메일 ID',
    `CREATED_DATE` timestamp    NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATED_DATE` timestamp    NULL DEFAULT CURRENT_TIMESTAMP,
    `DELETED_DATE` timestamp    NULL,
    PRIMARY KEY (ID)
)
  • 그냥 삭제해야하는 것 같다.. 테이블로 코멘트를 밀어넣어도 안된다 ㅠㅠ..

또 다른 문제.. Mysql 에서의 DATE\_ADD 함수 사용 불가능

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "DATE_ADD" not found; SQL statement:
INSERT INTO PRODUCT ( ID , NAME , CATEGORY , DETAIL , STATUS , QUANTITY , SELLER_ID , SELL_START_DATETIME , SELL_END_DATETIME , DISPLAY_NAME , UNIT_PRICE , BRAND , DELIVERY_FEE_TYPE , DELIVERY_METHOD , DELIVERY_DEFAULT_FEE , CREATED_DATE , UPDATED_DATE) VALUES ( 1 , 'Product A' , 1 , 'This is product A' , 'APPROVED' , 100 , 'seller1' , NOW() , DATE_ADD(NOW(), INTERVAL 30 DAY) , 'Product A' , 10000 , 'BrandA' , 'FREE' , 'SEQUENCIAL' , 0 , NOW() , NOW()), ( 2 , 'Product B' , 2 , 'This is product B' , 'APPROVED' , 50 , 'seller2' , NOW() , DATE_ADD(NOW(), INTERVAL 30 DAY) , 'Product B' , 15000 , 'BrandB' , 'CHARGE_RECEIVED' , 'COLD_FRESH' , 3000 , NOW() , NOW()) [90022-200]
  • 가 발생했다.

원인

  • 일단 H2 에서는 별도의 문법을 가지고 있다.
    • DATE\_ADD 는 MYSQL 에서만 사용하는 문법으로..
    • H2 에서는
      • TIMESTAMPADD 를 사용해야하였다.

문제 상황 다른 내용 ㅠㅠ

  • 일단 Mybatis 의 경우 매퍼에..@Sql 로 주입해주는 방식 때문에..
  • h2 용
  • mysql 용
    • sql 을 두번 정의해줘야했다..
  • 진짜 JPA 가 보고싶어 미치겠다.
  • 왜 Mybatis 를 사용하지 않는지 알거같다.

Uploaded by N2T