신입 Spring 이미지 업로드 API 설계

hunseop song·2023년 5월 25일
0

신입 기록

목록 보기
4/4

✔ 이미지 업로드 API (ServiceImpl)

  • 기본 틀 (이미지가 없는 경우)
@Override
public JsonElement uploadImageImageVO image) {
  StopWatch watch = getStopWatch();
  MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();

  try {
    if (image.getImage() == null) {
      return JsonParser.parseString(new Gson().toJson(new ResponseWithMessageVO(ApiCommonCode.ILLEGAL_PARAMETER, "이미지는 필수 항목입니다.")));
    }
  • 파일 형식 지정해주기 (조건)
// 업로드된 이미지 파일 가져오기
MultipartFile uploadedImage = image.getImage();

// 파일 형식 확인 (jpg와 png만 허용)
String originalFilename = uploadedImage.getOriginalFilename();
if (!originalFilename.toLowerCase().endsWith(".jpg") && !originalFilename.toLowerCase().endsWith(".png")) {
  return JsonParser.parseString(new Gson().toJson(new ResponseWithMessageVO(ApiCommonCode.INVALID_IMAGE_FORMAT_EXCEPTION, "이미지 형식이 올바르지 않습니다. JPG와 PNG 형식만 지원됩니다.")));
}
  • 파일 크기 지정해주기(조건)
// 파일 크기 확인 (최대 500KB)
long fileSize = uploadedImage.getSize();
long maxSizeInBytes = 500 * 1024; // 500KB
if (fileSize > maxSizeInBytes) {
  return JsonParser.parseString(new Gson().toJson(new ResponseWithMessageVO(ApiCommonCode.INVALID_IMAGE_LENGHT_EXCEPTION, "이미지 크기가 허용된 제한을 초과합니다. 최대 크기는 500KB입니다.")));
}
  • 이미지 크기 확인 (조건) px, 비율
  // 이미지 크기 확인 (가로: 108px 이상, 가로:세로 비율 1:1)
  BufferedImage bufferedImage = ImageIO.read(uploadedImage.getInputStream());
  int width = bufferedImage.getWidth();
  int height = bufferedImage.getHeight();

  if (width < 108 || width != height) {
    return JsonParser.parseString(new Gson().toJson(new ResponseWithMessageVO(ApiCommonCode.INVALID_IMAGE_SIZE_EXCEPTION, "이미지 크기가 올바르지 않습니다. 가로는 108px 이상이어야 하며, 가로:세로 비율은 1:1이어야 합니다.")));
  }

  params.add("image", convertFileToByteArrayResource(uploadedImage));
} catch (NullPointerException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
  • 저장 부분
String url = uploadUrl + "/image/alimtalk/itemHighlight";
  log.info(REQUEST_LOG_FORMAT, url);
  ResponseEntity<String> response = restTemplate.postForEntity(url, getDefaultHttpEntity(params), String.class);
  String body = response.getBody();
  watch.stop();
  log.info(POST_RESPONSE_LOG_FORMAT, url, params, body, watch.getTotalTimeMillis());

    return JsonParser.parseString(response.getBody());
}

log.info(REQUEST_LOG_FORMAT, url);: 이 줄은 요청 URL을 나타내는 정보 메시지를 기록합니다.
'REQUEST_LOG_FORMAT'은 URL을 포함하는 로그 형식의 자리 표시자입니다.
log.info(POST_RESPONSE_LOG_FORMAT, url, params, body, watch.getTotalTimeMillis());: 이 행은
요청 URL, 요청 매개변수(params), 응답 본문(body)을 포함하는 정보 메시지를 기록합니다. , 작업에 소요된 총 시간입니다.

✔ 이미지 업로드 컨트롤러 부분

@RestController
@RequestMapping(value = "api/v1/image", produce ={ MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE})
public class ImageController{
    private ImageService imageservice;

    @Autowired
    @Qualifier("imageServiceImpl")
    public void setImageService(ImageService imageService){
        this.imageService = imageService;

     @PostMapping("/itemHighlight")
     public String uploadImageAlimtalkItemHighlight(ImageVO image, BindingResult bind){
     if(bind.hasErrors()){
     throw BindingException.make(bind);
     }
     return imageService.uploadImageAlimtalkItemHighlight(imageVO).toString();
     }
    }
}

✔ 응답 코드와 공통 응답 객체

// 공통 응답 객체

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class ResponseVO{
    //응답코드
    protected String code;

    @Override
    public String toString() {
        return new Gson().toJson(this)
    }
}



// 공통 응답 객체
@Getter
public class ResponseWithMessageVO extends ResponseVO{
    //응답코드
    private String message;

    public ResponseWithMessageVO(String code, String message){
    super(code);
    this.message = message;
    }

    @Override
    public String toString(){
        return new Gson().toJson(this);
    }
profile
신입개발자 메모장

0개의 댓글