diff --git a/README.md b/README.md index acdcee3b7..a07f6d77b 100644 Binary files a/README.md and b/README.md differ diff --git a/build.gradle b/build.gradle index 5157e8f6c..ceba38c4b 100644 --- a/build.gradle +++ b/build.gradle @@ -53,6 +53,9 @@ dependencies {//todo: 안쓰는 의존성이나 deprecated된 의존성 제거 'jakarta.persistence:jakarta.persistence-api:3.1.0', 'jakarta.annotation:jakarta.annotation-api:2.1.1' ) + + implementation 'org.flywaydb:flyway-core' + implementation 'org.flywaydb:flyway-mysql' } tasks.named('test') { diff --git a/local_compose_down.sh b/local_compose_down.sh index e45cda18f..32792e490 100755 --- a/local_compose_down.sh +++ b/local_compose_down.sh @@ -2,11 +2,11 @@ set -e -echo "Starting all docker containers..." -docker-compose -f docker-compose.local.yml down +echo "Stopping all docker containers..." +docker compose -f docker-compose.local.yml down echo "Pruning unused Docker images..." docker image prune -f -echo "Containers are up and running." -docker-compose ps -a +echo "Containers are down and not running." +docker compose ps -a diff --git a/local_compose_up.sh b/local_compose_up.sh index 67ef9d0ba..400861e57 100755 --- a/local_compose_up.sh +++ b/local_compose_up.sh @@ -14,10 +14,10 @@ if [ ! -d "redis_data_local" ]; then fi echo "Starting all docker containers..." -docker-compose -f docker-compose.local.yml up -d +docker compose -f docker-compose.local.yml up -d echo "Pruning unused Docker images..." docker image prune -f echo "Containers are up and running." -docker-compose ps -a +docker compose ps -a diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 7faf77e6e..61dc5159e 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -52,8 +52,8 @@ public class Application { @Column(length = 50, nullable = false) private String term; - @Column(columnDefinition = "TINYINT(1) NOT NULL DEFAULT 0") - private Boolean isDelete; + @Column + private boolean isDelete = false; @ManyToOne(fetch = FetchType.LAZY) private UniversityInfoForApply firstChoiceUniversity; diff --git a/src/main/java/com/example/solidconnection/config/cors/CorsPropertiesConfig.java b/src/main/java/com/example/solidconnection/config/cors/CorsPropertiesConfig.java index 55e47bd90..68144d733 100644 --- a/src/main/java/com/example/solidconnection/config/cors/CorsPropertiesConfig.java +++ b/src/main/java/com/example/solidconnection/config/cors/CorsPropertiesConfig.java @@ -14,4 +14,4 @@ public class CorsPropertiesConfig { private List allowedOrigins; -} \ No newline at end of file +} diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index d548ff852..e518a5efb 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -85,7 +85,6 @@ public class SiteUser { @OneToMany(mappedBy = "siteUser", cascade = CascadeType.ALL, orphanRemoval = true) private List gpaScoreList = new ArrayList<>(); - public SiteUser( String email, String nickname, diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 000000000..8910ad629 --- /dev/null +++ b/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,259 @@ +CREATE TABLE IF NOT EXISTS application +( + id BIGINT AUTO_INCREMENT NOT NULL, + term VARCHAR(50) NOT NULL, + site_user_id BIGINT NULL, + nickname_for_apply VARCHAR(100) NULL, + update_count INT DEFAULT 0 NOT NULL, + verify_status VARCHAR(50) DEFAULT 'PENDING' NOT NULL, + gpa DOUBLE NOT NULL, + gpa_criteria DOUBLE NOT NULL, + language_test_type ENUM ('CEFR','DALF','DELF','DUOLINGO','IELTS','JLPT','NEW_HSK','TCF','TEF','TOEFL_IBT','TOEFL_ITP','TOEIC') NOT NULL, + language_test_score VARCHAR(255) NOT NULL, + gpa_report_url VARCHAR(500) NOT NULL, + language_test_report_url VARCHAR(500) NOT NULL, + first_choice_university_id BIGINT NULL, + second_choice_university_id BIGINT NULL, + third_choice_university_id BIGINT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS board +( + code VARCHAR(20) NOT NULL, + korean_name VARCHAR(20) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (code) +); + +CREATE TABLE IF NOT EXISTS comment +( + created_at datetime NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + parent_id BIGINT NULL, + post_id BIGINT NULL, + site_user_id BIGINT NULL, + updated_at datetime NULL, + content VARCHAR(255) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS country +( + code VARCHAR(2) NOT NULL, + region_code VARCHAR(10) NULL, + korean_name VARCHAR(100) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (code) +); + +CREATE TABLE IF NOT EXISTS interested_country +( + country_code VARCHAR(2) NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + site_user_id BIGINT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS interested_region +( + id BIGINT AUTO_INCREMENT NOT NULL, + site_user_id BIGINT NULL, + region_code VARCHAR(10) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS language_requirement +( + id BIGINT AUTO_INCREMENT NOT NULL, + university_info_for_apply_id BIGINT NULL, + language_test_type ENUM ('CEFR','DALF','DELF','DUOLINGO','IELTS','JLPT','NEW_HSK','TCF','TEF','TOEFL_IBT','TOEFL_ITP','TOEIC') NOT NULL, + min_score VARCHAR(255) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS liked_university +( + id BIGINT AUTO_INCREMENT NOT NULL, + site_user_id BIGINT NULL, + university_info_for_apply_id BIGINT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS post +( + is_question BIT(1) NULL, + created_at datetime NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + like_count BIGINT NULL, + site_user_id BIGINT NULL, + updated_at datetime NULL, + view_count BIGINT NULL, + board_code VARCHAR(20) NULL, + content VARCHAR(1000) NULL, + category ENUM ('자유','전체','질문') NULL, + title VARCHAR(255) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS post_image +( + id BIGINT AUTO_INCREMENT NOT NULL, + post_id BIGINT NULL, + url VARCHAR(500) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS post_like +( + id BIGINT AUTO_INCREMENT NOT NULL, + post_id BIGINT NULL, + site_user_id BIGINT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS region +( + code VARCHAR(10) NOT NULL, + korean_name VARCHAR(100) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (code) +); + +CREATE TABLE IF NOT EXISTS site_user +( + quited_at date NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + nickname_modified_at datetime NULL, + birth VARCHAR(20) NOT NULL, + email VARCHAR(100) NOT NULL, + nickname VARCHAR(100) NOT NULL, + profile_image_url VARCHAR(500) NULL, + gender ENUM ('FEMALE','MALE','PREFER_NOT_TO_SAY') NOT NULL, + preparation_stage ENUM ('AFTER_EXCHANGE','CONSIDERING','PREPARING_FOR_DEPARTURE','STUDYING_ABROAD') NOT NULL, + `role` ENUM ('MENTEE','MENTOR') NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS university +( + id BIGINT AUTO_INCREMENT NOT NULL, + region_code VARCHAR(10) NULL, + country_code VARCHAR(2) NULL, + format_name VARCHAR(100) NOT NULL, + english_name VARCHAR(100) NOT NULL, + korean_name VARCHAR(100) NOT NULL, + background_image_url VARCHAR(500) NOT NULL, + logo_image_url VARCHAR(500) NOT NULL, + details_for_local VARCHAR(1000) NULL, + homepage_url VARCHAR(500) NULL, + english_course_url VARCHAR(500) NULL, + accommodation_url VARCHAR(500) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS university_info_for_apply +( + id BIGINT AUTO_INCREMENT NOT NULL, + term VARCHAR(50) NOT NULL, + university_id BIGINT NULL, + korean_name VARCHAR(100) NOT NULL, + student_capacity INT NULL, + tuition_fee_type ENUM ('HOME_UNIVERSITY_PAYMENT','MIXED_PAYMENT','OVERSEAS_UNIVERSITY_PAYMENT') NULL, + semester_available_for_dispatch ENUM ('FOUR_SEMESTER','IRRELEVANT','NO_DATA','ONE_OR_TWO_SEMESTER','ONE_SEMESTER','ONE_YEAR') NULL, + details_for_language VARCHAR(1000) NULL, + gpa_requirement VARCHAR(100) NULL, + gpa_requirement_criteria VARCHAR(100) NULL, + semester_requirement VARCHAR(100) NULL, + details_for_apply VARCHAR(1000) NULL, + details_for_major VARCHAR(1000) NULL, + details_for_english_course VARCHAR(1000) NULL, + details_for_accommodation VARCHAR(1000) NULL, + details VARCHAR(500) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY (id) +); + +ALTER TABLE site_user + ADD CONSTRAINT site_user_email_unique UNIQUE (email); + +ALTER TABLE comment + ADD CONSTRAINT FK11tfff2an5hdv747cktxbdi6t FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FK11tfff2an5hdv747cktxbdi6t ON comment (site_user_id); + +ALTER TABLE interested_country + ADD CONSTRAINT FK26u5am55jefclcd7r5smk8ai7 FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FK26u5am55jefclcd7r5smk8ai7 ON interested_country (site_user_id); + +ALTER TABLE interested_region + ADD CONSTRAINT FK7h2182pqkavi9d8o2pku6gidi FOREIGN KEY (region_code) REFERENCES region (code) ON DELETE NO ACTION; + +CREATE INDEX FK7h2182pqkavi9d8o2pku6gidi ON interested_region (region_code); + +ALTER TABLE interested_country + ADD CONSTRAINT FK7x4ad24lblkq2ss0920uqfd6s FOREIGN KEY (country_code) REFERENCES country (code) ON DELETE NO ACTION; + +CREATE INDEX FK7x4ad24lblkq2ss0920uqfd6s ON interested_country (country_code); + +ALTER TABLE university_info_for_apply + ADD CONSTRAINT FKd0257hco6uy2utd1xccjh3fal FOREIGN KEY (university_id) REFERENCES university (id) ON DELETE NO ACTION; + +CREATE INDEX FKd0257hco6uy2utd1xccjh3fal ON university_info_for_apply (university_id); + +ALTER TABLE post + ADD CONSTRAINT FKfu9q9o3mlqkd58wg45ykgu8ni FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FKfu9q9o3mlqkd58wg45ykgu8ni ON post (site_user_id); + +ALTER TABLE post_like + ADD CONSTRAINT FKgx1v0whinnoqveopoh6tb4ykb FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FKgx1v0whinnoqveopoh6tb4ykb ON post_like (site_user_id); + +ALTER TABLE liked_university + ADD CONSTRAINT FKhj3gn3mqmfeiiw9jt83g7t3rk FOREIGN KEY (university_info_for_apply_id) REFERENCES university_info_for_apply (id) ON DELETE NO ACTION; + +CREATE INDEX FKhj3gn3mqmfeiiw9jt83g7t3rk_idx ON liked_university (university_info_for_apply_id); + +ALTER TABLE interested_region + ADD CONSTRAINT FKia6h0pbisqhgm3lkeya6vqo4w FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FKia6h0pbisqhgm3lkeya6vqo4w ON interested_region (site_user_id); + +ALTER TABLE country + ADD CONSTRAINT FKife035f2scmgcutdtv6bfd6g8 FOREIGN KEY (region_code) REFERENCES region (code) ON DELETE NO ACTION; + +CREATE INDEX FKife035f2scmgcutdtv6bfd6g8 ON country (region_code); + +ALTER TABLE university + ADD CONSTRAINT FKksoyt17h0te1ra588y4a3208r FOREIGN KEY (country_code) REFERENCES country (code) ON DELETE NO ACTION; + +CREATE INDEX FKksoyt17h0te1ra588y4a3208r ON university (country_code); + +ALTER TABLE university + ADD CONSTRAINT FKpwr8ocev54r8d22wdyj4a37bc FOREIGN KEY (region_code) REFERENCES region (code) ON DELETE NO ACTION; + +CREATE INDEX FKpwr8ocev54r8d22wdyj4a37bc ON university (region_code); + +ALTER TABLE language_requirement + ADD CONSTRAINT FKr75pgslwfbrvjkfau6dwtlg8l FOREIGN KEY (university_info_for_apply_id) REFERENCES university_info_for_apply (id) ON DELETE NO ACTION; + +CREATE INDEX FKr75pgslwfbrvjkfau6dwtlg8l ON language_requirement (university_info_for_apply_id); + +ALTER TABLE liked_university + ADD CONSTRAINT FKrrhud921brslcukx6fyuh0th3 FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FKrrhud921brslcukx6fyuh0th3 ON liked_university (site_user_id); + +ALTER TABLE application + ADD CONSTRAINT FKs4s3hebtn7vwd0b4xt8msxsis FOREIGN KEY (site_user_id) REFERENCES site_user (id) ON DELETE NO ACTION; + +CREATE INDEX FKs4s3hebtn7vwd0b4xt8msxsis ON application (site_user_id); + +ALTER TABLE application + ADD CONSTRAINT fk_university_info_for_apply_id_1 FOREIGN KEY (first_choice_university_id) REFERENCES university_info_for_apply (id) ON DELETE NO ACTION; + +CREATE INDEX fk_university_info_for_apply_id_1 ON application (first_choice_university_id); + +ALTER TABLE application + ADD CONSTRAINT fk_university_info_for_apply_id_2 FOREIGN KEY (second_choice_university_id) REFERENCES university_info_for_apply (id) ON DELETE NO ACTION; + +CREATE INDEX fk_university_info_for_apply_id_2 ON application (second_choice_university_id); \ No newline at end of file diff --git a/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql b/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql new file mode 100644 index 000000000..ad3ab10b0 --- /dev/null +++ b/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql @@ -0,0 +1,95 @@ +create table gpa_score ( + gpa float(53) not null, + gpa_criteria float(53) not null, + issue_date date, + created_at datetime(6), + id bigint not null auto_increment, + site_user_id bigint, + updated_at datetime(6), + gpa_report_url varchar(500) not null, + rejected_reason varchar(255), + verify_status varchar(50) not null default 'PENDING', + primary key (id) +) engine=InnoDB; + +alter table gpa_score + add constraint FK2k65qncfxvol5j4l4hb7d6iv1 + foreign key (site_user_id) + references site_user (id); + +create table language_test_score ( + issue_date date, + created_at datetime(6), + id bigint not null auto_increment, + site_user_id bigint, + updated_at datetime(6), + language_test_type enum ('CEFR', 'DALF', 'DELF', 'DUOLINGO', 'IELTS', 'JLPT', 'NEW_HSK', 'TCF', 'TEF', 'TOEFL_IBT', 'TOEFL_ITP', 'TOEIC') not null, + language_test_report_url varchar(500) not null, + language_test_score varchar(255) not null, + rejected_reason varchar(255), + verify_status varchar(50) not null default 'PENDING', + primary key (id) +) engine=InnoDB; + +alter table language_test_score + add constraint FKt2uevj2r4iuxumblj5ofbgmqn + foreign key (site_user_id) + references site_user (id); + +alter table application add column is_delete bit; + +alter table application drop foreign key fk_university_info_for_apply_id_1; +alter table application drop foreign key fk_university_info_for_apply_id_2; + +alter table application + add constraint FKi822ljuirbu9o0lnd9jt7l7qg + foreign key (first_choice_university_id) + references university_info_for_apply (id); + +alter table application + add constraint FKepp2by7frnkt1o1w3v4t4lgtu + foreign key (second_choice_university_id) + references university_info_for_apply (id); + +alter table application + add constraint FKeajojvwgn069mfxhbq5ja1sws + foreign key (third_choice_university_id) + references university_info_for_apply (id); + +alter table comment + add constraint FKde3rfu96lep00br5ov0mdieyt + foreign key (parent_id) + references comment (id); + +alter table comment + add constraint FKs1slvnkuemjsq2kj4h3vhx7i1 + foreign key (post_id) + references post (id); + +alter table liked_university drop foreign key FKhj3gn3mqmfeiiw9jt83g7t3rk; +alter table liked_university drop foreign key FKrrhud921brslcukx6fyuh0th3; + +alter table liked_university + add constraint FKkuqxb64dnfrl7har8t5ionw83 + foreign key (site_user_id) + references site_user (id); + +alter table liked_university + add constraint FKo317gq6apc3a091w32qhidtjt + foreign key (university_info_for_apply_id) + references university_info_for_apply (id); + +alter table post + add constraint FKlpnkhhbfb3gg3tfreh2a7qh8b + foreign key (board_code) + references board (code); + +-- alter table post_image +-- add constraint FKsip7qv57jw2fw50g97t16nrjr +-- foreign key (post_id) +-- references post (id); + +alter table post_like + add constraint FKj7iy0k7n3d0vkh8o7ibjna884 + foreign key (post_id) + references post (id); diff --git a/src/main/resources/secret b/src/main/resources/secret index 5c716274e..b4f88d141 160000 --- a/src/main/resources/secret +++ b/src/main/resources/secret @@ -1 +1 @@ -Subproject commit 5c716274e096bd349d71d3ced1644bfb08ad0912 +Subproject commit b4f88d14185e2009e0793dfd16d22c2c3b9257ae diff --git a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java index 62fae2731..2da99def8 100644 --- a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java +++ b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java @@ -76,7 +76,7 @@ class SignUpTest extends BaseEndToEndTest { List interestedRegionNames = List.of("유럽"); List interestedCountryNames = List.of("프랑스", "독일"); SignUpRequest signUpRequest = new SignUpRequest(generatedKakaoToken, interestedRegionNames, interestedCountryNames, - PreparationStatus.CONSIDERING, "nickname", Gender.FEMALE, "profile", "2000-01-01"); + PreparationStatus.CONSIDERING, "profile", Gender.FEMALE, "nickname", "2000-01-01"); SignUpResponse response = RestAssured.given().log().all() .contentType(ContentType.JSON) .body(signUpRequest) @@ -127,7 +127,7 @@ class SignUpTest extends BaseEndToEndTest { // request - body 생성 및 요청 SignUpRequest signUpRequest = new SignUpRequest(generatedKakaoToken, null, null, - PreparationStatus.CONSIDERING, alreadyExistNickname, Gender.FEMALE, "profile", "2000-01-01"); + PreparationStatus.CONSIDERING, "profile", Gender.FEMALE, alreadyExistNickname, "2000-01-01"); ErrorResponse errorResponse = RestAssured.given().log().all() .contentType(ContentType.JSON) .body(signUpRequest) @@ -153,7 +153,7 @@ class SignUpTest extends BaseEndToEndTest { // request - body 생성 및 요청 SignUpRequest signUpRequest = new SignUpRequest(generatedKakaoToken, null, null, - PreparationStatus.CONSIDERING, "nickname0", Gender.FEMALE, "profile", "2000-01-01"); + PreparationStatus.CONSIDERING, "profile", Gender.FEMALE, "nickname0", "2000-01-01"); ErrorResponse errorResponse = RestAssured.given().log().all() .contentType(ContentType.JSON) .body(signUpRequest) @@ -169,7 +169,7 @@ class SignUpTest extends BaseEndToEndTest { @Test void 유효하지_않은_카카오_토큰으로_회원가입을_하면_예외를_응답한다() { SignUpRequest signUpRequest = new SignUpRequest("invalid", null, null, - PreparationStatus.CONSIDERING, "nickname", Gender.FEMALE, "profile", "2000-01-01"); + PreparationStatus.CONSIDERING, "profile", Gender.FEMALE, "nickname", "2000-01-01"); ErrorResponse errorResponse = RestAssured.given().log().all() .contentType(ContentType.JSON) .body(signUpRequest) diff --git a/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java index 7029dead9..a53037346 100644 --- a/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java +++ b/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java @@ -13,7 +13,6 @@ import com.example.solidconnection.type.PostCategory; import com.example.solidconnection.type.PreparationStatus; import com.example.solidconnection.type.Role; -import jakarta.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -31,7 +30,7 @@ @SpringBootTest -@ActiveProfiles("local") +@ActiveProfiles("dev") @DisplayName("댓글 레포지토리 테스트") class CommentRepositoryTest { @Autowired @@ -41,8 +40,6 @@ class CommentRepositoryTest { @Autowired private SiteUserRepository siteUserRepository; @Autowired - private EntityManager entityManager; - @Autowired private CommentRepository commentRepository; private Board board; @@ -66,9 +63,6 @@ public void setUp() { childComment = createChildComment(); commentRepository.save(parentComment); commentRepository.save(childComment); - - entityManager.flush(); - entityManager.clear(); } private Board createBoard() {