안드로이드로 앱 개발을 진행 중인데 PC에서는 C#로 구성된 프로그램에서 DB에 접근한다.

PC에서 이미지 파일을 MS SQL Sever에 binary로 변환하여 업로드하는데, 그걸 안드로이드 앱에서 받아 이미지를 구현하는데 많은 애를 먹어서 작성해본다.

 

이전에 존재했던 DB - APP 정보 송수신은 다음과 같았다.

 

1. Ms SQL Server에 Apache Http Server 설치 ( 고정 IP 설정 )

2. SQL Server와 Apache Http Server간은 JDBC로 통신

3. Apache http Server는 JSP를 통해 XML 서식으로 송신

4. App에서는 XMLparser와 POST 방식을 이용하여 수신

 

일단 문제를 일으키던 XML 형태를 JSON 형태로 바꿔 개발하기 시작했다. 데이터를 잘 받아오던 와중에 binary(max)로 변환된 이미지를 JSON이 제대로 가져오지 못하면서 문제가 생기기 시작했다. 이유인즉슨 binary 값을 받아오기 위해서는 byte[] 형태로 가져와야 하나, JSP에서 출력할 때 이미 toString()으로 변환되어버리기 때문이었다.

 

이미 변환된 String을 byte[]로 바꾸기 위해 App에서 여러가지 시도를 했으나 전부 실패했고, JSP 상에서 Base64를 이용하여 encode하려던 것도 Import를 못 잡아서 시행하지 못했다. 한참 헤매던 끝에, SQL Server에서 query를 작성했을 때, Select 되는 결과를 Base64로 변환하여 올라오도록 수정하였다.

 

SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column(\"컬럼이름\")))', 'VARCHAR(MAX)') 컬럼이름 FROM 테이블이름

 

그리고 난 후 App 상에서 Base64 변환을 거쳐 ImageView에 setImageBetmap()을 하니 잘 올라갔다. 도식은 다음과 같다.

 

  String checkImage = array.getJSONObject(i).getString("컬럼이름"); //받아온 String 데이터
  byte[] encodeByte = Base64.decode(checkImage, Base64.DEFAULT);
  Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
  bitmap = Bitmap.createScaledBitmap(bitmap,  600 ,600, true); // 크기변환
  imageView.setImageBitmap(bitmap);

 

아마 JSP에서 base64를 이용하여 JSON에 변환된 결과값을 담는 방법도 있을 것이다. JSP에 익숙하지 않아도 Server단에서 base64로 변환하는 방법도 있다는걸 정리하고 싶었다.

+ Recent posts