SPRING/SPRING
ibatis(mybatis) vs SP(Stored Procedure) 성능 차이
ondala
2024. 7. 21. 23:00
Java 언어에서 JDBC를 통하여 DB상에서 DML을 실행하는 방법 3가지
Statement
긴 Query를 편집하기에 굉장히 불편하고 무엇보다 SQL인젝션 공격에 대비하기 위해서 손이 많이 가기 때문이다.
모든 파라메터를 결국 String형태로 조립하는 방식인데 큰따옴표, 작은따옴표 그리고 + 기호까지 소스의 가독성이 떨어진다.
PreparedStatement
좀 더 세련된 방식으로 성능과 가독성이 Statement 보다 좋은 방식이다.
iBatis는 이 PareparedStatement를 활용하여 자바 코드와 SQL문을 분리한 프레임웍이다.
SQL문을 XML에 작성해 놓고 변수와 매핑될 부분을 표시한 다음 런타임에 PreparedStatement를 생성하고 Java에서 넘겨준 변수와 ?를 매핑하여 DB에 전달하고 수행한 이후에 오브젝트 혹은 오브젝트 리스트에 결과를 담아서 돌려준다.
CallableStatement
DB에 이미 컴파일되어 저장되어 있는 Stored Procedure나Stored Function 등을 실행하기 때문에 셋 중 가장 나은 성능을 보여준다. SQL문이 DB에 존재하기 때문에 JAVA에서는 변수만 전달하면 된다.
Spring JDBC를 사용한 프로시저 호출
장점
-
직접 호출: Spring JDBC를 사용하여 프로시저를 직접 호출하면 추가적인 ORM 계층을 거치지 않으므로 상대적으로 빠를 수 있습니다.
-
간단한 구현: 단순히 프로시저를 호출하고 결과를 받는 경우 구현이 간단할 수 있습니다.
-
성능: 프로시저 자체가 데이터베이스 내부에서 실행되므로 복잡한 로직이 DB 내에서 처리되어 성능 상의 이점을 가질 수 있습니다.
-
네트워크 오버헤드: 프로시저 호출 시 네트워크 오버헤드가 최소화될 수 있습니다.
단점
-
유지보수성: 프로시저 로직을 변경해야 할 경우 데이터베이스 내에서 직접 변경해야 하므로 유지보수가 번거로울 수 있습니다.
- 테스트: 프로시저 테스트가 상대적으로 어렵습니다. Mocking이나 단위 테스트가 어렵습니다.
MyBatis를 사용한 구현
장점
-
유연성: MyBatis를 사용하면 SQL을 XML 매퍼나 어노테이션을 통해 정의할 수 있으므로,SQL을 쉽게 수정하고 유지보수할 수 있습니다.
-
객체 매핑: MyBatis는 결과를 객체로 매핑해 주는 기능이 강력하여, Java 객체와 데이터베이스 간의 데이터 이동이 자연스럽습니다.
-
유지보수성: SQL 쿼리가 코드 내에 있으므로 변경사항을 쉽게 추적하고 관리할 수 있습니다.
단점
-
추가 레이어: MyBatis는 ORM 계층을 추가로 사용하므로, 프로시저를 직접 호출하는 것보다 약간의 오버헤드가 있을 수 있습니다.
-
복잡성: 복잡한 쿼리의 경우 MyBatis 매퍼 파일이 복잡해질 수 있습니다.
결론
-
프로시저 호출: 복잡한 데이터베이스 로직이 있는 경우, 성능을 위해 Spring JDBC를 사용하여 프로시저를 직접 호출하는 것이 좋을 수 있습니다.
-
MyBatis 사용: 유지보수성과 유연성이 중요한 경우, MyBatis를 사용하는 것이 더 나은 선택일 수 있습니다.