[JPA / DB] JPA 정의, Entity 관계모델(E-R Model)
서버개발

[JPA / DB] JPA 정의, Entity 관계모델(E-R Model)

JAVA JPA와 SPRING 개발을 동시에 공부하는 중 입니다. 간혹 내용이 섞여있을 수 있습니다.

 

SQL 위주의 개발의 문제점

# 지루한 코드의 무한 반복

string sql = "select name,tel from table";

// 클래스에 age 필드 추가 시

string sql = "select name, age, tel from table";

// 이와 같은 모든 sql에서 수정이 필요할 시 sql 관련 코드를 모두
// 변경해야 하므로 sql 의존적인 코드가 탄생

- 반복적인 CRUD SQL 작성과 객체를 SQL에 매핑하는 코드를 작성하는데 시간이 오래 걸린다 

 

#  객체 지향과 관계형 데이터베이스 간의 패러다임 불일치

- 객체지향적 특성과 관계형 DB의 원하는 설계 구조가 달라 매핑에 문제가 생김

- 객체 지향
객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.’ - 어느 객체지향 개발자
필드와 메서드 등을 묶어서 잘 캡슐화해서 사용하는 것이 목표
- 관계형 데이터베이스 (RDB)
데이터를 잘 정규화해서 보관하는 것이 목표

- Object를 RDB에 넣으려고 하니까 문제가 발생한다

 

# 객체와 관계형 데이터베이스의 차이

- 상속

객체는 상속 개념이 있으나, 관계형 데이터베이스는 없다. 유사한 Table 슈퍼타입-서브타입 관계가 존재한다

- 연관 관계

객체는 내부 필드에서 참조를 사용하여 연관 관게를 찾는다. 그러나 관계형 데이터베이스는 외래키를 사용하여 join 쿼리를 찾는다

 

 

JPA(Java Persistance API)란?

# 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세

- ORM(객체와 관계형 데이터베이스를 매핑해주는 것)

- SQL 작성없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주는 기술로 어플리케이션과 JDBC 사이에서 동작

- JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야한다 ( 하이버네이트, 이클립스링크, 등)

 

 

JPA를 사용하는 이유

# 생산성

- jpa를 활용하면 많은 쿼리를 직접 작성하지 않아도 JPA가 대신 처리해주어 생산성이 향상된다

// 저장
jpa.persist(member);

// 조회
Member member = jpa.find(memberId);

 

# 유지보수

- 필드가 추가되거나 삭제되어도 JPA가 관리해주니 수정해야할 코드가 SQL을 직접 다뤄야할 때보다 현저히 줄어든다

// SQL 방식

string sql = "select name,tel from table";
// 클래스에 age 필드 추가 시
string sql = "select name, age, tel from table";

// JPA 방식

Member member = jpa.find(memberId);
// 클래스에 age 필드 추가 시 (동일하다)
Member member = jpa.find(memberId);

 

# 패러다임 불일치 해결

- JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기 등과 같은 패러다임의 불일치 문제를 해결해준다

// In JPA

Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);

member1 == member2 // -> True

// 같은 트랜잭션 내에서 같은 memberId에 대하여 두 멤버는 동일하다

 

# 성능

- JPA 내부에서 다양한 성능 최적화 기회를 제공한다. 위와 같은 코드에서도 DB에서 같은 필드를 두 번 호출하지 않고, 한번만 데이터베이스에 SQL을 전달하고 두 번째는 조회한 회원 객체를 재사용한다

 

# 데이터 접근 추상화와 벤더 독립성

- 개발 도중 한 가지 데이터베이스에 종속되지 않고 변경에 용이하다

- 추상화된 데이터 접근 계층을 제공하여 애플리케이션이 특정 데이터 베이스 기술에 종속되지 않도록 한다

 

# 표준

- JPA는 자바 진영의 ORM 기술 표준이므로, 표준을 사용하면 다른 구현 기술로 손쉽게 변경할 수 있다.

 

 

개체(Entity)란?

# Entity의 정의

- 데이터의 집합을 의미한다.

- 저장되고, 관리되어야하는 데이터이다.

- 개념, 장소, 사건 등을 가리킨다.

- 유형 또는 무형의 대상을 가리킨다.

 

# Entity의 특징

- 식별자 : 유일한 식별자를 갖고 있어야 한다. ex) 주민번호, ID 등...

- 인스턴스 집합 : 2개 이상의 인스턴스가 있어야 한다.

- 속성 : 반드시 속성을 가지고 있어야 한다. ex) 학생에 학번, 이름, 주소 등...

- 관계 : 다른 엔티티와 최소 한 개 이상 관계가 있어야 한다. ex) 학생은 이름을 갖고 있음.

- 업무 : 업무에서 관리되어야 하는 집합이다. ex) 학생, 성적

 

# Entity의 종류

- 유형 Entity : 지속적으로 사용된다

- 개념 Entity : 물리적 형태가 없어 개념적으로 사용된다

- 사건 Entity : 비즈니스 프로세스를 실행하면서 생성된다

 

- 기본 Entity : 키 Entity라고 한다

- 중심 Entity : 기본 Entity와 행위 Entity의 중간으로, 기본으로 부터 발생되고 행위를 생성한다

- 행위 Entity : 2개 이상의 Entity로부터 발생된다

 

 

E-R 모델( Entity Relation Model )이란?

ER 모델은 요구사항으로부터 얻어낸 정보들을 개체(Entity), 애트리뷰트(Attribute), 관계성(Relation)으로 기술하는 데이터 모델을 말한다

 

 

E-R 모델 구성요소

# 개체 ( Entity ) 

- 개체란 단독으로 존재하는 객체를 의미하며, 동일한 객체는 존재하지 않는다

- 이 개체들의 집합을 Entity Type라고 하며 E-R 다이어그램에서 네모로 표현된다

 

# 속성 ( Attribute )

- 개체가 갖는 속성(필드)을 의미한다

- E-R 다이어그램에서 원으로 표현된다

 

# 관계 ( Relation )

- Entity Type간의 관계를 의미한다 ( 학생과 과목사이에서는 수강 관계 )

- E-R 다이어그램에서 마름모로 표현된다

 

 

E-R 모델 관계성

E-R 다이어그램을 설계하는 가장 큰 목적은 Entity Type을 정의하고 관계를 표현하는 것

Attribute를 통해 Entity Type을 정의했다면, 관계성을 통해 관계를 표현한다

2가지 제약조건을 명시함으로써 표현할 수 있다

 

# 카디널리티 비율 제약조건 ( Cardinality Ratio Constraint )

두 Entity Type에 대해, 한 개체가 얼마나 많은 다른 개체와 관련될 수 있는지를 나타내는 제약조건

- 일대일 ( 1 : 1 ) : 두 개의 개체가 서로 일대일로 대응

- 일대다 ( 1 : N ) : 하나의 개체가 다른 많은 개체들과 관련되지만, 역은 성립하지 않음

- 다대다 ( N : N ) : 하나의 개체가 다른 많은 개체들과 관련되며, 역 또한 성립

 

# 참여 제약조건 ( Participation Constraint )

두 Entity Type에 대해, 한 개체의 존재가 다른 개체의 존재에 의존하는지 여부를 나타내는 제약조건

- 전체참여 : 하나 또는 그 이상의 개체가 참여

- 부분참여 : 선택적인 참여

 

예를 들어, 학생은 과목을 꼭 수강 할 필요가 없지만 과목은 항상 수강생이 있어야 합니다.

수강생이 없는 과목은 폐강되기 때문

 

ER 모델에서 전체 참여는 두 개의 실선으로 부분 참여는 한 개의 실선으로 표현한다

 

 

# 구조적 제약조건 ( Structural Constraint )

앞서 살펴 본 두 개의 제약조건을 가리켜 구조적 제약조건이라 한다

구조적 제약조건은 관계를 맺는 두 Entity Type에 1, N, M을 표시하거나 한 줄 또는 두 줄을 표시하지 말고 Min, Max 방식으로 두 제약조건을 한 번에 표현하는 방식이다

 

예를 들어, 학생은 최소 3개, 최대 6개의 강의를 수강할 수 있으며, 강의는 최소 10명 최대 100명의 학생들이 들을 수 있을 때, 이를 ER 다이어그램으로 표현하면 다음과 같다

 

 

 

약한 개체(Weak Entity)와 식별 관계성 타입(Identifying Relationship Type)

# 약한 개체

- 자신의 Key 속성이 없는 Entity Type이다

- 타 테이블에 의존하는 개체는 약한 개체라 하며 존재하기 위해서는 타 개체 타입이 있어야한다

- ER 다이어그램에서 약한 개체는 두 개의 네모로 표현하고, 약한 개체의 key인 bun_no를 partial key( 부분 키 )라 한다

- ER 다이어그램에서 부분 키는 점선으로 된 밑줄로 표현합니다.

 

# 식별 관계성 타입

- Entity type이 약한 개체와 관계를 맺을 때는 식별 관계성 타입으로 표현하고, ER 다이어그램에서 두 개의 마름모로 표현합니다. 약한 개체는 항상 의존적이기 때문에 참여 제약 조건은 전체 참여( total participation )입니다.

 

 

출처 : https://victorydntmd.tistory.com/126

 

 

#스프링 프레임워크 #스프링 컴포넌트스캔 #JPA 정의 #JPA 이론 #JPA 사용 이유 #E-R다이어그램 #1:N관계 #1:1관계 #N:N관계 #약한 개체 #식별관계성타입 #Entity란 #Attribute란 #관계성이란