안녕하세요. 사내에서 일부 프로젝트에 JPA를 사용중에 있습니다.
JPA 사용이후 쿼리 변환에 대한 질문 드립니다.
회사내에 업무 및 배포 프로세스상 개발 및 QA 완료 이후에 보안검수, 쿼리검수, 기타 검수과정이 포함되어서 진행됩니다. JPA를 사용하게 되면 이후 쿼리검수 양식에 맞춰서 쿼리 추출후 전달이 필요한데 JPA에 생성된 쿼리를 로그에 출력하게 되면 실제 모델에 기술한 쿼리가 아닌 임의로 변환된 쿼리로 출력됩니다.
ex) Domain : User (Entity :tbl_user)
- String userName, - String nickName - String address - Date createDate
ex) 주소로 회원의 정보 검색시 JPA에서 생성된 쿼리
select user0_.id as id1_1_, user0_.address as address2_1_, user0_.create_date as create_d3_1_, user0_.nick_name as nick_nam4_1_, user0_.user_name as user_nam5_1_ from tbl_user user0_ where user0_.address=?
개발과정에선 쿼리의 반복적인 작업에서 벗어났지만 개발 완료후 쿼리검수를 위해 TABLE상에서 사용하는 칼럼 값 기준으로 위의 쿼리를 재수정하는 번거로움이 일부 있었습니다.
pinpoint나 기타 별도의 모니터링 툴 구축없이 정확한 쿼리 추출이 가능한 방법이 있을까요.?
6개의 의견 from SLiPP
@김형석 저도 이와 관련한 투렷한 해결책은 잘 모르겠어요. DBA와 협의만 잘 되면 좋겠지만 그렇지 않은 경우가 대부분인지라.
저는 기존 회사에서 DBA와 친분을 맺은 후 ORM에 대해 설명하고 쿼리 변환없이 JPA가 생성하는 쿼리를 전달함으로써 쿼리 검수를 진행했어요. DBA가 그리 좋아하지는 않았을 수도 있었겠지만 저희 개발팀의 고충을 이야기해서 풀어가는 방식으로 접근했어요.
자동으로 생성되는 쿼리를 table 칼럼 기반으로 변경하는 부분은 검색해도 나오지 않네요.
예전에 함께 일했던 시니어가 알려준 방법이 있었는데요
요구사항의 발단은
이런 요구사항들로 부터 출발했었고, 해결방법은 Proxy를 이용해서 심플하게 구현했었습니다.
DBCP의 경우 BasicDataSource를 상속받았고,
과 같은 방식으로 Connection 객체를 반환할때 Proxy로 한번 감싸주었습니다.
이렇게되면 ORM (JPA/Hibernate), SQL Mapper(MyBatis..), JOOQ, QueryDSL등 어떠한 라이브러리를 사용하더라도 JDBC Layer를 모두 통과하게 되어 있다보니 SlowQuery, Query Logging (Formatting), Query 통계 등을 편리하게 뽑아 낼 수 있었습니다. (물론 쿼리를 이쁘게 포맷팅해주는 유틸, Map에 쿼리들을 Key,Value로 분류해 카운팅 하는 부가적인 기능들은 직접 개발했었습니다)
이부분에 추가로 형석님이 원하시는 기능 (Hibernate 쿼리를 사람이 보기 편한 쿼리로 변환)을 HibernateQuery Normalizer등으로 이름짓고 끼워넣으시면 DBA에게 쿼리를 줄때 매번 변환하지 않아도 될 것 같습니다.
재미있을 것 같네요. 저도 예제 소스로 간단히 정리되는대로 Github에 공유를 한번 해보도록 하겠습니다!
댓글을 쓰고 자려고 하는데, 아들녀석이 깨는바람에 블로그에 글을 한편 더 쓰게되었네요
SpringBoot Application 모니터링 1편) SlowQuery 필터링 & SQL 실행 통계 수집
블로그에 글과 소스코드를 참고하시면 형석님이 필요하시는 기능들을 찾으실 수 있을것같습니다.
도움이 되셨으면 좋겠네요 :)
감사드립니다 참고하겠습니다 ^^
@Brant Hwang 좋네요. 저도 한 수 배우고 갑니다.
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.