스프링(Spring) 및 자바(JAVA)

스프링 부트 개념 정리 - 이론07

Dev.99_tale 2025. 3. 8. 18:15

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