전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

개발

이미지가 포함된 게시글 관련 API 설계

2023. 5. 25. 19:12

서론

과거에 '맞춤 케이크 중개 플랫폼' 프로젝트를 진행했을 때는 아래와 같이 게시글 관련 API 에 이미지 처리를 결합하여 구현하였다. 즉, 게시글 생성, 삭제, 조회하는 API 안에서 연관된 이미지도 함께 처리해줬다는 의미이다. (아래의 코드에서 Order 를 게시글이라고 생각하면 된다.)

@Component
@RequiredArgsConstructor
public class OrderFacade {

	private final OrderService orderService;
	private final ImageService imageService;

	@Transactional
	public Long createOrder(OrderCreateRequest orderCreateRequest) {
		Long orderId = orderService.createOrder(orderCreateRequest);

		orderCreateRequest.cakeImages()
				.forEach(cakeImage -> imageService.createAndUploadImage(cakeImage, ORDER_IMAGE_SUB_PATH, orderId, ORDER));
	
 	   return orderId;
	}
}

 

이번에 새롭게' 야구장 좌석 후기 서비스' 프로젝트를 진행하면서 게시판 API 방식을 수정해보려고 한다.

 

수정 사항

1. 게시글 관련 API 와 이미지 처리 로직이 결합되어 있는 것을 분리한다.

  • 이미지는 게시글에서만 쓰이는 것이 아니다. 댓글, 경기장, 회원 등 여러가지 도메인에서 첨부될 수 있다. 그런데, 이렇게 게시글 관련 API 와 이미지 처리 로직이 결합되어 있으면 이미지 처리 로직이 계속 중복되게 된다. 예를 들자면, 게시글 생성 API 에도, 댓글 생성 API 에도 똑같은 이미지 처리 로직이 중복될 것이다.
  • 유지보수에 있어서도 좋지 않다. 이미지 관련 변경 사항이 생겨도 게시글 API 를 변경해줘야한다.
  • 이와 관련된 자세한 내용은 https://jun-codinghistory.tistory.com/754 를 참고하자.

2. 게시판 내에서 이미지의 위치를 식별할 수 있도록 한다.

  • 이전 프로젝트 '맞춤 케이크 중개 플랫폼' 프로젝트는 일반적인 게시판과는 달리 게시글 내부에서 이미지의 순서가 필요하지 않았다. 아래 화면처럼 케이크 이미지를 위한 공간이 따로 있었기 때문이다. 이번 '야구장 좌석 후기 서비스' 는 이전과는 다르다. 티스토리 블로그처럼 게시글 내에서 이미지의 위치를 식별할 수 있어야한다.

 

해결 과정

각각의 수정사항을 어떻게 해결했는지 알아보자.

1. 게시글 관련 API 와 이미지 처리 로직이 결합되어 있는 것을 분리한다. -> 이미지 관련 API 를 만들어 분리한다.

  • 이 경우 어떻게 동작하는 것이냐면, 사용자가 게시글 작성 에디터 내에서 이미지를 첨부했을 때 이미지 생성 API 가 호출되는 것이다.
  • 근데 문제가 있다. 연관된 게시글 id 를 이미지와 매핑해주어야하는데 현 시점에서는 게시글이 발행되지 않았으므로 게시글 id 가 없다. 게시글은 사용자가 게시글 발행 버튼을 눌러 게시글 생성 API 를 호출해야 생성되기 때문이다. (auto_increment 를 사용하여서 게시글이 저장되어야 id 가 생긴다.) 
  • 임시 게시글을 생성하는 방식으로 해결하였다. 기존에 게시글 생성 API 하나로 게시글을 생성했다면, 임시 게시글 생성 API + 게시글 발행 API 방식으로 바꾼 것이다. 우리가 평소에 게시글을 작성할 때의 프로세스를 생각해보자. 게시글 작성 버튼을 눌러서 게시글을 작성하는 에디터로 이동하고, 다 작성하였으면 게시글을 발행하는 버튼을 눌러 저장한다. 이 프로세스 중 사용자가 맨 처음 게시글 작성 버튼을 눌렀을 때, 제목과 내용이 null 인 임시 게시글을 만들어서 id 를 반환하도록 한다. 그러면, 게시글 작성 에디터 내부에서 이미지 API 를 호출 할 수 있고, 사용자가 게시글 발행 버튼을 눌렀을 때, 에디터에서 작성된 내용들을 바탕으로 게시글 발행 API 를 호출하는 것이다.
  • 이렇게 임시 게시글을 중간에 두는 방식은 장단점이 있다.
    • 일단 장점부터 보자면, 임시 게시글의 존재로 인해 추후에 다양한 기능을 제공할 수 있다. 예를 들면, 자동 임시 저장 기능이나 작성 중이었던 글 불러오기 등이 있다.
    • 단점은 사용자가 게시글을 작성하다가 뒤로가기를 둘러서 발행을 안하면 어떻게 처리할 것인가? 이미지의 경우도 그렇다. 게시글에 첨부를 했는데 뒤로가기를 해서 게시글이 발행이 안되었으면 그 이미지는 발행은 안되었지만 이미지 서버에는 올라가서 용량을 차지하게 된다.
    • 이 문제는 주기적으로 배치 처리로 삭제를 해주면 될 것 같다. 임시 게시글은 제목과 내용이 null 이다. 이것을 바탕으로 주기적으로 게시글 제목과 내용이 null 인 게시글과 그와 연관된 이미지를 제거해주면 된다.

2. 게시판 내에서 이미지의 위치를 식별할 수 있도록 한다. -> 게시글 내용으로 html 을 저장한다.

  • 티스토리 게시글의 방식과 깃허브 이슈의 방식에서 해결의 힌트를 얻었다. 티스토리의 경우 이미지를 첨부하면 게시글 에디터 내에서 이미지 링크가 생긴다. 깃허브도 마찬가지다. 아래의 그림은 깃허브 이슈에 이미지를 올렸을 때 생기는 태그이다.

  • 아래와 같은 프로세스 진행하도록 하여 게시글에서 이미지 위치를 식별할 수 있도록 하였다.
    1. 사용자가 게시글 작성 중 이미지를 첨부하면 서버로 이미지 생성 API 를 호출
    2. 서버에서 이미지를 저장하고 이미지 경로를 프론트에 반환
    3. 프론트에서 <img src="이미지 경로"> 형식으로 처리하여 사용자 커서 위치에 태그를 추가
    4. 작성된 게시글 내용 html 을 하나의 문자열로 서버에 저장
저작자표시 (새창열림)

'개발' 카테고리의 다른 글

AWS EC2 메모리 부족을 스왑 메모리로 해결하기  (2) 2023.06.12
Github actions, Docker image, Docker hub 를 활용한 CI/CD 과정  (0) 2023.06.01
한 번의 API 콜로 가져오기 vs API 콜을 여러 번 하기  (0) 2023.05.10
Docker 에서 /docker-entrypoint-initdb.d 를 통한 초기화 시 인코딩 오류 문제 해결법  (1) 2023.05.01
docker-compose 로 개발 환경의 DB 구축하기  (0) 2023.04.22
    '개발' 카테고리의 다른 글
    • AWS EC2 메모리 부족을 스왑 메모리로 해결하기
    • Github actions, Docker image, Docker hub 를 활용한 CI/CD 과정
    • 한 번의 API 콜로 가져오기 vs API 콜을 여러 번 하기
    • Docker 에서 /docker-entrypoint-initdb.d 를 통한 초기화 시 인코딩 오류 문제 해결법
    모달조아
    모달조아

    티스토리툴바