-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNote.txt
139 lines (114 loc) · 5.83 KB
/
Note.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
JPA 김영한님의 강의 내용 메모
- JPA가 직접 DB TABLE 를 만들수 있다. (JPA를 통해서)
- DDL을 애플리케이션 실행 시점에 자동 생성
- 태이블 중심 -> 객체 중심
- DB 방언을 활용해서 DB에 맞는 적절한 DDL 생성
- 이렇게 !생성된 DDL은 개발 장비에서만 사용!
- 생선된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
# JPA에서 가중 중요한 2가지
- 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping)
- 영속성 컨텍스트
# 데이터베이스 스키마 자동 생성하기
- hibernate.hbm2ddl.auto
- create : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
- create-drop : create와 같으나 종료시점에 테이블 DROP
- update : 변경분만 반영(운영DB에는 사용하면 안됨) (alter table 반영 가능)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 (개발정도에서 쓰면 괜찮음)
- none : 사용하지 않음
- persistence.xml 에 옵션으로 설정 ex) <property name="hibernate.hbm2ddl.auto" value="create"/>
- !운영 장비에는 절대 create, create-drop, update 사용하면 안된다
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
# @Entity 속성
@Column
- name : 필드(DB 필드)와 매핑할 테이블의 컬럼 이름
- insertable, updateable : 읽기전용
- nullable : null 허용여부 결정, DDL 생성시 사용. ex) nullable=false (not null)
- unique : 유니크 제약 조건, DDL 생성시 사용
- length : 길이 제한
@Temporal
- @Temporal(TemporalType.DATE) //날짜
- @Temporal(TemporalType.TIME) //시간
- @Temporal(TemporalType.TIMESTAMP) //날짜와 시간
@Enumerated
- 열거형 매핑
- @Enumerated(EnumType.ORDINAL) : 순서를 저장(기본값)
- @Enumerated(EnumType.STRING) : 열거형 이름을 그대로 저장, 가급적 이것을 사용
@Lob
- CLOB(캐릭터), BLOB(바이트) 매핑
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
- @Lob private String lobString;
@Lob private byte[] lobByte;
@Transient
- 이 필드는 매핑하지 않는다.
- 애플리케이션에서 DB에 저장하지 않는 필드
# 식별자 매핑 방법
@Id : 직접매핑
- IDENTITY : 데이터베이스에 위임, MYSQL
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE
@SequenceGenerator 필요
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator 필요
- AUTO : 방언에 따라 자동 지정, 기본값
- 기본 키 제약 조건 :null 아님, 유일, 변하면 안된다.
- 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.
- 예를 들어 주민등록번호도 기본 키로 적절하지 않다.
- 권장: Long + 대체키 + 키 생성전략 사용
# 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이런 큰 간격이 있다.
# 연관관계 매핑 이론
#단방향 매핑
[객체 연관관계]
Member(TABLE) -------> Team(TABLE)
id 0..1 id
┌- Team team name
| userName
|
|
| [연관관계매핑] 설정
| @ManyToOne //다:1
| @JoinColumn(name = "TEAM_ID") // MEMBER 테이블의 TEAM_ID와 MEMBER 객체의 TEAM_ID를 매핑한다.
| private TEam team;
|
|
| [테이블 연관 관계]
| Member(TABLE) 다:1 Team(TABLE)
| MEMBER_ID (PK) ┌--1 TEAM_ID (PK)
└-> TEAM_ID (FK) 다----┘ NAME
USERNAME
#양방향 매핑
- 양방향 매핑시 연관관계의 주인에 값을 입력해야 한다.
(순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력해야 한다.)
- 누구를 주인으로?
- 외래 키가 있는 곳을 주인으로 정해라
- 여기서는 Member.team 이 연관관계의 주인
# 양방향 매핑의 장점
- 단방향 매핑만으로도 이미 연관관계 매핑은 완료
- 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐
- JPQL에서 역방향으로 탐색할 일이 많음
- 단방향 매핑을 잘 하고 양방향은 필요할 때 추가해도 됨 (테이블에 영향을 주지 않음)
[객체 연관관계]
Member(TABLE) <---------> Team(TABLE)
id * 0..1 id
┌- Team team name
| userName List members
|
|
| [연관관계매핑] Team 테이블에 설정
| @OneToMany(mappedBy = "team")
| private List<Member> members = new ArrayList<Member>();
|
|
|
| [테이블 연관 관계]
| Member(TABLE) 다:1 Team(TABLE)
| MEMBER_ID (PK) ┌--1 TEAM_ID (PK)
└-> TEAM_ID (FK) 다----┘ NAME
USERNAME
#JPA 내부구조
#영속성 컨텍스트
#프록시와 즉시로딩, 지연로딩