이전에 만들었던 라이믹스 모듈 생산 속도를 늘려주는 쿼리 생성기의 아이디어에서 시작하였습니다.
위 툴을 사용하여 저도 모듈 개발을 진행하고 있는데요, 분명히 편해진 건 맞지만 그래도 불편한 점이 꽤 있었습니다.
1. 테이블 쿼리를 가져가서 넣어줘야 작업이 가능함
2. 내가 원하는 쿼리를 뽑기 위해서는 별도로 작업해야하는 과정이 있음 (ex. 특정 member_srl을 기준으로 where절을 구성하고 싶을때)
3. 만든걸 다운받아서 다시 쿼리 폴더와 model에 함수를 넣어줘야함
이걸 어떻게 개선을 해볼까 싶었는데, 제가 스프링 개발자로 일하면서 좋은 경험을 얻었던 JPA 쿼리를 도입해보면 어떨까 싶어서 작업해봤습니다.
JPA 쿼리란 위와같이 find로 시작하는 함수를 작성해주면, Java에서 알아서 쿼리를 생성해주는 기능입니다.
위 예시는 emailAddress와 LastName이 일치하는 데이터를 가져오는 함수라고 보면 됩니다.
굉장히 직관적이죠.
종류도 다양합니다.
영어로 나타낼 수 있는 문장을 구사하여 쿼리를 생성할 수 있다는 장점이 있는겁니다.
굳이 SQL문이나 라이믹스에 있는 xml을 생각해서 짜내지 않아도 되는것입니다.
물론 복잡한 쿼리는 너무 길어지거나 구현이 불가능하다는 단점이 있지만, JPA는 그런 복잡한 쿼리를 짜라고 나온 물건이 아니기에 무시하려고 합니다.
복잡한 쿼리는 XML 쿼리나 stmt를 사용해주세요.
그래서 결론은 아래와 같이 사용 가능하도록 구현하였습니다.
$oDB = \Rhymix\Modules\Querynext\Models\DBImpl::getInstance(); $output = $oDB->executeJPAQuery('document.getDocumentsListByMemberSrl', ['member_srl' => 4]); debugPrint($output);
1. module.JPAQueryString 형식으로 executeJPAQuery 함수를 호출합니다.
2. 해당 함수에서는 쿼리문을 파싱하여 XML 쿼리 형태로 데이터를 생성 후 라이믹스에 넘깁니다.
3. 라이믹스는 생성된 XML 쿼리를 executeQuery로 실행합니다.
기존 Rhymix\Framework\DB 를 extend 하였기에 기존에 사용하던 것은 그대로 이용 가능하고, JPA 기능을 추가로 사용할 수 있습니다.
기본적인 구조는 아래와 같습니다.
JPA 쿼리 : get / {테이블명} / [List/Pageable] / By / {Where절에 들어갈 항목} / [OrderBy / {OrderBy 대상 컬럼} / [ASC/DESC]]
ex 1) document.getDocumentsListByMemberSrl : member_srl을 기준으로 documents 테이블을 쿼리함
ex 2) document.getDocumentsListByTitleLike : title에 특정 단어가 들어있는지를 documents 테이블에서 쿼리함
ex 3) document.getDocumentsPageable : documents 테이블을 페이지 단위로 쿼리함
다운로드 : https://github.com/Waterticket/rx-module-querynext
설치시 유의사항
- modules/querynext/queries 폴더에 xml 쿼리가 생성됩니다. 쿼리가 실행되지 않는 경우 해당 폴더의 퍼미션을 확인해주세요. PHP가 해당 폴더에 쓸 수 있어야합니다.
이 모듈만 설치하면 어떤 환경에서도 실행이 되기 때문에, 모듈을 개발하실때 JPA 쿼리로 개발하시고, 이 모듈과 함께 배포하면 동적으로 쿼리를 생성하여 작업할 수 있습니다.
나중에 생성된 xml 쿼리를 묶어서 따로 저장할 수 있게끔 하는 방안도 생각하고 있습니다.
그리고 시간이 나면 엔티티와 영속성 컨텍스트도 구현해보고자 합니다.
Models/Entity를 보시면 어떤걸 구현하고자 하는지 이해가 되실겁니다.
총평 : 단순 노동을 대체할 수 있어서 참 좋네요 :D
저희는 아예 SQL 쿼리문을 만들어 실행하는 가벼운 ORM을 만들어 사용중인데, XML 쿼리를 생성해주는 접근도 신선하네요.