Skip to content

Commit e7c4aca

Browse files
authored
fix: 뉴스 이미지 화질 문제 해결 (#318)
1 parent cdecac0 commit e7c4aca

File tree

9 files changed

+126
-76
lines changed

9 files changed

+126
-76
lines changed

src/main/java/org/myteam/server/comment/service/CommentService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.List;
44
import java.util.UUID;
5-
65
import lombok.RequiredArgsConstructor;
76
import lombok.extern.slf4j.Slf4j;
87
import org.myteam.server.comment.domain.Comment;
@@ -17,9 +16,9 @@
1716
import org.myteam.server.common.filter.util.BadWordFilter;
1817
import org.myteam.server.global.exception.ErrorCode;
1918
import org.myteam.server.global.exception.PlayHiveException;
20-
import org.myteam.server.global.util.redis.service.RedisCountService;
19+
import org.myteam.server.global.util.media.MediaUtils;
2120
import org.myteam.server.global.util.redis.ServiceType;
22-
import org.myteam.server.global.util.upload.MediaUtils;
21+
import org.myteam.server.global.util.redis.service.RedisCountService;
2322
import org.myteam.server.member.entity.Member;
2423
import org.myteam.server.member.repository.MemberJpaRepository;
2524
import org.myteam.server.member.service.SecurityReadService;

src/main/java/org/myteam/server/global/util/upload/MediaUtils.java renamed to src/main/java/org/myteam/server/global/util/media/MediaUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.myteam.server.global.util.upload;
1+
package org.myteam.server.global.util.media;
22

33
import org.myteam.server.global.exception.ErrorCode;
44
import org.myteam.server.global.exception.PlayHiveException;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.myteam.server.global.util.media;
2+
3+
import java.net.URLDecoder;
4+
import java.nio.charset.StandardCharsets;
5+
import org.myteam.server.global.domain.Category;
6+
7+
/**
8+
* 크롤링 된 뉴스 이미지 썸네일 url을 디코딩
9+
*/
10+
public class ThumbnailUrlUtils {
11+
12+
public static String extractCleanThumbImg(String thumbImg, Category category) {
13+
if (thumbImg == null || category == null) {
14+
return thumbImg;
15+
}
16+
17+
// BASEBALL, FOOTBALL만 디코딩 대상
18+
if (category == Category.BASEBALL || category == Category.FOOTBALL) {
19+
20+
// dthumb URL 안에 src 파라미터가 있는 경우만 추출
21+
if (thumbImg.contains("src=")) {
22+
try {
23+
// src=...& 이전까지만 추출
24+
String encodedSrc = thumbImg.split("src=")[1].split("&")[0];
25+
return URLDecoder.decode(encodedSrc, StandardCharsets.UTF_8)
26+
.replace("\"", "");
27+
} catch (Exception e) {
28+
return thumbImg; // 실패 시 원본 그대로
29+
}
30+
}
31+
32+
// src 파라미터 없으면 원본 그대로
33+
return thumbImg;
34+
}
35+
36+
// BASEBALL, FOOTBALL이 아닌 경우 → ? 뒤 제거
37+
int questionMarkIndex = thumbImg.indexOf('?');
38+
if (questionMarkIndex != -1) {
39+
return thumbImg.substring(0, questionMarkIndex);
40+
}
41+
42+
return thumbImg;
43+
}
44+
}

src/main/java/org/myteam/server/improvement/service/ImprovementService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
import org.myteam.server.comment.service.CommentService;
77
import org.myteam.server.global.exception.ErrorCode;
88
import org.myteam.server.global.exception.PlayHiveException;
9+
import org.myteam.server.global.util.media.MediaUtils;
910
import org.myteam.server.global.util.redis.CommonCountDto;
10-
import org.myteam.server.global.util.redis.service.RedisCountService;
1111
import org.myteam.server.global.util.redis.ServiceType;
12-
import org.myteam.server.global.util.upload.MediaUtils;
12+
import org.myteam.server.global.util.redis.service.RedisCountService;
1313
import org.myteam.server.improvement.domain.Improvement;
1414
import org.myteam.server.improvement.domain.ImprovementCount;
1515
import org.myteam.server.improvement.domain.ImprovementStatus;
Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,56 @@
11
package org.myteam.server.news.news.dto.repository;
22

3-
import java.time.LocalDateTime;
3+
import static org.myteam.server.global.util.media.ThumbnailUrlUtils.extractCleanThumbImg;
44

55
import com.fasterxml.jackson.annotation.JsonInclude;
6-
import lombok.Setter;
7-
import org.myteam.server.board.dto.reponse.CommentSearchDto;
8-
import org.myteam.server.global.domain.Category;
9-
106
import io.swagger.v3.oas.annotations.media.Schema;
7+
import java.time.LocalDateTime;
118
import lombok.Getter;
129
import lombok.NoArgsConstructor;
10+
import lombok.Setter;
11+
import org.myteam.server.board.dto.reponse.CommentSearchDto;
12+
import org.myteam.server.global.domain.Category;
1313

1414
@Getter
1515
@NoArgsConstructor
1616
public class NewsDto {
1717

18-
@Schema(description = "뉴스 ID")
19-
private Long id;
20-
@Schema(description = "뉴스 카테고리")
21-
private Category category;
22-
@Schema(description = "뉴스 제목")
23-
private String title;
24-
@Schema(description = "뉴스 썸네일 이미지")
25-
private String thumbImg;
26-
@Schema(description = "뉴스 본문")
27-
private String content;
28-
@Schema(description = "뉴스 댓글 수")
29-
private int commentCount;
30-
@Schema(description = "뉴스 계시 날짜")
31-
private LocalDateTime postDate;
32-
@Schema(description = "댓글 검색 시 최상단 댓글 데이터")
33-
private NewsCommentSearchDto newsCommentSearchDto;
34-
@Schema(description = "Hot 계시물 여부")
35-
private boolean isHot;
36-
37-
@Setter
38-
@JsonInclude(JsonInclude.Include.NON_EMPTY)
39-
private CommentSearchDto commentSearchList;
40-
41-
public NewsDto(Long id, Category category, String title, String thumbImg, String content, int commentCount, LocalDateTime postDate, boolean isHot) {
42-
this.id = id;
43-
this.category = category;
44-
this.title = title;
45-
this.thumbImg = thumbImg;
46-
this.content = content;
47-
this.commentCount = commentCount;
48-
this.postDate = postDate;
49-
this.isHot = isHot;
50-
}
51-
52-
public void updateNewsCommentSearchDto(NewsCommentSearchDto newsCommentSearchDto){
53-
this.newsCommentSearchDto = newsCommentSearchDto;
54-
}
18+
@Schema(description = "뉴스 ID")
19+
private Long id;
20+
@Schema(description = "뉴스 카테고리")
21+
private Category category;
22+
@Schema(description = "뉴스 제목")
23+
private String title;
24+
@Schema(description = "뉴스 썸네일 이미지")
25+
private String thumbImg;
26+
@Schema(description = "뉴스 본문")
27+
private String content;
28+
@Schema(description = "뉴스 댓글 수")
29+
private int commentCount;
30+
@Schema(description = "뉴스 계시 날짜")
31+
private LocalDateTime postDate;
32+
@Schema(description = "댓글 검색 시 최상단 댓글 데이터")
33+
private NewsCommentSearchDto newsCommentSearchDto;
34+
@Schema(description = "Hot 계시물 여부")
35+
private boolean isHot;
36+
37+
@Setter
38+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
39+
private CommentSearchDto commentSearchList;
40+
41+
public NewsDto(Long id, Category category, String title, String thumbImg, String content, int commentCount,
42+
LocalDateTime postDate, boolean isHot) {
43+
this.id = id;
44+
this.category = category;
45+
this.title = title;
46+
this.thumbImg = extractCleanThumbImg(thumbImg, category);
47+
this.content = content;
48+
this.commentCount = commentCount;
49+
this.postDate = postDate;
50+
this.isHot = isHot;
51+
}
52+
53+
public void updateNewsCommentSearchDto(NewsCommentSearchDto newsCommentSearchDto) {
54+
this.newsCommentSearchDto = newsCommentSearchDto;
55+
}
5556
}

src/main/java/org/myteam/server/news/news/dto/service/response/NewsResponse.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.myteam.server.news.news.dto.service.response;
22

3+
import static org.myteam.server.global.util.media.ThumbnailUrlUtils.extractCleanThumbImg;
4+
35
import io.swagger.v3.oas.annotations.media.Schema;
46
import java.time.LocalDateTime;
57
import lombok.Builder;
@@ -61,11 +63,12 @@ public NewsResponse(Long id, Category category, String title, String thumbImg, C
6163

6264
public static NewsResponse createResponse(News news, boolean isRecommend, Long previousId,
6365
Long nextId, CommonCountDto commonCountDto) {
66+
6467
return NewsResponse.builder()
6568
.id(news.getId())
6669
.category(news.getCategory())
6770
.title(news.getTitle())
68-
.thumbImg(news.getThumbImg())
71+
.thumbImg(extractCleanThumbImg(news.getThumbImg(), news.getCategory()))
6972
.postDate(news.getPostDate())
7073
.commonCountDto(commonCountDto)
7174
.isRecommend(isRecommend)

src/main/java/org/myteam/server/notice/service/NoticeService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import org.myteam.server.comment.service.CommentService;
88
import org.myteam.server.global.exception.ErrorCode;
99
import org.myteam.server.global.exception.PlayHiveException;
10+
import org.myteam.server.global.util.media.MediaUtils;
1011
import org.myteam.server.global.util.redis.CommonCountDto;
1112
import org.myteam.server.global.util.redis.ServiceType;
1213
import org.myteam.server.global.util.redis.service.RedisCountService;
13-
import org.myteam.server.global.util.upload.MediaUtils;
1414
import org.myteam.server.member.entity.Member;
1515
import org.myteam.server.member.service.SecurityReadService;
1616
import org.myteam.server.notice.domain.Notice;

src/test/java/org/myteam/server/comment/service/CommentDeleteServiceTest.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,43 @@
11
package org.myteam.server.comment.service;
22

3+
import static org.assertj.core.api.Assertions.assertThatCode;
4+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5+
import static org.mockito.Mockito.any;
6+
import static org.mockito.Mockito.mockStatic;
7+
import static org.mockito.Mockito.never;
8+
import static org.mockito.Mockito.verify;
9+
import static org.mockito.Mockito.when;
10+
11+
import java.time.LocalDateTime;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.UUID;
315
import org.junit.jupiter.api.BeforeEach;
416
import org.junit.jupiter.api.DisplayName;
517
import org.junit.jupiter.api.Test;
618
import org.mockito.MockedStatic;
7-
import org.myteam.server.support.IntegrationTestSupport;
819
import org.myteam.server.board.domain.Board;
920
import org.myteam.server.board.domain.CategoryType;
1021
import org.myteam.server.comment.domain.Comment;
1122
import org.myteam.server.comment.domain.CommentType;
12-
import org.myteam.server.comment.dto.request.CommentRequest.*;
23+
import org.myteam.server.comment.dto.request.CommentRequest.CommentDeleteRequest;
1324
import org.myteam.server.global.domain.Category;
1425
import org.myteam.server.global.exception.ErrorCode;
1526
import org.myteam.server.global.exception.PlayHiveException;
27+
import org.myteam.server.global.util.media.MediaUtils;
1628
import org.myteam.server.global.util.redis.CommonCountDto;
1729
import org.myteam.server.global.util.redis.ServiceType;
18-
import org.myteam.server.global.util.upload.MediaUtils;
1930
import org.myteam.server.match.match.domain.Match;
2031
import org.myteam.server.match.match.domain.MatchCategory;
2132
import org.myteam.server.match.team.domain.Team;
2233
import org.myteam.server.match.team.domain.TeamCategory;
2334
import org.myteam.server.member.entity.Member;
2435
import org.myteam.server.report.domain.DomainType;
36+
import org.myteam.server.support.IntegrationTestSupport;
2537
import org.springframework.beans.factory.annotation.Autowired;
2638
import org.springframework.transaction.annotation.Transactional;
2739

28-
import java.time.LocalDateTime;
29-
import java.util.ArrayList;
30-
import java.util.List;
31-
import java.util.UUID;
32-
33-
import static org.assertj.core.api.Assertions.*;
34-
35-
import static org.mockito.Mockito.*;
36-
37-
class CommentDeleteServiceTest extends IntegrationTestSupport {
40+
class CommentDeleteServiceTest extends IntegrationTestSupport {
3841

3942
@Autowired
4043
private CommentService commentService;

src/test/java/org/myteam/server/improvement/service/ImprovementUpdateServiceTest.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,32 @@
11
package org.myteam.server.improvement.service;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.mockito.Mockito.mockStatic;
6+
import static org.mockito.Mockito.verify;
7+
import static org.mockito.Mockito.when;
8+
9+
import java.util.UUID;
310
import org.junit.jupiter.api.BeforeEach;
411
import org.junit.jupiter.api.DisplayName;
512
import org.junit.jupiter.api.Test;
613
import org.mockito.MockedStatic;
7-
import org.myteam.server.support.IntegrationTestSupport;
814
import org.myteam.server.global.exception.ErrorCode;
915
import org.myteam.server.global.exception.PlayHiveException;
16+
import org.myteam.server.global.util.media.MediaUtils;
1017
import org.myteam.server.global.util.redis.CommonCountDto;
1118
import org.myteam.server.global.util.redis.ServiceType;
12-
import org.myteam.server.global.util.upload.MediaUtils;
1319
import org.myteam.server.improvement.domain.Improvement;
1420
import org.myteam.server.improvement.domain.ImprovementStatus;
15-
import org.myteam.server.improvement.dto.request.ImprovementRequest.*;
16-
import org.myteam.server.improvement.dto.response.ImprovementResponse.*;
21+
import org.myteam.server.improvement.dto.request.ImprovementRequest.ImprovementSaveRequest;
22+
import org.myteam.server.improvement.dto.response.ImprovementResponse.ImprovementSaveResponse;
1723
import org.myteam.server.member.entity.Member;
1824
import org.myteam.server.report.domain.DomainType;
25+
import org.myteam.server.support.IntegrationTestSupport;
1926
import org.springframework.beans.factory.annotation.Autowired;
2027
import org.springframework.boot.test.mock.mockito.MockBean;
2128
import org.springframework.transaction.annotation.Transactional;
2229

23-
import java.util.UUID;
24-
25-
import static org.assertj.core.api.Assertions.assertThat;
26-
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
27-
import static org.junit.jupiter.api.Assertions.assertEquals;
28-
import static org.junit.jupiter.api.Assertions.assertThrows;
29-
import static org.mockito.Mockito.*;
30-
3130
class ImprovementUpdateServiceTest extends IntegrationTestSupport {
3231

3332
@Autowired
@@ -121,7 +120,8 @@ void updateImprovement_image_changed() {
121120
);
122121

123122
try (MockedStatic<MediaUtils> utilities = mockStatic(MediaUtils.class)) {
124-
utilities.when(() -> MediaUtils.verifyImageUrlAndRequestImageUrl(improvement.getImgUrl(), request.getImgUrl()))
123+
utilities.when(
124+
() -> MediaUtils.verifyImageUrlAndRequestImageUrl(improvement.getImgUrl(), request.getImgUrl()))
125125
.thenReturn(true);
126126

127127
// when

0 commit comments

Comments
 (0)