From 498b0d34d58750581cd79bf5377fac9ad33ce4c5 Mon Sep 17 00:00:00 2001 From: seonghyeok cho <65901319+whqtker@users.noreply.github.com> Date: Sat, 14 Feb 2026 19:34:41 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20testcontainer=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=20=EC=97=85=20(#659)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +++--- .../solidconnection/database/FlywayMigrationTest.java | 4 ++-- .../example/solidconnection/support/MySQLTestContainer.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index deefc611b..72f4eccba 100644 --- a/build.gradle +++ b/build.gradle @@ -57,9 +57,9 @@ dependencies { // Test testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.testcontainers:mysql' + testImplementation 'org.testcontainers:testcontainers:2.0.2' + testImplementation 'org.testcontainers:testcontainers-junit-jupiter:2.0.2' + testImplementation 'org.testcontainers:testcontainers-mysql:2.0.2' testImplementation 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testImplementation 'org.awaitility:awaitility:4.2.0' diff --git a/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java b/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java index 2649716f1..65f74f15d 100644 --- a/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java +++ b/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java @@ -8,7 +8,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; @SpringBootTest @ContextConfiguration(initializers = {RedisTestContainer.class, FlywayMigrationTest.FlywayMySQLInitializer.class}) @@ -19,7 +19,7 @@ }) class FlywayMigrationTest { - private static final MySQLContainer CONTAINER = new MySQLContainer<>("mysql:8.0") + private static final MySQLContainer CONTAINER = new MySQLContainer("mysql:8.0") .withDatabaseName("flyway_test") .withUsername("flyway_user") .withPassword("flyway_password"); diff --git a/src/test/java/com/example/solidconnection/support/MySQLTestContainer.java b/src/test/java/com/example/solidconnection/support/MySQLTestContainer.java index d4e25ccde..0c59077c0 100644 --- a/src/test/java/com/example/solidconnection/support/MySQLTestContainer.java +++ b/src/test/java/com/example/solidconnection/support/MySQLTestContainer.java @@ -3,11 +3,11 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; public class MySQLTestContainer implements ApplicationContextInitializer { - private static final MySQLContainer CONTAINER = new MySQLContainer<>("mysql:8.0"); + private static final MySQLContainer CONTAINER = new MySQLContainer("mysql:8.0"); static { CONTAINER.start(); From c54b29f63b180c2fa4b9d73d7023857ca9446cbb Mon Sep 17 00:00:00 2001 From: seonghyeok cho <65901319+whqtker@users.noreply.github.com> Date: Sat, 14 Feb 2026 21:28:35 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EC=98=A4=EB=9E=98=EB=90=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=82=AD=EC=A0=9C=20=ED=9B=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20pull=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20(#653)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653) - 추가로 이미지는 5개 -> 2개 보관하도록 변경 --- .github/workflows/dev-cd.yml | 36 +++++++++++++++++------------------ .github/workflows/prod-cd.yml | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/dev-cd.yml b/.github/workflows/dev-cd.yml index 9f5f33358..92ffe2ad9 100644 --- a/.github/workflows/dev-cd.yml +++ b/.github/workflows/dev-cd.yml @@ -76,7 +76,7 @@ jobs: token: ${{ secrets.PACKAGE_DELETE_TOKEN }} image-names: solid-connection-dev delete-untagged: true - keep-n-tags: 5 + keep-n-tags: 2 account-type: org org-name: ${{ github.repository_owner }} cut-off: '7 days ago UTC' @@ -123,28 +123,28 @@ jobs: export OWNER_LOWERCASE=$(echo "${{ github.repository_owner }}" | tr "[:upper:]" "[:lower:]") export IMAGE_TAG_ONLY="${{ needs.build-and-push.outputs.image_tag }}" export FULL_IMAGE_NAME="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev:${IMAGE_TAG_ONLY}" - - # 2. GHCR 로그인 & Pull + export IMAGE_NAME_BASE="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev" + + # 2. Pull 전 정리 (디스크 공간 확보) + echo "Cleaning up old tagged images (keeping last 2)..." + docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \ + sort -r | \ + tail -n +3 | \ + xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true + + echo "Pruning dangling images..." + docker image prune -f + + # 3. GHCR 로그인 & Pull echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin echo "Pulling new image: $FULL_IMAGE_NAME" docker pull $FULL_IMAGE_NAME - - # 3. Spring Boot 앱 재시작 + + # 4. Spring Boot 앱 재시작 echo "Restarting Docker Compose with tag: $IMAGE_TAG_ONLY" cd /home/${{ secrets.DEV_USERNAME }}/solid-connection-dev docker compose -f docker-compose.dev.yml down || true OWNER_LOWERCASE=$OWNER_LOWERCASE IMAGE_TAG=$IMAGE_TAG_ONLY docker compose -f docker-compose.dev.yml up -d - - # 4. 정리 작업 - echo "Pruning dangling images..." - docker image prune -f - - echo "Cleaning up old tagged images (keeping last 5)..." - IMAGE_NAME_BASE="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev" - docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \ - sort -r | \ - tail -n +6 | \ - xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true - + echo "Deployment finished successfully." - ' \ No newline at end of file + ' diff --git a/.github/workflows/prod-cd.yml b/.github/workflows/prod-cd.yml index 47c4d2ea3..c63019b55 100644 --- a/.github/workflows/prod-cd.yml +++ b/.github/workflows/prod-cd.yml @@ -155,4 +155,4 @@ jobs: # 6. 정리 docker image prune -f echo "Deployment finished successfully." - ' \ No newline at end of file + ' From 970fa6e640d369596db617bee4db67b5cded090d Mon Sep 17 00:00:00 2001 From: seonghyeok cho <65901319+whqtker@users.noreply.github.com> Date: Wed, 18 Feb 2026 13:37:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EB=89=B4?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#674)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 전체 news 조회 API 구현 - 기존 API에 author-id를 선택적으로 받도록 * test: 전체 news 조회 관련 테스트 코드 작성 * refactor: 날짜 오름차순으로 news 조회하는 JPA 메서드 추가 * refactor: 뉴스 조회 API를 하나로 통합 - 서비스 계층에서 siteUserId == null을 기준으로 분기하도록 * refactor: 컨트롤러 계층에서 분기문 제거 - 분기를 서비스 계층에게 위임했음 * test: 뉴스 조회 관련 테스트 코드 수정 --- .../news/controller/NewsController.java | 6 +- .../news/repository/NewsRepository.java | 2 + .../custom/NewsCustomRepository.java | 2 + .../custom/NewsCustomRepositoryImpl.java | 22 ++ .../news/service/NewsQueryService.java | 20 +- .../news/service/NewsQueryServiceTest.java | 200 ++++++++++++------ 6 files changed, 181 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/example/solidconnection/news/controller/NewsController.java b/src/main/java/com/example/solidconnection/news/controller/NewsController.java index 263124a18..97100e3ea 100644 --- a/src/main/java/com/example/solidconnection/news/controller/NewsController.java +++ b/src/main/java/com/example/solidconnection/news/controller/NewsController.java @@ -35,11 +35,11 @@ public class NewsController { // todo: 추후 Slice 적용 @GetMapping - public ResponseEntity findNewsBySiteUserId( + public ResponseEntity findNews( @AuthorizedUser(required = false) Long siteUserId, - @RequestParam(value = "author-id") Long authorId + @RequestParam(value = "author-id", required = false) Long authorId ) { - NewsListResponse newsListResponse = newsQueryService.findNewsByAuthorId(siteUserId, authorId); + NewsListResponse newsListResponse = newsQueryService.findNews(siteUserId, authorId); return ResponseEntity.ok(newsListResponse); } diff --git a/src/main/java/com/example/solidconnection/news/repository/NewsRepository.java b/src/main/java/com/example/solidconnection/news/repository/NewsRepository.java index 566d8feae..feb276f36 100644 --- a/src/main/java/com/example/solidconnection/news/repository/NewsRepository.java +++ b/src/main/java/com/example/solidconnection/news/repository/NewsRepository.java @@ -7,6 +7,8 @@ public interface NewsRepository extends JpaRepository, NewsCustomRepository { + List findAllByOrderByUpdatedAtDesc(); + List findAllBySiteUserIdOrderByUpdatedAtDesc(long siteUserId); void deleteAllBySiteUserId(long siteUserId); diff --git a/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepository.java b/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepository.java index ebba659e0..d3fce6d7c 100644 --- a/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepository.java +++ b/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepository.java @@ -6,4 +6,6 @@ public interface NewsCustomRepository { List findNewsByAuthorIdWithLikeStatus(long authorId, Long siteUserId); + + List findAllNewsWithLikeStatus(Long siteUserId); } diff --git a/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepositoryImpl.java b/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepositoryImpl.java index 949d188bc..caf9b2827 100644 --- a/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/news/repository/custom/NewsCustomRepositoryImpl.java @@ -12,6 +12,28 @@ public class NewsCustomRepositoryImpl implements NewsCustomRepository { private final EntityManager entityManager; + @Override + public List findAllNewsWithLikeStatus(Long siteUserId) { + String jpql = """ + SELECT new com.example.solidconnection.news.dto.NewsResponse( + n.id, + n.title, + n.description, + n.thumbnailUrl, + n.url, + CASE WHEN ln.id IS NOT NULL THEN true ELSE false END, + n.updatedAt + ) + FROM News n + LEFT JOIN LikedNews ln ON n.id = ln.newsId AND ln.siteUserId = :siteUserId + ORDER BY n.updatedAt DESC + """; + + return entityManager.createQuery(jpql, NewsResponse.class) + .setParameter("siteUserId", siteUserId) + .getResultList(); + } + @Override public List findNewsByAuthorIdWithLikeStatus(long authorId, Long siteUserId) { String jpql = """ diff --git a/src/main/java/com/example/solidconnection/news/service/NewsQueryService.java b/src/main/java/com/example/solidconnection/news/service/NewsQueryService.java index e0050643b..20fe532be 100644 --- a/src/main/java/com/example/solidconnection/news/service/NewsQueryService.java +++ b/src/main/java/com/example/solidconnection/news/service/NewsQueryService.java @@ -1,5 +1,6 @@ package com.example.solidconnection.news.service; +import com.example.solidconnection.news.domain.News; import com.example.solidconnection.news.dto.NewsListResponse; import com.example.solidconnection.news.dto.NewsResponse; import com.example.solidconnection.news.repository.NewsRepository; @@ -15,19 +16,24 @@ public class NewsQueryService { private final NewsRepository newsRepository; @Transactional(readOnly = true) - public NewsListResponse findNewsByAuthorId(Long siteUserId, long authorId) { - // 로그인하지 않은 경우 + public NewsListResponse findNews(Long siteUserId, Long authorId) { if (siteUserId == null) { - List newsResponseList = newsRepository.findAllBySiteUserIdOrderByUpdatedAtDesc(authorId) - .stream() + List newsResponseList = findNewsEntities(authorId).stream() .map(news -> NewsResponse.of(news, null)) .toList(); return NewsListResponse.from(newsResponseList); } - // 로그인한 경우 - List newsResponseList = newsRepository.findNewsByAuthorIdWithLikeStatus(authorId, siteUserId); - + List newsResponseList = (authorId == null) + ? newsRepository.findAllNewsWithLikeStatus(siteUserId) + : newsRepository.findNewsByAuthorIdWithLikeStatus(authorId, siteUserId); return NewsListResponse.from(newsResponseList); } + + private List findNewsEntities(Long authorId) { + if (authorId == null) { + return newsRepository.findAllByOrderByUpdatedAtDesc(); + } + return newsRepository.findAllBySiteUserIdOrderByUpdatedAtDesc(authorId); + } } diff --git a/src/test/java/com/example/solidconnection/news/service/NewsQueryServiceTest.java b/src/test/java/com/example/solidconnection/news/service/NewsQueryServiceTest.java index 6c69db0cf..7183abbf5 100644 --- a/src/test/java/com/example/solidconnection/news/service/NewsQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/news/service/NewsQueryServiceTest.java @@ -12,10 +12,10 @@ import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; import java.util.Comparator; -import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -35,67 +35,145 @@ class NewsQueryServiceTest { @Autowired private LikedNewsFixture likedNewsFixture; - @Test - void 로그인하지_않은_사용자가_특정_사용자의_소식지_목록을_성공적으로_조회한다() { - // given - SiteUser author = siteUserFixture.멘토(1, "author"); - SiteUser otherUser = siteUserFixture.멘토(2, "other"); - - News news1 = newsFixture.소식지(author.getId()); - News news2 = newsFixture.소식지(author.getId()); - newsFixture.소식지(otherUser.getId()); - List newsList = List.of(news1, news2); - - // when - NewsListResponse response = newsQueryService.findNewsByAuthorId(null, author.getId()); - - // then - assertAll( - () -> assertThat(response.newsResponseList()) - .extracting(NewsResponse::id) - .containsExactlyInAnyOrder(news1.getId(), news2.getId()), - () -> assertThat(response.newsResponseList()) - .extracting(NewsResponse::updatedAt) - .isSortedAccordingTo(Comparator.reverseOrder()), - () -> assertThat(response.newsResponseList()) - .extracting(NewsResponse::isLiked) - .containsOnly((Boolean) null) - ); + @Nested + @DisplayName("전체 소식지 조회") + class 전체_소식지를_조회한다 { + + @Test + void 로그인하지_않은_사용자가_전체_소식지를_성공적으로_조회한다() { + // given + SiteUser author1 = siteUserFixture.멘토(1, "author1"); + SiteUser author2 = siteUserFixture.멘토(2, "author2"); + + News news1 = newsFixture.소식지(author1.getId()); + News news2 = newsFixture.소식지(author1.getId()); + News news3 = newsFixture.소식지(author2.getId()); + + // when + NewsListResponse response = newsQueryService.findNews(null, null); + + // then + assertAll( + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::id) + .containsExactlyInAnyOrder(news1.getId(), news2.getId(), news3.getId()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::updatedAt) + .isSortedAccordingTo(Comparator.reverseOrder()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::isLiked) + .containsOnly((Boolean) null) + ); + } + + @Test + void 로그인한_사용자가_전체_소식지를_좋아요_상태와_함께_조회한다() { + // given + SiteUser author1 = siteUserFixture.멘토(1, "author1"); + SiteUser author2 = siteUserFixture.멘토(2, "author2"); + SiteUser loginUser = siteUserFixture.사용자(3, "loginUser"); + + News news1 = newsFixture.소식지(author1.getId()); + News news2 = newsFixture.소식지(author1.getId()); + News news3 = newsFixture.소식지(author2.getId()); + + likedNewsFixture.소식지_좋아요(news1.getId(), loginUser.getId()); + likedNewsFixture.소식지_좋아요(news3.getId(), loginUser.getId()); + + // when + NewsListResponse response = newsQueryService.findNews(loginUser.getId(), null); + + // then + assertAll( + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::id) + .containsExactlyInAnyOrder(news1.getId(), news2.getId(), news3.getId()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::updatedAt) + .isSortedAccordingTo(Comparator.reverseOrder()), + () -> { + Map likeStatusMap = response.newsResponseList().stream() + .collect(Collectors.toMap(NewsResponse::id, NewsResponse::isLiked)); + assertThat(likeStatusMap.get(news1.getId())).isTrue(); + assertThat(likeStatusMap.get(news2.getId())).isFalse(); + assertThat(likeStatusMap.get(news3.getId())).isTrue(); + } + ); + } + + @Test + void 소식지가_없으면_빈_목록을_반환한다() { + // when + NewsListResponse response = newsQueryService.findNews(null, null); + + // then + assertThat(response.newsResponseList()).isEmpty(); + } } - @Test - void 로그인한_사용자가_특정_사용자의_소식지_목록을_성공적으로_조회한다() { - // given - SiteUser author = siteUserFixture.멘토(1, "author"); - SiteUser loginUser = siteUserFixture.멘토(2, "loginUser"); - - News news1 = newsFixture.소식지(author.getId()); - News news2 = newsFixture.소식지(author.getId()); - News news3 = newsFixture.소식지(author.getId()); - - likedNewsFixture.소식지_좋아요(news1.getId(), loginUser.getId()); - likedNewsFixture.소식지_좋아요(news3.getId(), loginUser.getId()); - - List newsList = List.of(news1, news2, news3); - - // when - NewsListResponse response = newsQueryService.findNewsByAuthorId(loginUser.getId(), author.getId()); - - // then - assertAll( - () -> assertThat(response.newsResponseList()) - .extracting(NewsResponse::id) - .containsExactlyInAnyOrder(news1.getId(), news2.getId(), news3.getId()), - () -> assertThat(response.newsResponseList()) - .extracting(NewsResponse::updatedAt) - .isSortedAccordingTo(Comparator.reverseOrder()), - () -> { - Map likeStatusMap = response.newsResponseList().stream() - .collect(Collectors.toMap(NewsResponse::id, NewsResponse::isLiked)); - assertThat(likeStatusMap.get(news1.getId())).isTrue(); - assertThat(likeStatusMap.get(news2.getId())).isFalse(); - assertThat(likeStatusMap.get(news3.getId())).isTrue(); - } - ); + @Nested + @DisplayName("특정 사용자의 소식지 조회") + class 특정_사용자의_소식지를_조회한다 { + + @Test + void 로그인하지_않은_사용자가_특정_사용자의_소식지_목록을_성공적으로_조회한다() { + // given + SiteUser author = siteUserFixture.멘토(1, "author"); + SiteUser otherUser = siteUserFixture.멘토(2, "other"); + + News news1 = newsFixture.소식지(author.getId()); + News news2 = newsFixture.소식지(author.getId()); + newsFixture.소식지(otherUser.getId()); + + // when + NewsListResponse response = newsQueryService.findNews(null, author.getId()); + + // then + assertAll( + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::id) + .containsExactlyInAnyOrder(news1.getId(), news2.getId()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::updatedAt) + .isSortedAccordingTo(Comparator.reverseOrder()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::isLiked) + .containsOnly((Boolean) null) + ); + } + + @Test + void 로그인한_사용자가_특정_사용자의_소식지_목록을_성공적으로_조회한다() { + // given + SiteUser author = siteUserFixture.멘토(1, "author"); + SiteUser loginUser = siteUserFixture.멘토(2, "loginUser"); + + News news1 = newsFixture.소식지(author.getId()); + News news2 = newsFixture.소식지(author.getId()); + News news3 = newsFixture.소식지(author.getId()); + + likedNewsFixture.소식지_좋아요(news1.getId(), loginUser.getId()); + likedNewsFixture.소식지_좋아요(news3.getId(), loginUser.getId()); + + // when + NewsListResponse response = newsQueryService.findNews(loginUser.getId(), author.getId()); + + // then + assertAll( + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::id) + .containsExactlyInAnyOrder(news1.getId(), news2.getId(), news3.getId()), + () -> assertThat(response.newsResponseList()) + .extracting(NewsResponse::updatedAt) + .isSortedAccordingTo(Comparator.reverseOrder()), + () -> { + Map likeStatusMap = response.newsResponseList().stream() + .collect(Collectors.toMap(NewsResponse::id, NewsResponse::isLiked)); + assertThat(likeStatusMap.get(news1.getId())).isTrue(); + assertThat(likeStatusMap.get(news2.getId())).isFalse(); + assertThat(likeStatusMap.get(news3.getId())).isTrue(); + } + ); + } } } From b5befcca8d83c49437ce9f354b4f37be3c187f4d Mon Sep 17 00:00:00 2001 From: seonghyeok cho <65901319+whqtker@users.noreply.github.com> Date: Wed, 18 Feb 2026 14:37:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore:=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EC=A1=B0=EA=B1=B4=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=8A=94=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1=20(#676)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...add_DELE_and_ETC_to_language_requirement.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/resources/db/migration/V46__add_DELE_and_ETC_to_language_requirement.sql diff --git a/src/main/resources/db/migration/V46__add_DELE_and_ETC_to_language_requirement.sql b/src/main/resources/db/migration/V46__add_DELE_and_ETC_to_language_requirement.sql new file mode 100644 index 000000000..c4145c3ee --- /dev/null +++ b/src/main/resources/db/migration/V46__add_DELE_and_ETC_to_language_requirement.sql @@ -0,0 +1,17 @@ +ALTER TABLE language_requirement + MODIFY COLUMN language_test_type ENUM( + 'CEFR', + 'DALF', + 'DELF', + 'DELE', + 'DUOLINGO', + 'IELTS', + 'JLPT', + 'NEW_HSK', + 'TCF', + 'TEF', + 'TOEFL_IBT', + 'TOEFL_ITP', + 'TOEIC', + 'ETC' + ) NOT NULL;