백엔드/스프링+boot

MAIL로 첨부파일 JPG를 보내는 과정에서의 문제들

임지혁코딩 2024. 5. 16. 20:27

먼저, 로직을 설명하고자 한다

 

상품 구매 (MEMBER) -> 구매완료 상태로 변경, 검증 (PRODUCT) -> 검증 이후, MEMBER에서 MEMBER의 정보 변경-> 그 이후! 카카오로 로그인 한 대상이 아닌 경우 Mail을 전송한다.

 

이 'MAIL로 판매자가 GCP에 등록했던 URL의 파일을 첨부파일로 구매자에게 보내는 과정'에서 배운 점들을 정리하고자 한다. 

 

가장 문제가 많이 생긴 부분 .

 

MULTIFILEEXCPETION이 가장 큰 문제가 되었다. 

이를 해결위해 CTRL+ENTER(내가 가장 주로 사용하는 방법이다), 그리고 웹을 열심히 활용했다.

 

URL url = new URL(productRepository.findImageRealByProductId(paymentsReqList.get(i).getProduct_id()));
->이를 InputStreamResource로 변경하여 attachment에 추가하는 형태

 

와 같이 구현하였고, 문제가 계속해서 발생하였다.

 

해결한 방법

 

가장 먼저, URL을 통해 해당 PRODUCT 내부에 있는 정보의 URL을 받아온다.

해당 URL의 정보를 BYTE배열로 변경한다.

그 이후 해당 BYTEARRAYRESOURCE를 dataSource라는 객체에 넣는다.

이 datasource객체의 정보를, mimemessagehelper라는 객체를 통해 메일의 첨부파일에 넣는다!

 

배운 것

 

URL: 해당 정보는 String과 같이 표현되지만, url이라는 것을 명확하게 전달하는 객체이다. 

byte[] -> toByteArray : 

URLCONNECITON을 통해 URL을 열고, 해당 정보를 바이트 배열로 변환하여준다.

이전, MYSQL에 직접 IMAGE를 BLOB으로 넣는 테스트를 했었는데, 이때도 이미지 파일을 이와 같은 형태로 변경하여 저장하였다. 

 

Datasource:

DataSource dataSource = new ByteArrayDataSource(imageData, "image/jpeg");

 

인터페이스이다. 인터페이스는 모델 간의 추상층을 분리한 역할을 한다는 개념을 기억하자.

 

addAttachment

mimeMessageHelper.addAttachment("darakbang.jpg", dataSource);

 

바로 이곳에서, datasource interface가 인스턴스화 된 객체를 활용한다.

 

즉, addattachment가 지원하는 인자를 위해 datasource를 활용했다.
그 datasource를 위해서 byte 배열로 url을 열어, 해당 이미지를 저장했다.