"??? : ㅋㅋ SQL 왜 배우냐? ORM 쓰면 되는데" 이렇게 말하는 거 들어보시지 않으셨나요? 저희들이 농담삼아 많이 하는 말인데요. 이러면서 누구에게 가르쳐 줄 때는 SQL을 반드시 배우라고 조언을 해줍니다. 그럼 왜 그런지 알아보도록 하겠습니다.
Structured Query Language의 약자로, 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계한 특수 목적의 프로그래밍 언어입니다.
Object Relational Mapping의 약자로, 객체와 데이터베이스를 연결해 주는 도구입니다. 프로그래밍 언어의 객체와 관계형 데이터베이스 사이의 중계자 역할을 합니다.
성능 문제 - 비효율적인 쿼리를 날릴 수 있습니다. N + 1 문제와 같이 연관 데이터를 조회할 때, 불필요하게 많은 쿼리가 실행되어 성능 저하를 일으킬 수 있습니다.
런타임 오류 가능성 - ORM은 내부적으로 SQL을 자동 생성하므로, 직접적인 SQL 작성이 줄어드는 대신 컴파일 시점에 쿼리 오류를 확인하기 어렵습니다.
ORM 프레임워크 자체의 복잡성 - ORM은 초보자에게는 SQL 쓰지 않아 쉽게 느껴질 수 있지만, 고급 기능을 제대로 이해하지 못하면 버그나 성능 저하를 발생시킵니다.
편리해 보이지만, 복잡한 통계 쿼리, 성능이 중요한 대용량 조회 등에서는 오히려 비효율적인 방식이 될 수 있습니다.
쿼리 작성시에 오류를 즉각 알 수 있고, 성능을 최적화 할 수 있습니다. 하지만 기본적인 CURD 작업에도 일일이 쿼리를 작성해야 한다는 단점이 생산성을 저하시키고 코드 중복을 초래할 수 있습니다.
ORM이 이러한 문제를 가졌기에 ORM과 SQL을 같이 사용하며 성능 문제, 런타임 오류 가능성과 같은 문제점을 해결할 수 있다.
저는 Spring의 ORM인 JPA를 사용해 본 경험이 있습니다.
초기에는 어떻게 메서드를 정의해야 할지 몰라 CustomRepository를 직접 만들어 쓰기도 했고, JPQL 메서드 이름을 잘못 작성해서 원하는 쿼리가 생성되지 않아 한참을 헤맨 적도 있습니다.
특히 update를 할 때, JPA가 해당 레코드를 삭제하고 새로 생성해버리는 바람에 오류가 났고, 그 원인을 찾느라 이틀 이상 고민했던 기억이 납니다.
이처럼 JPA는 분명 강력한 도구지만, 내부 동작을 정확히 이해하지 않으면 예상치 못한 버그로 이어질 수 있습니다.
결국 저는 SQL을 어느 정도 알고 있었기에 이 문제를 해결할 수 있었고,
그래서 지금도 복잡한 상황에서는 SQL을 더 선호합니다.
https://ko.wikipedia.org/wiki/SQL
https://gmlwjd9405.github.io/2019/02/01/orm.html