원본 본문으로 이동하기

서블릿 -> 스프링 : Spring Repository 에서 일반 쿼리 사용하기

박용서 - 왜? 일반쿼리를... 사로/가리사니를 서블릿에서 스프링으로 이전하려고 합니다. 사로/가리사니 구성 : 서블릿 + 뷰없음(프론트엔드에 있음) + PostgreSQL 함수(PG-SQL에서는 프로시저가 없기 때문에 함수를 프로시저처럼 사용합니다.) 150여개로 구성되어있습니다. 서버 : DB에서 최종 결과물을 뽑는다 -> (모델완성함 : 대부분은 DB결과물이 최종모델) -> 컨트롤을 통해 json출력 클라이언트 : json과 뷰를 받아 브라우저에서 가공하고 사용자에게 출력. 즉, 한번에 Spring + hibernate 구조로 마이그레이션을 하기에 너무 많은 작업이 발생하게 되어 단계적으로 마이그레이션 하려고합니다. 1 단계 : 스프링으로 프로젝트를 바꾸고 세션 클러스터링을 서블릿(사로/가리사니는 서블릿도 서블릿을 상속한 특수한 구조로 그대로 옴기기가 힘듬) 재구성, 하이버네이트를 사용하지만 일단 프로시저를 그대로 사용하고 결과를 출력. 2 단계 : 리뉴얼 : 리팩토링이 아닌 리뉴얼인 이유는 어차피 디자인도 마음에 안들고해서 디자인을 바꾸는 겸 템플릿엔진이나 기본구조도 바꿀생각 동시에 프로시저구조를 대부분 풀어서 ORM 구조로 바꿈. 3 단계 : 남아있는 예외들 (Repository의 일반쿼리)를 모두 바꿔줌. ORM과 일반쿼리가 과정상 어쩔수 없이 공존하기 때문에 사용하는 방법입니다. 즉, 일반적인 경우는 ORM의 전체적인 구조를 파괴하기 때문에 사용을 지양하나, 어쩔수없는 특수한 경우, 과도기적으로만 사용하시길 바랍니다. 리포지토리 @Query 에 옵션으로 nativeQuery=true 로 바꿔주면 사용할 수 있습니다. 다만 Repository를 만들어주는 과정이서 엔티티와 리포를 구성하는 과정이 있는데 이부분은 강제로 입력해주셔야합니다. 여기서는 JpaRepository<User, Long> 라고 입력했지만 User(엔티티)와 Long(키 자료형)은 나오지 않습니다. 사실.. 구조적으로는 완전히 지저분합니다....... public interface FnRepository extends JpaRepository<User, Long> // 위 설명 { // nativeQuery=true 를 사용하면된다. // 기본반환읜 Object 이나 String으로 지정하면 String으로 케스팅해주며, // 이처럼 row가 하니일 경우는 리스트가 아닌 단일 값이라도 알아서 입력해준다. : // 이건 nativeQuery 의 특징이 아닌 하이버네이트(필자는 ORM을 하이버네이트와 // 마이바티스밖에 써보지 못하였음으로 다른 것도 이렇게 되는지는 알 수 없다 다만 // 마이바티스는 구조적으로 다르기에 생략.)의 특징. @Query(value="SELECT now()", nativeQuery=true) public String now(); // 역시 nativeQuery 의 특징은 아니지만 이런식으로 받아올 수도있다. // { Object[]{no, name}, Object[]{no, name},... Object[]{no, name} } 처럼 입력됨. @Query(value="SELECT no, name FROM data_function()", nativeQuery=true) public List<Object[]> datas(); } 출력 @Autowired FnRepository fnRepository; @ResponseBody @RequestMapping(path="/now", produces="text/plain") public String now(HttpServletResponse res) { return fnRepository.now(); } @RequestMapping(path="/datas", produces="text/json") public void user(HttpServletResponse res) throws IOException { Writer out = res.getWriter(); for (Object[] data: fnRepository.datas()) { for (Object value : data) { out.write(value.toString()); out.write("\r\n"); } } } 호스트/now, 호스트/datas 에 제대로 나온다면 성공입니다. 물론 예제를 보여주기 위한 것 임으로, 실제 구현시 서비스를 만들어주지 않고 저렇게 사용할경우 Object[] data 의 순서는.. 코드지옥을 생성시킬겁니다.!! - 서블릿 스프링