이전 상황
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 패스워드 설정
- volumes
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
'자바 > 리팩토링' 카테고리의 다른 글
[프로젝트] 주문 생성시 Location 헤더와 HTTP 상태코드 201 Created 를 반환하는 건 어떨까? (0) | 2024.02.12 |
---|---|
[이벤트 리스너] @TransactionalEventListener (0) | 2024.02.07 |
@MybatisTest 클래스 레벨의 @Sql 이 수행되지 않는 경우 (0) | 2024.02.06 |
[프로젝트] 모킹 클래스의 private 필드에 테스트 데이터 삽입 방법 - `ReflectionTestUtils` (0) | 2024.02.04 |
[프로젝트] 시큐리티 권한 체크 `@PreAuthorize 또는 @Secured` (0) | 2024.02.02 |