이번포스팅은 이미지 파일을 통째로 DB의 BLOB형식의 컬럼에 등록을 해보는 방법과
DB에 저장된 BLOB 형식의 데이터를 이미지태그에 출력해보도록 하겠습니다.
우선 BLOB 컬럼을 가진 테스트 테이블 하나를 생성해보도록 하겠습니다.
※ 본인은 MySQL에 BLOB타입의 컬럼을 가진 테이블을 생성해보도록 하겠습니다.
CREATE TABLE `img_table` ( `img` longblob ) ENGINE=InnoDB DEFAULT CHARSET=utf8
BLOB 형식으로 생성 할수도 있지만
사이즈제한이 있으므로 LONGBLOB 타입의 컬럼을 생성하였습니다.
이제는 Spring MVC와 Mybatis의 로직을 구현해보도록 하겠습니다.
Spring 및 Mybatis연동법은 개인이 사용하고 계신 연동법이 있으시면 상관없지만
없으신 분들은 하단 포스팅을 참고하시면 되겠습니다.
2014/11/06 - [개발에필요한연동법/스프링연동] - STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기
2014/11/06 - [개발에필요한연동법/스프링연동] - Spring3 한글깨짐 방지를 위한 UTF-8 인코딩 설정하기
2014/11/07 - [개발에필요한연동법/스프링연동] - Spring3 파일전송을 위한 multipartResolver 설정하기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기
@Autowired private StudyDao dao; /** * 파일태그를 위한 폼태그 * @return */ @RequestMapping(value="/formFile") public String formFile() { return "formFile"; } /** * 파일처리 컨트롤러 * @param vo * @return */ @RequestMapping(value="/saveImage") public String saveImage(Vo vo) { try { Map<String, Object> hmap = new HashMap<String, Object>(); hmap.put("img", vo.getImgFile().getBytes()); dao.saveImage(hmap); } catch (Exception e) { e.printStackTrace(); } return "redirect:/formFile"; }
@Autowired private SqlSession query; public void saveImage(Map<String, Object> hmap) throws SQLException { query.insert("query.saveImage",hmap); }
<insert id="saveImage" parameterType="java.util.Map"> INSERT INTO img_table VALUES(#{img}) </insert>
public class Vo { private MultipartFile imgFile; public MultipartFile getImgFile() { return imgFile; } public void setImgFile(MultipartFile imgFile) { this.imgFile = imgFile; } }
<form action="/saveImage" enctype="multipart/form-data" method="post"> <input type="file" name="imgFile" /> <input type="submit" value="이미지저장"/> </form>
실행결과는 다음과 같습니다.
저장결과 정상적으로 이미지바이트가 DB에 INSERT 되었습니다.
그렇다면 이제 저장된 바이트이미지를 SELECT문을 통하여 가져온 후
IMG태그로 화면에 출력해보도록 하겠습니다.
/** * 임의의 뷰페이지 * @return */ @RequestMapping(value="/view") public String view() { return "view"; } /** * 이미지태그의 src 컨트롤러 * @return */ @RequestMapping(value="/getByteImage") public ResponseEntity<byte[]> getByteImage() { Map<String, Object> map = dao.getByteImage(); byte[] imageContent = (byte[]) map.get("img"); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); return new ResponseEntity<byte[]>(imageContent, headers, HttpStatus.OK); }
public Map<String, Object> getByteImage() { return query.selectOne("query.getByteImage"); }
<select id="getByteImage" resultType="java.util.Map"> SELECT img FROM img_table </select>
<!-- img태그의 src 경로는 byte이미지 가져오는 컨트롤러 호출(/getByteImage) --> <img alt="" src="/getByteImage" />
위와같이 임의로 body태그내에 작성 후 /view 컨트롤러를 호출해보도록 하겠습니다.
호출결과 정상적으로 byte데이터를 DB로부터 가져와서 화면에 출력이 되었습니다.
필요하신분들이 계실거 같아 포스팅 해보았습니다 ^^
by 개발로짜
Spring3 MVC + HttpClient를 이용하여 GET/POST/Multipart API 웹서버 구축해보기 (2) | 2014.12.07 |
---|---|
Spring3 spring-task를 이용하여 스케줄러 연동 및 동작시켜보기 + DB연동(MySQL기준) (0) | 2014.11.24 |
Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기 (5) | 2014.11.17 |
Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함) (0) | 2014.11.16 |
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
이번 포스팅은 Spring MVC 와 HttpClient 라이브러리를 연동하여 API 웹서버 예를 들어보도록 하겠습니다.
HttpClient는 주로 api호출을 하여 서버로부터 받은 데이터(JSON 또는 XML)를
클라이언트(웹 또는 안드로이드)에서 응답받아서 화면에 파싱작업을 진행을 할때 주로 사용합니다.
GET/POST/Multipart(파일처리) 이 3가지에 대하여 알아보도록 하겠습니다.
응답데이터는 JSON 규격으로 클라이언트로 보내는걸로 진행 하겠습니다.
//GET 방식 @RequestMapping(value="/getServer", method=RequestMethod.GET) public @ResponseBody Map<String, Object> getServer(HttpServletRequest request, HttpServletResponse response) { System.out.println("GET Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("param1", request.getParameter("param1")); map.put("param2", request.getParameter("param2")); map.put("flag", "get"); map.put("success", true); return map; } //POST 방식 @RequestMapping(value="/postServer", method=RequestMethod.POST) public @ResponseBody Map<String, Object> postServer(HttpServletRequest request, HttpServletResponse response) { System.out.println("POST Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("param1", request.getParameter("param1")); map.put("param2", request.getParameter("param2")); map.put("flag", "post"); map.put("success", true); return map; } //MultipartFile 방식 @RequestMapping(value="/multipartServer", method=RequestMethod.POST) public @ResponseBody Map<String, Object> multipartServer(Vo vo,HttpServletRequest request) { System.out.println("Multipart Server Response"); Map<String, Object> map = new HashMap<String, Object>(); //클라이언트 페이지로 부터 Httpclient로 받은 parameter값 map.put("txt", request.getParameter("txt")); //클라이언트 페이지로 부터 Httpclient로 받은 multipart parameter값 map.put("filename", vo.getFileupload().getOriginalFilename()); map.put("filesize", vo.getFileupload().getSize()); map.put("flag", "multipart"); map.put("success", true); return map; }
public class Vo { private MultipartFile fileupload; public MultipartFile getFileupload() { return fileupload; } public void setFileupload(MultipartFile fileupload) { this.fileupload = fileupload; } }
다음은 클라이언트 페이지에서 HttpClient를 이용하여
API 서버를 호출하는 라이브러리 추가 및 샘플코드를 다음과 같이 작성해보도록 합니다.
<!-- HttpClient 라이브러리 설정 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.6</version> </dependency> <!-- HttpClient - Multipart를 위한 라이브러리 설정 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.3.6</version> </dependency>
//Get방식 호출을 위한 샘플폼화면 @RequestMapping(value="/getForm") public String getForm(HttpServletRequest request, HttpServletResponse response) { return "getForm"; } //Post방식 호출을 위한 샘플폼화면 @RequestMapping(value="/postForm") public String postForm(HttpServletRequest request, HttpServletResponse response) { return "postForm"; } //Multipart방식 호출을 위한 샘플폼화면 @RequestMapping(value="/multipartForm") public String multipartForm(HttpServletRequest request, HttpServletResponse response) { return "multipartForm"; }
<form action="/getSubmit" method="get"> <input type="text" name="param1" /><br/> <input type="text" name="param2" /><br/> <input type="submit" value="GET전송"/> </form>
<form action="/postSubmit" method="post"> <input type="text" name="param1" /><br/> <input type="text" name="param2" /><br/> <input type="submit" value="POST전송"/> </form>
<form action="/multipartSubmit" method="post" enctype="multipart/form-data"> <input type="file" name="fileupload" /><br/> <input type="text" name="txt" /><br/> <input type="submit" value="POST전송"/> </form>
//Get Submit @RequestMapping(value="/getSubmit") public void getSubmit(HttpServletRequest request) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); //GET 방식으로 parameter를 전달 HttpGet httpGet = new HttpGet("http://localhost:7070/getServer?param1="+request.getParameter("param1")+"¶m2="+request.getParameter("param2")); CloseableHttpResponse response = httpclient.execute(httpGet); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity entity = response.getEntity(); EntityUtils.consume(entity); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } }
//Post Submit @RequestMapping(value="/postSubmit") public void postSubmit(HttpServletRequest request) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:7070/postServer"); //전달하고자 하는 PARAMETER를 List객체에 담는다 List <NameValuePair> nvps = new ArrayList >NameValuePair>(); nvps.add(new BasicNameValuePair("param1", request.getParameter("param1"))); nvps.add(new BasicNameValuePair("param2", request.getParameter("param2"))); //UTF-8은 한글 httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8")); CloseableHttpResponse response = httpclient.execute(httpPost); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity entity = response.getEntity(); EntityUtils.consume(entity); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } }
//파일첨부 MultipartFile Submit @RequestMapping(value="/multipartSubmit") public void multipartSubmit(HttpServletRequest request, Vo vo) { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:7070/multipartServer"); File convFile = new File(vo.getFileupload().getOriginalFilename()); vo.getFileupload().transferTo(convFile); FileBody multipart = new FileBody(convFile); //Charset.forName("UTF-8") : 한글깨짐 방지를위함 StringBody txt = new StringBody(request.getParameter("txt"), Charset.forName("UTF-8")); //API 서버에 전달하고자하는 PARAMETER HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("fileupload", multipart).addPart("txt", txt).build(); httppost.setEntity(reqEntity); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println(response.getStatusLine()); //API서버로부터 받은 JSON 문자열 데이터 System.out.println(EntityUtils.toString(response.getEntity())); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } catch(Exception e){ e.printStackTrace(); }finally { try { httpclient.close(); } catch (IOException e) {} } }
위와같이 코드를 작성하였다면 각 폼컨트롤러 호출을 하여
실행테스트를 해보도록 하겠습니다.
위와같이 정상적으로 API서버에 PARAMETER 또는 MultipartFile 전송 후
응답값을 받아오는 것을 확인 할 수 있었습니다.
안드로이드 API 서버 구축시 또는 외부 API 서버로부터 API 호출할 경우가 생긴다면
해당 샘플을 응용하여 사용하시면 되겠습니다.
by 개발로짜
Spring3 MVC와 Mybatis를 이용하여 이미지를 blob타입으로 db 저장 및 출력해보기 (13) | 2014.12.21 |
---|---|
Spring3 spring-task를 이용하여 스케줄러 연동 및 동작시켜보기 + DB연동(MySQL기준) (0) | 2014.11.24 |
Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기 (5) | 2014.11.17 |
Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함) (0) | 2014.11.16 |
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
기존에는 쿼츠 혹은 배치를 이용하여 실시간 스케줄러를 구현하였는데
"spring-task"를 이용해보니 쿼츠를 사용할 필요도 없이 간편하게 개발이 가능하여 포스팅을 하게 되었습니다.
프로젝트생성부터 DB연동하여 실행하는 부분까지 한번에 진행하도록 하겠습니다.
1.New Spring Project -> Simple Spring Web Maven -> 프로젝트명 : "spring_task"
2.spring_task프로젝트 마우스 우클릭 -> Maven -> Update Project.. -> OK
1. beans 태그에 하단 속성 추가
xmlns:task="http://www.springframework.org/schema/task"
2. xsi:schemaLocation 내에 다음 코드 추가
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
3. beans 태그의 자식태그 추가 (Job Scheduler 연동)
<context:component-scan base-package="com.scheduler" /> <task:scheduler id="jobScheduler" pool-size="10" /> <task:annotation-driven scheduler="jobScheduler" />
DB설정 부분에 대해서는 하단 링크를 참고해주세요
※ 본인은 MySQL을 이용하여 설명을 진행하겠습니다.
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기
2014/11/16 - [개발에필요한연동법/스프링연동] - Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함)
트랜잭션 및 다중DB 연동에 대해서는 생략하도록 하겠습니다.
1. com.scheduler.Scheduler.java 코드 작성
@Component public class Scheduler { @Autowired private SchedulerDao schedulerDao; @Scheduled(cron = "0 45 11 * * *") public void cronTest1(){ try { String value = schedulerDao.test(); System.out.println("value:"+value); } catch (Exception e) { e.printStackTrace(); } } }
2. com.scheduler.dao.SchedulerDao.java 코드 작성
public interface SchedulerDao { public String test() throws SQLException; }
3. com.scheduler.dao.impl.SchedulerDaoImpl.java 코드 작성
@Repository public class SchedulerDaoImpl implements SchedulerDao { @Autowired private SqlSession query; public String test() throws SQLException { return query.selectOne("query.test"); } }
4. query.xml mybatis XML 쿼리 작성
<select id="test" resultType="String"> SELECT 'test' </select>
위처럼 코드 작성이 완료되었다면 Tomcat에 프로젝트 ADD 한다음 실행을 해보도록 하겠습니다.
※ @scheduled 어노테이션을 확인해보면 expression이 존재합니다.
바로 정의한 시간에 해당 메서드를 실행하겠다라는 선언을 해주는것인대
샘플코드를 기준으로 간단하게 설명하겠습니다.
"0 45 11 * * *"
"초 분 시 일 월 요일" 에 대한 설정을 의미하는것인대
"오전 11시 45분 00초"에 해당 메서드 실행을 의미합니다.
"*" 표시는 항상/모두 를 의미하는 expression입니다.
만약 서버를 계속 켜놓는다 가정한다면
"항상 오전 11시45분00초에 메서드를 실행하라"
라는 의미가 되는것입니다.
정상적으로 스케쥴러 실행이 완료 되었습니다.
만약 여러개의 스케쥴러를 구축하고 싶으시다면 method 추가 후
@Scheduled 어노테이션으로 동일하게 정의해주시면 되겠습니다.
by 개발로짜
Spring3 MVC와 Mybatis를 이용하여 이미지를 blob타입으로 db 저장 및 출력해보기 (13) | 2014.12.21 |
---|---|
Spring3 MVC + HttpClient를 이용하여 GET/POST/Multipart API 웹서버 구축해보기 (2) | 2014.12.07 |
Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기 (5) | 2014.11.17 |
Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함) (0) | 2014.11.16 |
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |