🧱 객체와 관계형 데이터베이스란?
- 객체는
클래스를 통해 만들어지며 속성(field)과 기능(method)을 가짐- 관계형 데이터베이스(RDB)는 데이터를 테이블 형식으로 표현하며
각 테이블은열(column)과행(row)으로 구성됨- 이 두 구조는 패러다임(생각 방식)이 달라서 충돌 발생
⚠️ 관계형 DB에 객체 저장 시 발생하는 문제점
🔁 1. 리소스별 CRUD 반복
Java에서는 객체를 만들고, 이걸 RDB에 저장하려면 SQL을 직접 작성해야 함

INSERT, UPDATE, SELECT, DELETE

예를 들어, Tutor 객체 하나를 만들고 저장하려면:
INSERT INTO tutor (id, name) VALUES (1, 'wonuk');
public class Tutor {
private String id;
private String name;
private Integer age; // 필드 추가
}
-- SQL도 수정
INSERT INTO tutor (id, name, age) VALUES (1, 'wonuk', 100);
❗️ 문제점: 필드가 변경될 때마다 SQL도 수동으로 바꿔야 함
→ 유지 보수 어려움
🚧 2. 객체와 SQL 간 변환 문제
RowMapper 사용 등)⚠️ 즉, 개발자는 SQL과 Java 코드를 양쪽 다 신경써야 함
🌪️ 3. 패러다임 불일치 문제 (Paradigm Mismatch)
객체는 다음 특징을 가짐:
RDB는 다음 특징을 가짐:
→ 이 차이에서 충돌이 발생함
🧬 패러다임 불일치 문제 1
🧩 상속 관계 문제

class Person { String name; }
class Tutor extends Person { String subject; }

→ 이를 해결하려면 RDB에서는 슈퍼타입/서브타입 테이블을 별도로 구성하고 JOIN으로 조회해야 함
> Tutor 저장

> Tutor 조회

⚠️ 복잡한 SQL JOIN, 객체 매핑 작업 필수 → 개발자가 매우 귀찮아짐
🔗 연관 관계 표현의 차이
🧱 RDB는 외래키(Foreign Key) 사용

INSERT INTO tutor (id, company_id, name) VALUES ...;
→ 테이블을 독립적으로 저장/조회할 수 있어 효율적
🧸 Java 객체는 참조(Reference) 사용

class Tutor {
Company company;
}
→ 객체 생성 후 연관 객체 수동 세팅 필요 → 코드 복잡도 증가
→ DB는 JOIN으로 한번에 조회할 수 있지만, Java는 객체를 일일이 다시 조립해야 함
🧬 패러다임 불일치 문제 2
🕸️ 객체 그래프 탐색 문제
product.getSupplier().getCompany())Product product = repository.findById(id);
Company company = product.getSupplier().getCompany(); // ❌ 오류 발생 가능
→ Entity의 신뢰성 붕괴
→ 진정한 계층 분할 불가능 → 무거운 SQL 필요 → 성능 저하
🤔 객체 비교 문제
Product p1 = repo.findById(1);
Product p2 = repo.findById(1);
System.out.println(p1 == p2); // false
→ 데이터는 같지만 다른 인스턴스로 인식됨 (주소값이 다름)
→ 참조 기반 비교가 불가능해짐
📦 Java Collection의 편리함
List<Product> list = ...;
Product p = list.get(productId);
p.getCategory())✅ 결론 + 해결책
📍 문제 요약
💡 해결 방법: JPA(Java Persistence API)
entityManager.persist(obj);entityManager.find(Product.class, id);🧠 요약 정리
| 구분 | 객체 지향(Java) | 관계형 DB(RDB) | 불일치 |
|---|---|---|---|
| 구조 | 클래스, 참조 | 테이블, 외래키 | 매핑 복잡 |
| 상속 | 지원 | 미지원 | JOIN 필요 |
| 관계 | 참조 | 외래키 | 수동 세팅 필요 |
| 비교 | 주소 기반 | 값 기반 | == 사용 불가 |
| 편의성 | 컬렉션처럼 탐색 가능 | SQL 직접 작성 필요 | 생산성 낮음 |
| 해결책 | ✅ JPA 사용 |