diff --git a/src/main/java/com/backend/soullive_a/controller/ModelFitnessController.java b/src/main/java/com/backend/soullive_a/controller/ModelFitnessController.java new file mode 100644 index 0000000..e1dc7c5 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/controller/ModelFitnessController.java @@ -0,0 +1,36 @@ +package com.backend.soullive_a.controller; + +import com.backend.soullive_a.dto.request.ModelFitnessRequest; +import com.backend.soullive_a.dto.response.model.fitness.ModelFitnessResponse; +import com.backend.soullive_a.exception.base.BaseResponse; +import com.backend.soullive_a.service.impl.ModelFitnessServiceImpl; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "모델 적합도 API", description = "모델 적합도 이슈 API입니다.") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/model/fitness") +public class ModelFitnessController { + private final ModelFitnessServiceImpl modelFitnessService; + + @Operation(summary = "모델 적합도 API", description = "모델 적합도 조회 API입니다.") + @GetMapping("") + public BaseResponse getModelFitness( + @RequestParam String modelName, + @RequestParam Long productId + ) { + return BaseResponse.builder() + .code(200) + .message("모델 적합도 조회에 성공했습니다.") + .isSuccess(true) + .data(modelFitnessService.getModelFitness(new ModelFitnessRequest(modelName, productId))) + .build(); + } + +} diff --git a/src/main/java/com/backend/soullive_a/controller/ModelIssueController.java b/src/main/java/com/backend/soullive_a/controller/ModelIssueController.java index c67f1c9..42e878a 100644 --- a/src/main/java/com/backend/soullive_a/controller/ModelIssueController.java +++ b/src/main/java/com/backend/soullive_a/controller/ModelIssueController.java @@ -3,17 +3,22 @@ import com.backend.soullive_a.dto.response.model.issue.ModelIssueResponse; import com.backend.soullive_a.exception.base.BaseResponse; import com.backend.soullive_a.service.ModelIssueService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +@Tag(name = "모델 부정 이슈 API", description = "모델 부정 이슈 API입니다.") @RestController @RequiredArgsConstructor @RequestMapping("api/model/issue") public class ModelIssueController { private final ModelIssueService modelIssueService; + + @Operation(summary = "모델 부정 이슈 조회 API", description = "특정 모델 부정 이슈 조회 API입니다.") @GetMapping() public BaseResponse getIssue(@RequestParam String modelName) { return BaseResponse.builder() diff --git a/src/main/java/com/backend/soullive_a/dto/request/ModelFitnessRequest.java b/src/main/java/com/backend/soullive_a/dto/request/ModelFitnessRequest.java new file mode 100644 index 0000000..10aa477 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/request/ModelFitnessRequest.java @@ -0,0 +1,7 @@ +package com.backend.soullive_a.dto.request; + +public record ModelFitnessRequest( + String modelName, + Long productId +) { +} diff --git a/src/main/java/com/backend/soullive_a/dto/response/ModelImageKeywordResponse.java b/src/main/java/com/backend/soullive_a/dto/response/ModelImageKeywordResponse.java deleted file mode 100644 index 649e53a..0000000 --- a/src/main/java/com/backend/soullive_a/dto/response/ModelImageKeywordResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.backend.soullive_a.dto.response; - -import com.backend.soullive_a.entity.model.Model; -import jakarta.persistence.Column; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import lombok.Builder; - -@Builder -public record ModelImageKeywordResponse( -// Long id, - String keyord -// Model model //필요한가? -) { -} diff --git a/src/main/java/com/backend/soullive_a/dto/response/model/fitness/ModelFitnessResponse.java b/src/main/java/com/backend/soullive_a/dto/response/model/fitness/ModelFitnessResponse.java new file mode 100644 index 0000000..36651af --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/response/model/fitness/ModelFitnessResponse.java @@ -0,0 +1,19 @@ +package com.backend.soullive_a.dto.response.model.fitness; + +import jakarta.persistence.Column; +import lombok.Builder; + +import java.util.List; + +@Builder + +public record ModelFitnessResponse( + String scoreUrl, + String aiComment, + List modelImageKeywordList, + List brandImageKeywordList, + List productImageKeywordList + + +) { +} diff --git a/src/main/java/com/backend/soullive_a/entity/model/fitness/ModelFitness.java b/src/main/java/com/backend/soullive_a/entity/model/fitness/ModelFitness.java new file mode 100644 index 0000000..261e761 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/entity/model/fitness/ModelFitness.java @@ -0,0 +1,27 @@ +package com.backend.soullive_a.entity.model.fitness; + +import com.backend.soullive_a.entity.model.ProductModel; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ModelFitness { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "MODEL_FITENSS_ID", nullable = false) + private Long id; + + @Column(name = "SCORE_URL", nullable = false) + private String scoreUrl; + + @Column(name = "AI_COMMENT", nullable = false) + private String aiComment; + + @OneToOne + @JoinColumn(name = "PRODUCT_MODEL_ID") + private ProductModel productModel; +} diff --git a/src/main/java/com/backend/soullive_a/repository/ProductModelRepository.java b/src/main/java/com/backend/soullive_a/repository/ProductModelRepository.java index 166b980..69d3828 100644 --- a/src/main/java/com/backend/soullive_a/repository/ProductModelRepository.java +++ b/src/main/java/com/backend/soullive_a/repository/ProductModelRepository.java @@ -1,11 +1,16 @@ package com.backend.soullive_a.repository; import com.backend.soullive_a.dto.response.RecentModelResponse; +import com.backend.soullive_a.entity.Product; +import com.backend.soullive_a.entity.model.Model; import com.backend.soullive_a.entity.model.ProductModel; import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.security.core.parameters.P; public interface ProductModelRepository extends JpaRepository { @@ -16,4 +21,6 @@ public interface ProductModelRepository extends JpaRepository getRecentModels(@Param("productId") Long productId); + + Optional findByProductAndModel(Product product, Model model); } diff --git a/src/main/java/com/backend/soullive_a/repository/model/fitness/ModelFitnessRepository.java b/src/main/java/com/backend/soullive_a/repository/model/fitness/ModelFitnessRepository.java new file mode 100644 index 0000000..9cb1cc2 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/repository/model/fitness/ModelFitnessRepository.java @@ -0,0 +1,8 @@ +package com.backend.soullive_a.repository.model.fitness; + +import com.backend.soullive_a.entity.model.fitness.ModelFitness; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ModelFitnessRepository extends JpaRepository { + +} diff --git a/src/main/java/com/backend/soullive_a/service/ModelFitnessService.java b/src/main/java/com/backend/soullive_a/service/ModelFitnessService.java new file mode 100644 index 0000000..7daa36d --- /dev/null +++ b/src/main/java/com/backend/soullive_a/service/ModelFitnessService.java @@ -0,0 +1,8 @@ +package com.backend.soullive_a.service; + +import com.backend.soullive_a.dto.request.ModelFitnessRequest; +import com.backend.soullive_a.dto.response.model.fitness.ModelFitnessResponse; + +public interface ModelFitnessService { + public ModelFitnessResponse getModelFitness(ModelFitnessRequest request); +} diff --git a/src/main/java/com/backend/soullive_a/service/impl/ModelFitnessServiceImpl.java b/src/main/java/com/backend/soullive_a/service/impl/ModelFitnessServiceImpl.java new file mode 100644 index 0000000..7f9ce85 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/service/impl/ModelFitnessServiceImpl.java @@ -0,0 +1,76 @@ +package com.backend.soullive_a.service.impl; + +import com.backend.soullive_a.dto.request.ModelFitnessRequest; +import com.backend.soullive_a.dto.response.model.fitness.ModelFitnessResponse; +import com.backend.soullive_a.entity.BrandImage; +import com.backend.soullive_a.entity.Product; +import com.backend.soullive_a.entity.ProductImage; +import com.backend.soullive_a.entity.model.Model; +import com.backend.soullive_a.entity.model.ProductModel; +import com.backend.soullive_a.entity.model.fitness.ModelFitness; +import com.backend.soullive_a.entity.model.introduction.ModelImageKeyword; +import com.backend.soullive_a.exception.custom.NotFoundUserException; +import com.backend.soullive_a.repository.*; +import com.backend.soullive_a.repository.model.fitness.ModelFitnessRepository; +import com.backend.soullive_a.repository.model.introduction.ModelImageKeywordRepository; +import com.backend.soullive_a.service.ModelFitnessService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ModelFitnessServiceImpl implements ModelFitnessService { + + private final ModelFitnessRepository modelFitnessRepository; + private final ModelRepository modelRepository; + private final ProductRepository productRepository; + private final ProductModelRepository productModelRepository; + private final ModelImageKeywordRepository modelImageKeywordRepository; + private final BrandImageRepository brandImageRepository; + private final ProductImageRepository productImageRepository; + + @Override + public ModelFitnessResponse getModelFitness(ModelFitnessRequest request) { + Model model = modelRepository.findByModelName(request.modelName()) + .orElseThrow(() -> new NotFoundUserException("해당 Model을 찾을 수 없습니다")); + + Product product = productRepository.findById(request.productId()) + .orElseThrow(() -> new NotFoundUserException("해당 Product를 찾을 수 없습니다")); //커스텀에러 + + ProductModel productModel = productModelRepository.findByProductAndModel(product, model) + .orElseThrow(() -> new NotFoundUserException( + String.format("product : %d, model : %s의 상품모델을 찾을 수 없습니다", product.getId(), model.getModelName()) + ) + ); //커스텀에러 + + ModelFitness modelFitness = modelFitnessRepository.findById(productModel.getId()) + .orElseThrow(() -> new NotFoundUserException("모델적합도를 찾을수없습니다")); //커스텀에러 + + List modelImageKeywords = modelImageKeywordRepository.findAllByModel(model); + List modelImageKeywordResponses = modelImageKeywords.stream() + .map(ModelImageKeyword::getKeyword) + .collect(Collectors.toList()); + + List brandImages = brandImageRepository.findAllByProductId(product.getId()); + List brandImageResponses = brandImages.stream() + .map(BrandImage::getBrandImage) + .collect(Collectors.toList()); + + List productImages = productImageRepository.findAllByProductId(product.getId()); + List productImageResponses = productImages.stream() + .map(ProductImage::getProductImage) + .collect(Collectors.toList()); + + return ModelFitnessResponse.builder() + .scoreUrl(modelFitness.getScoreUrl()) + .aiComment(modelFitness.getAiComment()) + .modelImageKeywordList(modelImageKeywordResponses) + .brandImageKeywordList(brandImageResponses) + .productImageKeywordList(productImageResponses) + .build(); + } +} diff --git a/src/main/java/com/backend/soullive_a/service/impl/ModelServiceImpl.java b/src/main/java/com/backend/soullive_a/service/impl/ModelServiceImpl.java index 8702665..9b21e6a 100644 --- a/src/main/java/com/backend/soullive_a/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/backend/soullive_a/service/impl/ModelServiceImpl.java @@ -7,10 +7,12 @@ import com.backend.soullive_a.entity.Product; import com.backend.soullive_a.entity.model.Model; import com.backend.soullive_a.entity.model.ProductModel; +import com.backend.soullive_a.entity.model.fitness.ModelFitness; import com.backend.soullive_a.exception.custom.NotFoundUserException; import com.backend.soullive_a.repository.ModelRepository; import com.backend.soullive_a.repository.ProductModelRepository; import com.backend.soullive_a.repository.ProductRepository; +import com.backend.soullive_a.repository.model.fitness.ModelFitnessRepository; import com.backend.soullive_a.service.ModelService; import java.time.LocalDateTime; import java.util.ArrayList; @@ -26,14 +28,13 @@ public class ModelServiceImpl implements ModelService { private final ModelRepository modelRepository; private final ProductRepository productRepository; private final ProductModelRepository productModelRepository; + private final ModelFitnessRepository modelFitnessRepository; @Override @Transactional public ModelResponse getModel(String modelName,Long productId) { - System.out.println(modelName); Model model = modelRepository.findByModelName(modelName) .orElseThrow(() -> new NotFoundUserException()); - //최근 조회 모델 데이터 업데이트 updateRecentViewModel(model,productId); @@ -52,6 +53,33 @@ public ModelResponse getModel(String modelName,Long productId) { .build(); } + private void createModelFitness( ProductModel productModel) { + String aiComment="ai 한줄 평 준비 중 입니다."; + String scoreUrl="https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_modelFitness_score.png"; + + if (productModel.getModel().getId() == 1) { + aiComment = "김희애의 우아하고 고급스러운 이미지와 함께 가족적인 이미지가 어우러져 lg 시그니처 브랜드의 프리미엄적인 이미지와 고품질 제품에 잘 어울릴 것이라고 판단 됩니다."; + scoreUrl="https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_modelFitness_score.png"; + } + else if (productModel.getModel().getId() == 2) { + aiComment = "한지민은 깨끗하고 바른 이미지로 LG시그니처와 어울리지만 현재 목표하는 프리미엄 이미지를 강조하기에는 다소 아쉬운 모델입니다."; + scoreUrl="https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/hanjimin_modelFitness_score.png"; + } else if (productModel.getModel().getId() == 3) { + aiComment = "김고은은 세련되고 사랑스러운 이미지로 LG 시그니처가 목표로 하는 세련되고 대중에게 친숙한 이미지와 적합합니다."; + scoreUrl="https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_modelFitness_score.png"; + } + + + modelFitnessRepository.save( + ModelFitness.builder() + .productModel(productModel) + .aiComment(aiComment) + .scoreUrl(scoreUrl) + .build() + ); + + + } /** @@ -91,12 +119,15 @@ private void updateRecentViewModel(Model model, Long productId){ Product product = productRepository.findById(productId) .orElseThrow(NotFoundUserException::new); - productModelRepository.save( - ProductModel.builder() - .model(model) - .product(product) - .searchTime(LocalDateTime.now()) - .build() + ProductModel productModel = productModelRepository.save( + ProductModel.builder() + .model(model) + .product(product) + .searchTime(LocalDateTime.now()) + .build() ); + + //모델 적합도 더미데이터 생성 + createModelFitness(productModel); } } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 744e7a5..6aa6f5a 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,8 +1,8 @@ -- 유저 -INSERT INTO soullive.user (user_id, password, phone_number) VALUES (1, 'password', '010-0000-0000'); +INSERT INTO soullive.user (user_id, password, phone_number) VALUES (1, 'password', '010-0000-0000'); -- 모델 -INSERT INTO soullive.model (model_id, model_name, birth, age, job, info, agency, ai_rate, image_url) +INSERT INTO soullive.model (model_id, model_name, birth, age, job, info, agency, ai_rate, image_url) VALUES (1, '김희애', '1967-04-23', '56세', '텔런트/영화배우', '', 'YG 엔터테인먼트', 4.0, 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae.png'), (2, '한지민', '1982-11-05', '41세', '배우', '', 'BH 엔터테인먼트', 3.0, 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/hanjimin.png'), @@ -23,14 +23,14 @@ VALUES -- 모델소개 -INSERT INTO soullive.model_introduction (model_id, model_introduction_id) +INSERT INTO soullive.model_introduction (model_id, model_introduction_id) VALUES (1, 1), (2, 2), (3, 3); -- 모델소개 > 모델이미지키워드 -INSERT INTO soullive.model_image_keyword (model_image_keyword_id, model_id, keyword) +INSERT INTO soullive.model_image_keyword (model_image_keyword_id, model_id, keyword) VALUES (1, 1, '#세련됨'), (2, 1, '#프로페셔널'), @@ -55,7 +55,7 @@ VALUES (21, 3, '#포근한'); -- 모델소개 > 최근 작품 -INSERT INTO soullive.model_recent_work (model_recent_work_id, `year`, model_id, category, genre, image_url, `role`, title) +INSERT INTO soullive.model_recent_work (model_recent_work_id, `year`, model_id, category, genre, image_url, `role`, title) VALUES (1, 2024, 1, '영화', '범죄', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_recentwork1.png', '심은조역 (주연)', '데드맨'), (2, 2023, 1, '드라마', '드라마, 정치', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_recentwork2.png', '황도희역 (주연)', '퀸메이커'), @@ -70,7 +70,7 @@ VALUES (9, 2022, 3, '드라마', '미스터리', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_recentwork3.png', '오인주역 (주연)', '작은아씨들'); -- 모델소개 > 최근 광고 활동 -INSERT INTO soullive.model_recent_advertisement (model_recent_advertisement_id, `year`, model_id, brand, image_url) +INSERT INTO soullive.model_recent_advertisement (model_recent_advertisement_id, `year`, model_id, brand, image_url) VALUES (1, 2024, 1, '우리은행 투체어스', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_recentadvertisement1.png'), (2, 2021, 1, '트렌비', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_recentadvertisement2.png'), @@ -85,7 +85,7 @@ VALUES (9, 2024, 3, '네스프레소', 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_recentadvertisement3.png'); -- 모델 화제성 -INSERT INTO soullive.model_popularity (model_popularity_id,model_id,score_url,ai_comment,sns_url,search_url,brand_score_url) +INSERT INTO soullive.model_popularity (model_popularity_id,model_id,score_url,ai_comment,sns_url,search_url,brand_score_url) values (1,1,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_popularity_score.png','최근 화제성에서는 다소 약한 모습을 보여주고 있지만 3040 남녀 모두에게 높은 인지도를 갖고 있고 앞으로 2개의 주연 활동을 앞두고 있어 더 큰 화제성을 갖을 것으로 예상됩니다.' ,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_popularity_sns.png','https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_search.png','https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_popularity_brand.png'), @@ -95,7 +95,7 @@ values ,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_popularity_sns.png','https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_popularity_search.png','https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_popularity_brand.png'); -- 모델 화제성 선호 성별 -INSERT INTO soullive.model_popular_gender (gender_id, model_popularity_id, gender_type) +INSERT INTO soullive.model_popular_gender (gender_id, model_popularity_id, gender_type) values ('1','1','MALE'), ('2','1','FEMALE'), @@ -107,7 +107,7 @@ values ('6','3','FEMALE'); -- 모델 화제성 선호연령대 -INSERT INTO soullive.model_popular_age (age_id, model_popularity_id,age_type) +INSERT INTO soullive.model_popular_age (age_id, model_popularity_id,age_type) values (1,1,'THIRTY'), (2,1,'FORTY'), @@ -121,7 +121,7 @@ values (8,3,'THIRTY'); -- 모델 예정 주요 활동 -INSERT INTO soullive.model_scheduled_work (model_scheduled_work_id,image_url,model_popularity_id,year,category,title,is_main_actor,genre) +INSERT INTO soullive.model_scheduled_work (model_scheduled_work_id,image_url,model_popularity_id,year,category,title,is_main_actor,genre) values (1,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_scheduled_work1.png', 1, 2024, '방영 예정 영화','돌풍',true,'드라마'), (2,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_scheduled_work2.png', 1, 2024, '방영 예정 영화','보통의 가족',true,'드라마'), @@ -133,14 +133,14 @@ values (6,'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_scheduled_work1.png', 3, 2024, '방영 예정 드라마','자백의 대가',true,'가족'); -- 모델 부정이슈 -INSERT INTO soullive.model_issue (model_issue_id, model_id, score_url, ai_comment,crime) +INSERT INTO soullive.model_issue (model_issue_id, model_id, score_url, ai_comment,crime) VALUES (1, 1, 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/heeae_issue.png', '2020년에 처음 알려진 김희애 남편의 횔령 혐의 피소가 있지만 사건의 전말이 정확하지 않고 김희애 배우 본인의 문제가 아니었기에 논란이 크지 않았습니다.', 0), (2, 2, 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/jimin_issue.png', '한지민은 데뷔 이래로 큰 논란이나 사건이 없었으며 대중들에게 줄곧 바른 이미지를 유지해왔습니다.', 0), (3, 3, 'https://soullive-bucket.s3.ap-northeast-2.amazonaws.com/goeun_issue.png', '김고은은 범죄이력이 없으며 두드러지는 사건사고가 없었기 때문에 부정적인 이슈를 일으킬 가능성이 낮습니다.', 0); --모델 부정이슈 뉴스 -INSERT INTO soullive.model_news (model_news_id, model_issue_id, company, news_date, title ,news_url) +INSERT INTO soullive.model_news (model_news_id, model_issue_id, company, news_date, title ,news_url) VALUES (1, 1, '살구뉴스', '2022-12-18', '“잘나가다 남편 때문에" 김희애 남편, 회사 논란 밝혀지자 모두 경악', 'https://www.salgoonews.com/news/articleView.html?idxno=25726'), (2, 1, '톱스타뉴스', '2022-08-05', '"부부의 세계" 김희애, 드라마 남편과 실제 남편 이찬진의 오버랩횡령 혐의 논란', 'https://www.topstarnews.net/news/articleView.html?idxno=773836'),