이미지 통신이 정리가 안되어 부탁드립니다.

조회수 2889회

안녕하세요. HTTP기반 통신에선 이미지 통신을 할때 Base64 인코딩/디코딩 과정을 거친다는 것만 막연히 알고 있는데요. 전에도 물어봤는데 서버에다 파일로 저장한다고 하더라구요.

생각해보니 (송신과정) 클라이언트단에서 Base64인코딩 -> 서버로 전송 -> 서버에서 파일입출력 API를 이용해 해당 Base64로 인코딩된 문자열을 파일로 저장 이때 보안을 위해 여러 종류의 확장자를 임의로 약속하여 섞어 씀.

(수신과정) 서버단에서 해당 이미지 파일을 찾아 파일입출력API를 이용해 파일을 문자열로 변환 -> HTTP통신으로 클라이언트단에 전송 -> 클라이언트단에서 해당 문자열을 Base64 디코딩 시행

이러면 되나요? 그리고 작은 크기의 이미지는 그냥 DB row에 쑤셔넣어도 되나요? 마지막으로 Base64인코딩 과정을 거치면 500KB 크키의 이미지가 2MB 정도로 용량이 약 4배 이상 늘어난다고 하는데 이거 감수하고 쓰나요?

감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 이미지와 같은 바이너리 파일을 업로드/다운로드할 때, base64를 사용하지 않고도 해결할 수 있습니다.

    클라이언트 송신(업로드 요청)시에는 요청 형식을 multipart(링크1:RFC1341,링크2:RFC2388) 형식으로 하면됩니다.

    이 경우, 전송되는 데이터의 크기는 파일의 원형 + HTTP 헤더(오버헤드)인데, 파일이 너무 작은 경우는 오버헤드가 상당히 크게 느껴질 수도 있습니다.

    반대로, 클라이언트 수신(다운로드)시에는 Content-Type의 mime-type의 앞부분 (xxx/yyy에서 xxx, 예: text/plain, image/jpeg...)만 정확히 구분해준다면, Base64 인코딩 없이 데이터를 전송할 수 있습니다.

    물론, 위 두 경우 모두, 서버와 클라이언트 상호간에 HTTP 프로토콜 규격을 잘 지킬 경우에만 가능합니다.

    데이터의 저장은 통상 서버에 파일로 하는 것이 DB에 저장하는 것보다 성능상 이점이 많아서 그렇습니다. 기술적으로는 DB에 저장하여도 관계없습니다. DB에 꼭 저장해야만 하는 이유가 있다면, 그렇게 하면 됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)