diff --git a/backend/build.gradle b/backend/build.gradle index fa6f8e0e..377d7611 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -53,13 +53,16 @@ dependencies { // cache implementation 'org.springframework.boot:spring-boot-starter-cache' - implementation("com.github.ben-manes.caffeine:caffeine:3.1.8") + implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' // QueryDSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' - annotationProcessor "jakarta.annotation:jakarta.annotation-api" - annotationProcessor "jakarta.persistence:jakarta.persistence-api" + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + + // flyway 추가 + implementation 'org.flywaydb:flyway-mysql' } tasks.named('test') { diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 7c2eb0c6..3b4392a0 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -36,6 +36,8 @@ management: --- # local profile spring: + flyway: + enabled: false config: activate: on-profile: local @@ -53,7 +55,6 @@ spring: dialect: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: create-drop - defer-datasource-initialization: true security: jwt: @@ -74,6 +75,10 @@ cloud: --- # dev profile spring: + flyway: + enabled: true + baseline-version: 1 + baseline-on-migrate: true config: activate: on-profile: dev @@ -95,7 +100,7 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQLDialect hibernate: - ddl-auto: none + ddl-auto: validate server: ssl: @@ -122,6 +127,10 @@ cloud: --- # prod profile spring: + flyway: + enabled: true + baseline-version: 1 + baseline-on-migrate: true config: activate: on-profile: prod @@ -149,7 +158,7 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQLDialect hibernate: - ddl-auto: none + ddl-auto: validate server: ssl: diff --git a/backend/src/main/resources/db/migration/mysql/V1__init.sql b/backend/src/main/resources/db/migration/mysql/V1__init.sql new file mode 100644 index 00000000..2a743786 --- /dev/null +++ b/backend/src/main/resources/db/migration/mysql/V1__init.sql @@ -0,0 +1,169 @@ +-- 테이블 생성 +CREATE TABLE member +( + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + kakao_id BIGINT, + modified_at TIMESTAMP(6), + email VARCHAR(255), + nickname VARCHAR(255) NOT NULL, + password VARCHAR(255), + profile_image_url VARCHAR(255) NOT NULL, + login_type ENUM('DEFAULT','KAKAO') NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE place +( + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + google_place_id VARCHAR(255), + latitude VARCHAR(255) NOT NULL, + longitude VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE tag +( + id BIGINT AUTO_INCREMENT, + tag VARCHAR(255) NOT NULL UNIQUE, + PRIMARY KEY (id) +); + +CREATE TABLE travel_plan +( + start_date DATE NOT NULL, + author_id BIGINT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + share_key BINARY(16) NOT NULL, + title VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (author_id) REFERENCES member (id) +); + +CREATE TABLE travelogue +( + author_id BIGINT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + title VARCHAR(20) NOT NULL, + thumbnail VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (author_id) REFERENCES member (id) +); + +CREATE TABLE travel_plan_day +( + plan_day_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + plan_id BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (plan_id) REFERENCES travel_plan (id) +); + +CREATE TABLE travel_plan_place +( + plan_place_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + place_id BIGINT NOT NULL, + plan_day_id BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (place_id) REFERENCES place (id), + FOREIGN KEY (plan_day_id) REFERENCES travel_plan_day (id) +); + +CREATE TABLE travel_place_todo +( + is_checked BOOLEAN NOT NULL, + todo_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + travel_plan_place_id BIGINT NOT NULL, + content VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (travel_plan_place_id) REFERENCES travel_plan_place (id) +); + +CREATE TABLE travelogue_day +( + day_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + travelogue_id BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (travelogue_id) REFERENCES travelogue (id) +); + +CREATE TABLE travelogue_place +( + place_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + place_id BIGINT NOT NULL, + travelogue_day_id BIGINT NOT NULL, + descriptiON VARCHAR(300), + PRIMARY KEY (id), + FOREIGN KEY (place_id) REFERENCES place (id), + FOREIGN KEY (travelogue_day_id) REFERENCES travelogue_day (id) +); + +CREATE TABLE travelogue_photo +( + photo_order INT NOT NULL, + created_at TIMESTAMP(6) NOT NULL, + deleted_at TIMESTAMP(6), + id BIGINT AUTO_INCREMENT, + modified_at TIMESTAMP(6), + travelogue_place_id BIGINT NOT NULL, + photo_key VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (travelogue_place_id) REFERENCES travelogue_place (id) +); + +CREATE TABLE travelogue_tag +( + id BIGINT AUTO_INCREMENT, + tag_id BIGINT NOT NULL, + travelogue_id BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (tag_id) REFERENCES tag (id), + FOREIGN KEY (travelogue_id) REFERENCES travelogue (id) +); + +CREATE TABLE travelogue_like +( + id BIGINT AUTO_INCREMENT, + liker_id BIGINT NOT NULL, + travelogue_id BIGINT NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY (travelogue_id, liker_id), + FOREIGN KEY (liker_id) REFERENCES member (id), + FOREIGN KEY (travelogue_id) REFERENCES travelogue (id) +); + +CREATE INDEX member_kakao_id_idx ON member (kakao_id); + +CREATE INDEX place_name_latitude_longitude_idx ON place (name, latitude, longitude); + +CREATE INDEX travel_plan_share_key_idx ON travel_plan (share_key); diff --git a/backend/src/test/resources/application-test.yml b/backend/src/test/resources/application-test.yml index 50d00759..7c1e68f0 100644 --- a/backend/src/test/resources/application-test.yml +++ b/backend/src/test/resources/application-test.yml @@ -23,6 +23,8 @@ cloud: server: port: 8081 spring: + flyway: + enabled: false datasource: url: jdbc:h2:mem:test h2: