Spring boot

[Spring boot] 단방향, 양방향 매핑에 대한 이해 (1)

미로910 2024. 10. 1. 17:37

JPA는 객체지향적 접근 방식입니다.

  • SQL데이터베이스테이블 간 관계를 정의하는 언어입니다. 테이블과 테이블의 관계는 외래 키를 통해 설정되며, 주로 데이터베이스 관점에서 관리됩니다.
  • JPA객체 간의 관계를 정의하는 자바의 ORM(객체-관계 매핑) 기술입니다. JPA에서는 클래스객체를 사용해 테이블과 데이터 간의 관계를 표현합니다.

중요한 차이점은 SQL은 테이블 간의 관계를 직접 정의하는 반면, JPA는 객체지향적인 관계를 통해 테이블 간의 관계를 간접적으로 정의한다는 점입니다.

gradle 확인
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.10'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

application.yml
spring:
  application:
    name: demo

  server:
    port: 8080
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  
  jpa:
    hibernate:
      ddl-auto: create  # 하이버네이트의 DDL 자동 실행 옵션 설정

  h2:
    console:
      enabled: true  # H2 콘솔 웹 인터페이스 활성화 
      path: /h2-console  # H2 콘솔에 접근할 수 있는 경로 설정   
# 디버깅을 위한 로깅 설정
  logging:
    level:
      org:
        springframework:
          jdbc: DEBUG
        hibernate:
          SQL: DEBUG

 

JPA 사용해 보기
package com.example.demo.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Address {
	
	// @Id: 이 필드는 데이터베이스 테이블의 기본 키(primary key)를 나타냅니다.
	// 이 어노테이션은 해당 필드가 엔티티의 고유 식별자임을 나타내며, 
	// 데이터베이스 테이블에서 이 필드를 기준으로 레코드를 구분합니다.
	
	
	// @GeneratedValue(strategy = GenerationType.IDENTITY):
	// 이 어노테이션은 기본 키가 자동으로 생성되도록 설정합니다. 
	// GenerationType.IDENTITY 전략은 데이터베이스의 "AUTO_INCREMENT" 기능을 사용하여 
	// 기본 키 값을 자동으로 생성합니다. 
	// 따라서, 새로운 엔티티가 데이터베이스에 삽입될 때마다 
	// 고유한 ID 값이 자동으로 생성되고 할당됩니다.
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id; 
	private String city; 
	private String street; 
}

 

💡
JPA를 사용하여 객체-관계 매핑(ORM)의 개념을 이해하고, 단방향 및 양방향 매핑을 학습해보자.

객체-관계 매핑(ORM: Object-Relational Mapping)은 객체 지향 프로그래밍 언어 에서 사용하는 객체 간의 관계
 관계형 데이터베이스테이블 간의 관계로 변환하는 과정입니다. JPA는 이러한 객체 간의 관계를 데이터베이스에 적절히 매핑할 수 있도록 다양한 매핑 방식을 지원합니다.

 

매우 중요!!

참조 방향성(FK 에 주인은 누구)

  • 단방향 매핑 (Unidirectional Mapping): 한쪽에서만 참조하는 관계.
  • 양방향 매핑 (Bidirectional Mapping): 양쪽에서 서로 참조하는 관계.

엔티티 간 관계

  • 일대일 매핑 (One-to-One Mapping): 하나의 엔티티가 다른 하나의 엔티티와 연결되는 관계.
  • 일대다 매핑 (One-to-Many Mapping): 한 엔티티가 여러 엔티티와 연결되는 관계.
  • 다대일 매핑 (Many-to-One Mapping): 여러 엔티티가 하나의 엔티티와 연결되는 관계.
  • 다대다 매핑 (Many-to-Many Mapping): 두 엔티티가 서로 여러 개의 다른 엔티티들과 연결되는 관계.

User와 Address 사이의 One-to-One 관계를 SQL로 표현할 때, 외래 키(FK)는 User 테이블이 Address 테이블을 참조하는 방식으로 설정됩니다. 즉, User 테이블이 Address 테이블의 기본 키(PK)를 외래 키로 참조하게 됩니다. 이로 인해 User는 특정 Address와 연결되고, Address는 User에 대해 아무런 정보를 가지지 않게 됩니다.

 

💡
연관관계의 주인(FK를 가지는 클래스)

1. 참조 방향성과 연관관계의 주인:
● 단방향 매핑에서는 하나의 엔티티만 다른 엔티티를 참조하기 때문에, 외래 키(FK)를 누가 가지는지가 명확합니다. 한쪽이 다른 쪽을 참조하며, 참조하는 엔티티가 외래 키를 가집니다.
● 양방향 매핑에서는 두 엔티티가 서로를 참조합니다. 이때 데이터베이스에서는 한쪽만이 실제로 외래 키를 가지고 있어야 하므로, 어느 한쪽이 연관관계의 주인이 됩니다.

2. 연관관계의 주인은 FK를 관리하는 엔티티:
●연관관계의 주인은 데이터베이스 테이블에서 외래 키(Foreign Key)를 직접 관리하는 클래스입니다.
● 반면, 연관관계의 비주인(Non-owner)은 외래 키를 직접 관리하지 않으며, 주로 매핑된 관계를 반영할 뿐입니다. 비주인은 외래 키를 설정하거나 수정하지 않고, 단순히 주인의 관계를 조회합니다.