diff --git a/src/main/java/eatda/controller/article/ArticleController.java b/src/main/java/eatda/controller/article/ArticleController.java deleted file mode 100644 index 478f0a04..00000000 --- a/src/main/java/eatda/controller/article/ArticleController.java +++ /dev/null @@ -1,24 +0,0 @@ -package eatda.controller.article; - -import eatda.service.article.ArticleService; -import jakarta.validation.constraints.Max; -import jakarta.validation.constraints.Min; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -@Controller -@RequiredArgsConstructor -public class ArticleController { - - private final ArticleService articleService; - - @GetMapping("/api/articles") - public ResponseEntity getArticles(@RequestParam(defaultValue = "3") @Min(1) @Max(50) int size) { - return ResponseEntity.status(HttpStatus.OK) - .body(articleService.getAllArticles(size)); - } -} diff --git a/src/main/java/eatda/controller/article/ArticleResponse.java b/src/main/java/eatda/controller/article/ArticleResponse.java deleted file mode 100644 index 9a998fdf..00000000 --- a/src/main/java/eatda/controller/article/ArticleResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package eatda.controller.article; - -public record ArticleResponse( - String title, - String subtitle, - String articleUrl, - String imageUrl -) { -} diff --git a/src/main/java/eatda/controller/article/ArticlesResponse.java b/src/main/java/eatda/controller/article/ArticlesResponse.java deleted file mode 100644 index d1b9d14c..00000000 --- a/src/main/java/eatda/controller/article/ArticlesResponse.java +++ /dev/null @@ -1,8 +0,0 @@ -package eatda.controller.article; - -import java.util.List; - -public record ArticlesResponse( - List articles -) { -} diff --git a/src/main/java/eatda/domain/article/Article.java b/src/main/java/eatda/domain/article/Article.java deleted file mode 100644 index ba70616d..00000000 --- a/src/main/java/eatda/domain/article/Article.java +++ /dev/null @@ -1,46 +0,0 @@ -package eatda.domain.article; - -import eatda.domain.AuditingEntity; -import eatda.domain.ImageKey; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Table(name = "article") -@Entity -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Article extends AuditingEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String title; - - @Column(nullable = false) - private String subtitle; - - @Column(name = "article_url", nullable = false, length = 511) - private String articleUrl; - - @NotNull - @Embedded - private ImageKey imageKey; - - public Article(String title, String subtitle, String articleUrl, ImageKey imageKey) { - this.title = title; - this.subtitle = subtitle; - this.articleUrl = articleUrl; - this.imageKey = imageKey; - } -} diff --git a/src/main/java/eatda/domain/story/Story.java b/src/main/java/eatda/domain/story/Story.java index ad923782..6dda09c8 100644 --- a/src/main/java/eatda/domain/story/Story.java +++ b/src/main/java/eatda/domain/story/Story.java @@ -54,7 +54,7 @@ public class Story extends AuditingEntity { @Column(name = "store_category", nullable = false) private StoreCategory storeCategory; - @Column(name = "description", nullable = false) + @Column(name = "description") private String description; @NotNull diff --git a/src/main/java/eatda/repository/article/ArticleRepository.java b/src/main/java/eatda/repository/article/ArticleRepository.java deleted file mode 100644 index 95729476..00000000 --- a/src/main/java/eatda/repository/article/ArticleRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package eatda.repository.article; - -import eatda.domain.article.Article; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ArticleRepository extends JpaRepository { - - Page
findAllByOrderByCreatedAtDesc(Pageable pageable); - -} diff --git a/src/main/java/eatda/service/article/ArticleService.java b/src/main/java/eatda/service/article/ArticleService.java deleted file mode 100644 index 0fd947a9..00000000 --- a/src/main/java/eatda/service/article/ArticleService.java +++ /dev/null @@ -1,33 +0,0 @@ -package eatda.service.article; - -import eatda.controller.article.ArticleResponse; -import eatda.controller.article.ArticlesResponse; -import eatda.repository.article.ArticleRepository; -import eatda.storage.image.ImageStorage; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class ArticleService { - - private final ArticleRepository articleRepository; - private final ImageStorage imageStorage; - - public ArticlesResponse getAllArticles(int size) { - PageRequest pageRequest = PageRequest.of(0, size); - List articles = articleRepository.findAllByOrderByCreatedAtDesc(pageRequest) - .stream() - .map(article -> new ArticleResponse( - article.getTitle(), - article.getSubtitle(), - article.getArticleUrl(), - imageStorage.getPreSignedUrl(article.getImageKey()) - )) - .toList(); - - return new ArticlesResponse(articles); - } -} diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql index 9884aab9..47deb35e 100644 --- a/src/main/resources/db/migration/V1__init.sql +++ b/src/main/resources/db/migration/V1__init.sql @@ -39,14 +39,3 @@ CREATE TABLE `cheer` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE CASCADE, FOREIGN KEY (`store_id`) REFERENCES `store` (`id`) ON DELETE CASCADE ); - -CREATE TABLE `article` -( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `title` VARCHAR(255) NOT NULL, - `subtitle` VARCHAR(255) NOT NULL, - `article_url` VARCHAR(511) NOT NULL, - `image_key` VARCHAR(511) NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -); diff --git a/src/main/resources/db/migration/V3__add_story_table.sql b/src/main/resources/db/migration/V3__add_story_table.sql index 397e930a..2d01662f 100644 --- a/src/main/resources/db/migration/V3__add_story_table.sql +++ b/src/main/resources/db/migration/V3__add_story_table.sql @@ -7,7 +7,7 @@ CREATE TABLE `story` `store_road_address` VARCHAR(255) NOT NULL, `store_lot_number_address` VARCHAR(255) NOT NULL, `store_category` VARCHAR(50) NOT NULL, - `description` TEXT NOT NULL, + `description` TEXT NULL, `image_key` VARCHAR(511) NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) diff --git a/src/main/resources/db/migration/V5__story_description_available_null.sql b/src/main/resources/db/migration/V5__story_description_available_null.sql deleted file mode 100644 index 1547ce1f..00000000 --- a/src/main/resources/db/migration/V5__story_description_available_null.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE story - MODIFY COLUMN description TEXT NULL; diff --git a/src/main/resources/db/seed/dev/V2__dev_init_data.sql b/src/main/resources/db/seed/dev/V2__dev_init_data.sql index 5c31a4bd..61f25ea1 100644 --- a/src/main/resources/db/seed/dev/V2__dev_init_data.sql +++ b/src/main/resources/db/seed/dev/V2__dev_init_data.sql @@ -32,10 +32,3 @@ VALUES (1, 1, 1, '정말 맛있어요! 강추합니다!', 'cheer/dummy/1.jpg', t (5, 5, 5, '디저트가 정말 맛있어요!', 'cheer/dummy/5.jpg', true), (6, 6, 6, '커피가 정말 맛있어요!', 'cheer/dummy/6.jpg', false), (7, 7, 7, '패스트푸드가 빠르고 맛있어요!', 'cheer/dummy/7.jpg', false); - -INSERT INTO article (id, title, subtitle, article_url, image_key) -VALUES (1, '미식가를 위한 수제 아이스크림 가게 🍨', '센프란시스코에서 영감을 얻은 펠엔콜 사장님의 이야기', - 'https://ultra-wallet-037.notion.site/240b6292d5398127a630fabaa9dcd80d?pvs=74', - 'article/dummy/1.jpg'), - (2, '두 번째 기사', '서브타이틀 2', 'https://example.com/article2', 'article/dummy/2.jpg'), - (3, '세 번째 기사', '서브타이틀 3', 'https://example.com/article3', 'article/dummy/3.jpg'); diff --git a/src/main/resources/db/seed/local/V2__local_init_data.sql b/src/main/resources/db/seed/local/V2__local_init_data.sql index 91c74cd1..61f25ea1 100644 --- a/src/main/resources/db/seed/local/V2__local_init_data.sql +++ b/src/main/resources/db/seed/local/V2__local_init_data.sql @@ -32,8 +32,3 @@ VALUES (1, 1, 1, '정말 맛있어요! 강추합니다!', 'cheer/dummy/1.jpg', t (5, 5, 5, '디저트가 정말 맛있어요!', 'cheer/dummy/5.jpg', true), (6, 6, 6, '커피가 정말 맛있어요!', 'cheer/dummy/6.jpg', false), (7, 7, 7, '패스트푸드가 빠르고 맛있어요!', 'cheer/dummy/7.jpg', false); - -INSERT INTO article (id, title, subtitle, article_url, image_key) -VALUES (1, '첫 번째 기사', '서브타이틀 1', 'https://example.com/article1', 'article/dummy/1.jpg'), - (2, '두 번째 기사', '서브타이틀 2', 'https://example.com/article2', 'article/dummy/2.jpg'), - (3, '세 번째 기사', '서브타이틀 3', 'https://example.com/article3', 'article/dummy/3.jpg'); diff --git a/src/test/java/eatda/controller/BaseControllerTest.java b/src/test/java/eatda/controller/BaseControllerTest.java index 38cf7d97..f729fe7c 100644 --- a/src/test/java/eatda/controller/BaseControllerTest.java +++ b/src/test/java/eatda/controller/BaseControllerTest.java @@ -13,12 +13,10 @@ import eatda.controller.web.jwt.JwtManager; import eatda.domain.ImageKey; import eatda.domain.member.Member; -import eatda.fixture.ArticleGenerator; import eatda.fixture.CheerGenerator; import eatda.fixture.MemberGenerator; import eatda.fixture.StoreGenerator; import eatda.fixture.StoryGenerator; -import eatda.repository.article.ArticleRepository; import eatda.repository.cheer.CheerRepository; import eatda.repository.member.MemberRepository; import eatda.repository.store.StoreRepository; @@ -52,7 +50,6 @@ public class BaseControllerTest { private static final ImageKey MOCKED_IMAGE_KEY = new ImageKey("mocked-image-path"); private static final String MOCKED_IMAGE_URL = "https://example.com/image.jpg"; - @Autowired protected MemberGenerator memberGenerator; @@ -62,9 +59,6 @@ public class BaseControllerTest { @Autowired protected CheerGenerator cheerGenerator; - @Autowired - protected ArticleGenerator articleGenerator; - @Autowired protected StoryGenerator storyGenerator; @@ -77,9 +71,6 @@ public class BaseControllerTest { @Autowired protected CheerRepository cheerRepository; - @Autowired - protected ArticleRepository articleRepository; - @Autowired protected StoryRepository storyRepository; diff --git a/src/test/java/eatda/controller/article/ArticleControllerTest.java b/src/test/java/eatda/controller/article/ArticleControllerTest.java deleted file mode 100644 index 15f5ea6b..00000000 --- a/src/test/java/eatda/controller/article/ArticleControllerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package eatda.controller.article; - -import static org.assertj.core.api.Assertions.assertThat; - -import eatda.controller.BaseControllerTest; -import java.time.LocalDateTime; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -public class ArticleControllerTest extends BaseControllerTest { - - @Nested - class GetArticles { - - @Test - void 가게의_담긴_이야기_목록을_조회할_수_있다() { - LocalDateTime startAt = LocalDateTime.of(2023, 10, 1, 0, 0); - articleGenerator.generate("국밥의 모든 것", startAt); - articleGenerator.generate("순대국의 진실", startAt.plusHours(1)); - - ArticlesResponse response = given() - .queryParam("size", 3) - .when() - .get("/api/articles") - .then().statusCode(200) - .extract().as(ArticlesResponse.class); - - assertThat(response.articles()).hasSize(2); - assertThat(response.articles().getFirst().title()).isEqualTo("순대국의 진실"); - } - } -} diff --git a/src/test/java/eatda/document/BaseDocumentTest.java b/src/test/java/eatda/document/BaseDocumentTest.java index 9efafa24..bf2f0ed5 100644 --- a/src/test/java/eatda/document/BaseDocumentTest.java +++ b/src/test/java/eatda/document/BaseDocumentTest.java @@ -7,7 +7,6 @@ import eatda.controller.web.jwt.JwtManager; import eatda.exception.BusinessErrorCode; import eatda.exception.EtcErrorCode; -import eatda.service.article.ArticleService; import eatda.service.auth.AuthService; import eatda.service.auth.OauthService; import eatda.service.cheer.CheerService; @@ -64,9 +63,6 @@ public abstract class BaseDocumentTest { @MockitoBean protected CheerService cheerService; - @MockitoBean - protected ArticleService articleService; - @MockitoBean protected ImageService imageService; diff --git a/src/test/java/eatda/document/article/ArticleDocumentTest.java b/src/test/java/eatda/document/article/ArticleDocumentTest.java deleted file mode 100644 index d16dc05d..00000000 --- a/src/test/java/eatda/document/article/ArticleDocumentTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package eatda.document.article; - -import static org.mockito.Mockito.doReturn; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; - -import eatda.controller.article.ArticleResponse; -import eatda.controller.article.ArticlesResponse; -import eatda.document.BaseDocumentTest; -import eatda.document.RestDocsRequest; -import eatda.document.RestDocsResponse; -import eatda.document.Tag; -import io.restassured.response.Response; -import java.util.List; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.restdocs.restassured.RestDocumentationFilter; - -public class ArticleDocumentTest extends BaseDocumentTest { - - @Nested - class GetArticles { - - RestDocsRequest requestDocument = request() - .tag(Tag.ARTICLE_API) - .summary("가게의 담긴 이야기") - .description("게시글을 최신순으로 페이지네이션하여 조회합니다.") - .queryParameter( - parameterWithName("size").description("페이지당 조회할 아티클 개수 (default = 3)") - ); - - RestDocsResponse responseDocument = response() - .responseBodyField( - fieldWithPath("articles").description("게시글 응답 리스트"), - fieldWithPath("articles[].title").description("게시글 제목"), - fieldWithPath("articles[].subtitle").description("게시글 소제목"), - fieldWithPath("articles[].articleUrl").description("게시글 링크 URL"), - fieldWithPath("articles[].imageUrl").description("게시글 이미지 URL") - ); - - @Test - void 가게의_담긴_이야기_목록_조회_성공() { - ArticlesResponse mockResponse = new ArticlesResponse(List.of( - new ArticleResponse( - "국밥의 모든 것", - "뜨끈한 국물의 세계", - "https://eatda.com/article/1", - "https://s3.bucket.com/article/1.jpg" - ), - new ArticleResponse( - "순대국의 진실", - "돼지부속의 미학", - "https://eatda.com/article/2", - "https://s3.bucket.com/article/2.jpg" - ) - )); - - doReturn(mockResponse) - .when(articleService) - .getAllArticles(3); - - RestDocumentationFilter document = document("article/get-articles", 200) - .request(requestDocument) - .response(responseDocument) - .build(); - - Response response = given(document) - .queryParam("size", 3) - .when() - .get("/api/articles"); - - response.then() - .statusCode(200); - } - } -} diff --git a/src/test/java/eatda/fixture/ArticleGenerator.java b/src/test/java/eatda/fixture/ArticleGenerator.java deleted file mode 100644 index c04986da..00000000 --- a/src/test/java/eatda/fixture/ArticleGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -package eatda.fixture; - -import eatda.domain.ImageKey; -import eatda.domain.article.Article; -import eatda.repository.article.ArticleRepository; -import eatda.util.DomainUtils; -import java.time.LocalDateTime; -import org.springframework.stereotype.Component; - -@Component -public class ArticleGenerator { - - private static final String DEFAULT_TITLE = "기본 제목"; - private static final String DEFAULT_SUBTITLE = "기본 소제목"; - private static final String DEFAULT_URL = "https://eatda.com/article/default"; - private static final String DEFAULT_IMAGE_KEY = "article/default-image.jpg"; - - private final ArticleRepository articleRepository; - - public ArticleGenerator(ArticleRepository articleRepository) { - this.articleRepository = articleRepository; - } - - public Article generate() { - return generate(DEFAULT_TITLE); - } - - public Article generate(String title) { - return generate(title, DEFAULT_SUBTITLE); - } - - public Article generate(String title, LocalDateTime createdAt) { - Article article = generate(title, DEFAULT_SUBTITLE); - DomainUtils.setCreatedAt(article, createdAt); - return articleRepository.save(article); - } - - public Article generate(String title, String subtitle) { - return generate(title, subtitle, DEFAULT_URL); - } - - public Article generate(String title, String subtitle, String articleUrl) { - return generate(title, subtitle, articleUrl, DEFAULT_IMAGE_KEY); - } - - public Article generate(String title, String subtitle, String articleUrl, String imageKey) { - Article article = new Article(title, subtitle, articleUrl, new ImageKey(imageKey)); - return articleRepository.save(article); - } -} diff --git a/src/test/java/eatda/service/BaseServiceTest.java b/src/test/java/eatda/service/BaseServiceTest.java index 9f9832bb..19c5be0d 100644 --- a/src/test/java/eatda/service/BaseServiceTest.java +++ b/src/test/java/eatda/service/BaseServiceTest.java @@ -7,7 +7,6 @@ import eatda.client.map.MapClient; import eatda.client.oauth.OauthClient; import eatda.domain.ImageKey; -import eatda.fixture.ArticleGenerator; import eatda.fixture.CheerGenerator; import eatda.fixture.MemberGenerator; import eatda.fixture.StoreGenerator; @@ -56,9 +55,6 @@ public abstract class BaseServiceTest { @Autowired protected CheerGenerator cheerGenerator; - @Autowired - protected ArticleGenerator articleGenerator; - @Autowired protected MemberRepository memberRepository; diff --git a/src/test/java/eatda/service/article/ArticleServiceTest.java b/src/test/java/eatda/service/article/ArticleServiceTest.java deleted file mode 100644 index 408700fc..00000000 --- a/src/test/java/eatda/service/article/ArticleServiceTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package eatda.service.article; - -import static org.assertj.core.api.Assertions.assertThat; - -import eatda.controller.article.ArticleResponse; -import eatda.service.BaseServiceTest; -import java.time.LocalDateTime; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -public class ArticleServiceTest extends BaseServiceTest { - - @Autowired - private ArticleService articleService; - - @Nested - class GetAllArticles { - - @Test - void 가게의_담긴_이야기를_최신순으로_조회할_수_있다() { - LocalDateTime startAt = LocalDateTime.of(2025, 7, 26, 12, 0, 0); - articleGenerator.generate("아티클 제목 1", startAt); - articleGenerator.generate("아티클 제목 2", startAt.plusHours(1)); - articleGenerator.generate("아티클 제목 3", startAt.plusHours(2)); - articleGenerator.generate("아티클 제목 4", startAt.plusHours(3)); - articleGenerator.generate("아티클 제목 5", startAt.plusHours(4)); - - var response = articleService.getAllArticles(3); - - assertThat(response.articles()).hasSize(3) - .extracting(ArticleResponse::title) - .containsExactly("아티클 제목 5", "아티클 제목 4", "아티클 제목 3"); - } - } -}