JPA와 OOP 모델링 – 상속(상속)과 컴포지션(Composition) 개념 잡기
이번 글에서는 JPA가 OOP(Object-Oriented Programming) 모델링을 지원하는 방식을 알아보고,
상속과 컴포지션(Composition), 그리고 방언(Dialect) 처리가 어떻게 이루어지는지 정리하겠습니다.
✅ JPA는 OOP 관점에서 모델링할 수 있도록 도와준다
"JPA를 사용하면 객체 중심으로 개발할 수 있으며, 객체 관계를 그대로 DB 테이블에 매핑할 수 있다!"
일반적인 데이터베이스 설계에서는 테이블 중심으로 데이터 모델링을 하지만,
JPA를 사용하면 자바 클래스를 먼저 만들고, 이를 기반으로 자동으로 테이블을 생성할 수 있다.
📌 "JPA를 사용하면 OOP의 개념을 그대로 유지하면서 DB 설계를 할 수 있다!"
✅ 상속(Inheritance) vs 컴포지션(Composition)
"객체 간의 관계를 정의하는 두 가지 방법: 상속(Inheritance)과 컴포지션(Composition)"
🔹 상속(Inheritance)
- 부모 클래스를 상속받아 코드 재사용성을 높이는 방식
- "is-a" 관계 (예: 자동차 is-a 탈것)
class Vehicle {
String color;
}
class Car extends Vehicle {
int wheels;
}
📌 "Car 클래스는 Vehicle을 상속받아 색상(color) 속성을 그대로 물려받을 수 있다!"
🔹 컴포지션(Composition)
- 한 클래스가 다른 클래스를 속성(멤버 변수)으로 포함하는 방식
- "has-a" 관계 (예: 자동차 has-a 엔진)
class Engine {
int power;
}
class Car {
String color;
Engine engine; // 자동차는 엔진을 포함함 (has-a 관계)
}
📌 "Car 클래스는 Engine을 멤버 변수로 포함하여 엔진을 가질 수 있다!"
✅ JPA에서 상속과 컴포지션 활용하기
🔹 JPA에서 상속을 활용한 공통 필드 관리
여러 엔티티에서 공통적으로 사용되는 필드(예: 생성일, 수정일 등) 가 있다면,
이를 부모 클래스로 분리하여 상속받을 수 있다.
@MappedSuperclass
public class BaseEntity {
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;
}
@Entity
public class Car extends BaseEntity { // 🔹 BaseEntity를 상속받음
@Id @GeneratedValue
private Long id;
private String name;
}
📌 "JPA에서 상속을 사용하면 공통 필드를 중복 없이 관리할 수 있다!"
🔹 JPA에서 컴포지션을 활용한 관계 매핑
자동차(Car)와 엔진(Engine)의 관계를 JPA에서 매핑하는 방법
@Entity
public class Engine {
@Id @GeneratedValue
private Long id;
private int power; // 마력 (2000cc, 3000cc)
}
@Entity
public class Car {
@Id @GeneratedValue
private Long id;
private String color;
@OneToOne // 🔹 Car는 Engine을 포함 (has-a 관계)
@JoinColumn(name = "engine_id")
private Engine engine;
}
📌 "JPA에서 컴포지션을 사용하면 객체의 관계를 그대로 DB에 매핑할 수 있다!"
✅ JPA는 방언(Dialect) 처리를 지원한다
"JPA는 특정 DBMS(MySQL, Oracle, PostgreSQL 등)와 관계없이 동작할 수 있도록 방언(Dialect)을 지원한다!"
🔹 방언(Dialect)이란?
- 각 데이터베이스는 조금씩 다른 SQL 문법을 사용함
- JPA는 방언(Dialect)을 통해 DBMS별 차이를 자동으로 처리함
- 예를 들어, LIMIT 키워드는 MySQL에서는 사용 가능하지만, Oracle에서는 다르게 동작함
📌 "JPA는 특정 데이터베이스에 종속되지 않고, 설정만 변경하면 다른 DBMS에서도 동일한 코드로 실행할 수 있다!"
🔹 방언 설정 방법
📌 application.properties에서 데이터베이스 방언을 설정할 수 있음
# MySQL 사용
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
# Oracle 사용
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
📌 "JPA를 사용하면 특정 데이터베이스에 맞는 SQL을 자동으로 생성해준다!"
✅ JPA는 쉽지만 어렵다!
"JPA는 처음에는 어렵지만, 익숙해지면 엄청나게 편리한 기술이다!"
📌 JPA의 장점
✅ 객체 중심 개발 가능 – SQL 없이 자바 코드만으로 데이터 조작 가능
✅ 데이터베이스 종속성 제거 – 다양한 DBMS에서 동일한 코드 사용 가능
✅ CRUD 자동 처리 – 반복적인 SQL 작성이 필요 없음
✅ 연관 관계 자동 매핑 – 복잡한 조인(Join) 없이 객체로 관계 설정 가능
📌 JPA의 어려운 점
⚠ 초기 학습이 어렵다 – 기존 SQL 중심 개발 방식과 개념이 다름
⚠ 성능 최적화가 필요하다 – 내부적으로 SQL이 예상치 못한 방식으로 실행될 수도 있음
📌 "JPA를 제대로 이해하고 사용하면, 데이터 관리를 훨씬 효율적으로 할 수 있다!" 🚀
🔥 핵심 정리
| 개념 | 설명 |
| OOP 모델링 | JPA는 OOP 개념을 반영한 모델링을 지원 |
| 상속(Inheritance) | 부모 클래스를 상속받아 공통 속성을 재사용 |
| 컴포지션(Composition) | 한 클래스가 다른 클래스를 포함하는 관계 |
| 방언(Dialect) | 특정 DBMS에 맞는 SQL을 자동 변환 |
| JPA의 장점 | SQL 없이 객체 중심 개발 가능, 유지보수 용이 |
| JPA의 어려운 점 | 초기 학습이 어렵고, 성능 최적화 필요 |
📢 마무리
JPA는 객체 중심 개발을 가능하게 하며, OOP 개념을 그대로 반영할 수 있도록 모델링을 지원합니다.
또한, 방언(Dialect) 기능을 통해 특정 데이터베이스에 종속되지 않고, 자유롭게 변경 가능합니다.
하지만 처음 배우면 개념이 어렵게 느껴질 수 있지만,
한 번 익숙해지면 엄청나게 강력한 개발 도구가 됩니다!
https://getinthere.tistory.com/9
스프링부트 with JPA 1강 - 스프링이란!
1. 스프링이란? 스프링은 프레임워크이다. 스프링은 오픈소스이다. 스프링은 IoC 컨테이너를 가진다. 스프링은 DI 를 지원한다. 스프링은 엄청나게 많은 필터를 가지고 있다. 스프링은 엄청나게
getinthere.tistory.com
'스프링(Spring) 및 자바(JAVA)' 카테고리의 다른 글
| 스프링 부트 개념 정리 - 이론09 (0) | 2025.03.09 |
|---|---|
| 스프링 부트 개념 정리 - 이론08 (0) | 2025.03.09 |
| 스프링 부트 개념 정리 - 이론06 (0) | 2025.03.08 |
| 스프링 부트 개념 정리 - 이론05 (0) | 2025.03.08 |
| 스프링 부트 개념 정리 - 이론04 (1) | 2025.03.07 |