SQL이란 무엇인가? 그리고 Rails에서 왜 우리는 SQL을 거의 쓰지 않는가? — ActiveRecord의 존재 이유
많은 초보 개발자들이 이 지점에서 혼란을 느낀다.
데이터베이스를 쓰면 SQL이 필요한 거 아닌가?
그런데 Rails에서는 SQL을 거의 안 쓰고도 웹서비스가 되는데?
ActiveRecord가 도대체 무슨 역할을 하길래 가능한 거지?
이 글은 바로 그 핵심을 명확하게 설명한다.
1⃣ SQL이란 무엇인가? (본질만 요약)
SQL(Structured Query Language)은
데이터베이스와 대화하는 공식 언어다.
DB에 작업을 요청할 때 SQL을 사용한다.
예:
SELECT * FROM users WHERE age > 20;
이 문장은
“users 테이블에서 age가 20보다 큰 레코드를 가져와라”
라는 뜻이다.
SQL로 할 수 있는 일은 딱 네 가지로 정리된다.
Create — 데이터를 만들고
Read — 데이터를 읽고
Update — 데이터를 수정하고
Delete — 데이터를 삭제한다
즉, CRUD.
모든 웹서비스는 결국
SQL을 통해 DB에 CRUD를 요청하는 구조다.
2⃣ 그런데 Rails에서는 SQL을 거의 쓰지 않는다. 왜? ActiveRecord가 있기 때문이다.
Rails의 핵심 구성 요소 중 하나가 바로 ActiveRecord다.
ActiveRecord는 ORM(Object Relational Mapping)이다.
이게 무슨 뜻이냐?
3⃣ ORM이란? “객체(오브젝트) ↔ 데이터베이스(테이블)”를 자동으로 연결해주는 시스템
프로그래밍 언어는 객체를 사용한다.
user = User.new(name: "bamcoding")
DB는 레코드를 사용한다.
users 테이블의 1번 row
ORM의 역할은 단 하나다:
“Ruby 세계의 객체”를 “DB 세계의 레코드”와 자동으로 연결시켜주는 것.
이를 통해 우리는
객체를 다루듯이 데이터베이스도 다룰 수 있게 된다.
4⃣ ActiveRecord로 SQL을 대체하는 방식
예 1) 데이터 읽기(Read)
SQL:
SELECT * FROM users;
Rails:
User.all
예 2) 조건 검색
SQL:
SELECT * FROM users WHERE age > 20;
Rails:
User.where("age > 20")
혹은 더 Ruby스럽게:
User.where(age: 21..)
예 3) 생성(Create)
SQL:
INSERT INTO users (name, age) VALUES ('bamcoding', 34);
Rails:
User.create(name: "bamcoding", age: 34)
예 4) 수정(Update)
SQL:
UPDATE users SET age = 35 WHERE id = 1;
Rails:
user = User.find(1)
user.update(age: 35)
예 5) 삭제(Delete)
SQL:
DELETE FROM users WHERE id = 1;
Rails:
user = User.find(1)
user.destroy
5⃣ 핵심: Rails 개발자는 SQL이 아니라 “Ruby”로 DB를 다룬다
왜냐하면 ActiveRecord가
내가 내리는 Ruby 명령을
백그라운드에서 SQL로 변환해주기 때문이다.
즉,
개발자가 SQL을 쓰지 않아도 Rails는 내부에서 SQL을 생성하고 실행한다.
그 덕분에 개발자는
DB를 직접 제어하는 기술적 부담 없이
비즈니스 로직 설계에 집중할 수 있다.
6⃣ ActiveRecord가 “강력하다”고 말하는 진짜 이유
ActiveRecord의 강점은 단순히 “SQL을 안 써도 된다”가 아니다.
그건 표면적인 장점일 뿐이다.
진짜 핵심은 아래 네 가지다.
1) 모델(Model)과 DB 테이블이 자동으로 연결된다
User 모델을 만들면
자동으로 users 테이블과 연결된다.
테이블 이름을 맞출 필요도 없고
매핑을 따로 지정할 필요도 없다
Rails가 관례(convention)로 자동 연결
이 자체가 개발 속도를 폭발적으로 높인다.
2) 관계 설정이 압도적으로 직관적이다
예:
class Building < ApplicationRecord
has_many :rooms
end
class Room < ApplicationRecord
belongs_to :building
end
이 두 줄은
Rails가 기본적으로 다음을 수행하도록 만든다:
적절한 SQL JOIN을 생성하고
building.rooms 호출을 지원하고
자동 외래키 building_id를 관리하고
관계 기반 조회를 최적화한다
이걸 SQL로 직접 구현하려면
수십 줄의 JOIN, INDEX, 조건식을 써야 한다.
ActiveRecord는 이 모든 것을
두 줄로 끝낸다.
3) 보안, 인젝션 방지, 쿼리 최적화를 Rails가 대신한다
직접 SQL을 쓰면 생기는 위험:
SQL Injection
잘못된 쿼리로 인한 성능 저하
SELECT * 남발
누락된 INDEX로 인한 느린 조회
ActiveRecord는
대부분의 문제를 사전에 방지하거나
안전한 SQL로 변환해준다.
웹 개발자의 안전망이다.
4) Ruby 문법과 완벽히 통합된 개발 경험
쿼리를 Ruby스럽게 조립할 수 있다:
User.where(active: true)
.where("age > ?", 20)
.order(created_at: :desc)
.limit(10)
Ruby 코드처럼 보이지만
내부에서는 최적화된 SQL이 생성된다.
이 “코드 조합” 능력이
ActiveRecord를 가장 강력한 ORM 중 하나로 만든다.
7⃣ 결론 — Rails 개발자가 SQL을 거의 쓰지 않는 이유
SQL의 모든 복잡함을 ActiveRecord가 추상화해버렸기 때문이다
개발자는 Ruby 코드만 작성하면 되기 때문이다
모델-관계-조회-저장-삭제가 모두 Ruby 객체 조작처럼 느껴지기 때문이다
생산성, 안전성, 유지보수성이 압도적으로 좋아지기 때문이다
ActiveRecord는 단순한 ORM이 아니라
Rails 생산성의 핵심 엔진이다.