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란 #관계성이란
'서버개발' 카테고리의 다른 글
[Spring / JPA] Querydsl 기본 세팅 (0) | 2022.03.09 |
---|---|
[Spring / JPA] 프로젝트 설계를 위한 어노테이션 (0) | 2022.02.14 |
[Spring] 빈 생명주기( Bean Lifecycle, Scope ), AssertThat 기능 (0) | 2022.01.23 |
[Spring] 싱글톤과 컴포넌트스캔, 메타 어노테이션 (0) | 2022.01.19 |
[Spring] Spring 프레임워크와 Bean 등록, 컴포넌트 어노테이션 (0) | 2022.01.16 |