일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 완탐
- 알고리즘
- 기본유형
- 다익스트라
- JUnit
- JPA
- database
- 코딩테스트실력진단
- Spring
- 완전탐색
- 알고리즘기본개념
- 그래프
- 그리디
- 유니온파인드
- 백준
- Java
- 다시보기
- 트러블슈팅
- 코드트리
- DP
- 자바
- 부분수열의합2
- SWEA
- 코테
- 코딩테스트
- BFS
- DFS
- Union Find
- 싸피
- SSAFY
- Today
- Total
HwangHub
게시글 body(문자열)에 이미지 태그 내용 제거하여 반환하기 본문
문제 상황
게시판에 단순 접근하거나 게시글 검색을 한 결과에서는 body 내용이 간소화되어서 제공되어야 한다.
문제는, 우리 게시글들은 DB 속 게시글 테이블의 body 칼럼에 html이 들어간다는 거다. 이걸 단일 게시글 조회할때엔 프론트에서 문서화해서 보여주지만, 게시글 목록에서는 body 내용을 하나하나 모두 보여주지 않고 간소화시켜서 제공해주므로, 본문 내 이미지들을 요약문에서 보여주기엔 적절하지 않다.
따라서 이를 처리해줘야 한다.
AS-IS
아래는 게시글 목록 dto 생성자이다. 저기에 있는 저 body에 들어가는 문자열을 처리해줘야 한다.
public PostSimpleData(...) {
this.postId = postId;
this.authorId = authorId;
this.mainCategory = mainCategory;
this.subCategory = subCategory;
this.authorName = authorName;
this.authorProfileImageUrl = authorProfileImageUrl;
this.title = title;
this.body = body;
this.thumbnailUrl = thumbnailUrl;
this.createdDate = createdDate;
}
예를 들면 이런 식이다.
<p>썸넬 전 내용</p><p><img src="https://store.blahblah.com/thumbnail.jpg"></p><p>썸넬 후 내용</p><p><img src="https://store.blahblah.com/image2.jpg"></p>
위 내용에 있는 내용 중 img 태그에 대한 내용을 지워줘야 한다.
TO-BE
이를 반영하기 위해 아래와 같은 메서드를 dto 에 선언해 줬다.
private String removeImageTag(String imageIncluded) {
String imageExcluded = imageIncluded.replaceAll("<p><img\\s.*?></p>", "");
return imageExcluded; // <p>썸넬 전 내용</p><p>썸넬 후 내용</p>
}
이렇게 해주면 위와 같이 img 태그 주변의 p 태그까지 전부 제거할 수 있다. 여기서 .replaceAll()
메서드의 첫 번째 parameter에는 img 태그의 형식을 정규표현식으로 지정하여 해당 문자열의 모든 이미지 태그를 제거하고자 하고 있다. 저기서 \s
는 공백을 의미한다.
위 정규표현식을 해석하면 다음과 같다 :
"<p><img
로 시작하는 문자열이면서 바로 공백이 따라오고, 어떠한 문자가 0번 이상 반복될 수 있고(하지만 최소한의 개수로 일치하는 문자), 그리고 나서는 ></p>
로 끝나는 문자열까지를 빈칸으로 대체한다."
.*
가 의미하는 것이 "어떠한 문자가 0번 이상 반복될 수 있다"이고, ?
가 "가장 적은 개수로 일치하는 것을 찾는다"는 정규표현식이다. img 태그가 여러개일 경우 한번에 뭉뚱그려서 정규표현식에 의해 검열될 수 있으므로, 이 효과를 구현하기 위해서는 이와 같이 ?
처리를 반드시 해줘야 한다.
레슨런
(나만 몰랐던 것 같다는 느낌이 들지만) 문자열의 .replace()
메서드의 첫 번째 parameter에 정규표현식을 넣는 개념이란걸 전혀 알고 있지 않았다. 지금껏 단순히 바꿔치기할 문자열을 똑같이 넣어줘서 사용해 왔는데, 이번에 또 하나 큰 배움을 얻게 되었다.
'workspace > 아티클' 카테고리의 다른 글
maven project에서 datasource url의 localhost를 인식하지 못하는 이슈 (0) | 2024.01.12 |
---|---|
pom.xml의 xmlns는 뭘까요? (0) | 2024.01.12 |
LocalDateTime 형식 파싱 (ofPattern & ofLocalizedDate) (1) | 2024.01.09 |
@NotNull, @NotEmpty, @NotBlank 중 뭘 쓸까 (1) | 2024.01.09 |
Redis with Spring 기본 라이브러리 정리 (1) | 2024.01.07 |