일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Anolog
- Hibernate
- 생명주기 콜백
- Project
- server send event
- flask
- bean
- Java
- JPA
- javascript
- google oauth
- jenkins
- hanghae99
- spring
- oauth
- 항해99
- web
- real time web
- Stream
- SseEmitter
- python
- jQuery
- WIL
- html
- cookie
- Spring Security
- DI
- JWT
- session
- programmers
- Today
- Total
끄적끄적 코딩일지
[Spring 기초] Hibernate 다루기 본문
Hibernate 란?
JPA으로 구현된 대표적인 ORM 프레임워크이며 Spring에서는 기본적으로 Hibernate를 사용해서 Database와 CRUD를 수행한다.
JPA란?
2022.06.01 - [Spring] - [Spring 기초] JPA 사용하기
[Spring 기초] JPA 사용하기
JPA란? Java Persistance API의 약자로 ORM(Object-Relational-Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. Java를 사용해서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로써 SQL를
blablacoding.tistory.com
ORM(Object-Relational Mapping)
일반적으로 알고 있는 Class와 database의 Table을 연결한다는 의미이며, Java의 Class를 RDB(Relational Database, 관계형 데이터베이스)의 Table으로, 해당 Class가 가지고 있는 속성을 Column으로, 객체 들을 Table의 Row으로 연결해준다. JPA를 구현한 ORM 프레임워크중 대표적으로 Hibernate가 있다.
Hibernate Entity 연관관계 설정하기
Entity를 설계하다보면 Entity 하나가 다른 Entity를 참조하고 있을수도 있다. Hibernate는 이를 처리하여 외래키으로 생성되도록 처리하거나 Mapping Table을 생성하여 Entity 데이터를 조회할때 참조하고 있는 다른 Entity정보도 함께 조회해서 사용자가 따로 조회할 필요가 없도록 해준다.
@OneToMany
1: n 관계를 나타낼때 사용.
학교를 예로들면 학년/반이라는 Entity가 있고 학년/반 데이터에 학생 Entity 정보를 저장하려면 한개의 학년/반 데이터는 여러개의 학생 Entity를 저장할 수 있어야 한다. 단 이때 한 학생 데이터가 두개 이상의 학년/반 데이터에 들어가지 못하므로 1:n 관계이다.
@Entity
public class ClassRoom{
...
@Column
int grade;//학년
@Column
int number; // 반
@OneToMany
List<Student> students; // 학생
}
@Entity
public class Student{
...
@Column
String name;// 이름
@Column
String gender; // 성별
}
@ManyToOne
n:1의 관계를 나타낼때 사용
위와 같이 학교를 예를 들면 학생 데이터에 학년/반 데이터를 저장하려고 한다. 여러개의 학생 데이터는 한개의 학년/반 데이터만 지정해야 하므로 n:1의 관계이다.
@Entity
public class ClassRoom{
...
@Column
int grade;//학년
@Column
int number; // 반
}
@Entity
public class Student{
...
@Column
String name;// 이름
@Column
String gender; // 성별
@ManyToOne
ClassRoom classroom; // 학년/반
}
@OneToOne
1:1의 관계를 나타낼때 사용
예를들어 학생정보 Entity에 이름, 현 주소지, 성별, 나이등을 나타내는 개인정보 Entity를 저장할때 학생 데이터 하나에 한개의 개인정보만 들어갈 수 있으므로 1:1 관계이다.
@Entity
public class Student{
...
@OneToOne
@JoinColumn
PersonalInfo personalinfo;
}
@Entity
public class PersonalInfo{
...
@Column
String name;
@Column
int age;
@Column
String address;
...
}
@ManyToMany
n:n 관계를 타나낼때 사용
학생과 강의 Entity를 보았을대 한 학생이 여러 강의를 들을수도 있고 한 강의를 여러 학생이 들을수도 있어야 하므로 n:n 관계이다.
@Entity
public class Lecture{
...
@ManyToMany
public List<Student> students;
}
@Entity
public class Student{
...
@ManyToMany
public List<Lecture> lectures;
}
@JoinTable
Database에서 연관관계를 별도의 Table으로 관리하도록 하는 방식(Mapping Table 방식) Hibernate는 기본적으로 JoinTable 방식으로 연관관계를 생성한다.
@JoinColunm
Database에서 연관관계를 외래키를 사용해서 해당 Table의 Column으로 관리하는 방식
Column에는 리스트 형식이 들어갈 수 없어 OneToMany나 ManyToMany에는 사용하지 못한다.
Hibernate SQL
Jpa를 사용하면 Query를 사용하지 않고도 JpaRepository에서 CRUD를 수행할 수 있다. 하지만 복잡한 쿼리를 구현하지는 못하므로 Hibernate 상에서 Query를 어떻게 사용하는지 알아야 할 필요가 있다.
@Entity
public class Person{
@Id
@GeneratedValue(strategy=StrategyType.IDENTITY)
private long id;
@Column
private String name;
@Column
private String phoneNumber;
@Column
private boolean isMale;
}
위와같은 Entity가 있다면 Hibernate 에서 해당 Entity를 다루는 Query를 작성하는 예시를 보면
Select this_ from Person this_ where this_.id = 5 -> id = 5 인 Person 데이터 조회
Select a.id from Person a where Len(a.name) < 10 -> name의 길이가 10 이하인 Person데이터들의 Id값 조회 (List<Long 반환>)
: 조회하고자 하는 Entity class 이름(Table)
: SQL 기본 문법(Select, insert, delete, update , from , where 등..)
: Entity의 인스턴스를 할당해서 Query 내에서 사용 가능하도록 한다. (Person as this_ 와 똑같은 역할을 한다.)
: Entity의 속성을 의미
다른 연관관계의 Entity를 참고할 수 도 있다.
@Entity
public class Company{
@Id
@GeneratedValue(strategy=StrategyType.IDENTITY)
private long id;
@Column
private String companyName;
@OneToOne
@JoinColumn
private Person ceo; // 회사 ceo
@OneToMany
private List<Person> managementTeam; // 영업팀
@ManyToOne
private Person accountant; // 회계사
}
Select this_ from Company this_ where this_.ceo.name='James' -> ceo 이름이 James인 Company 데이터 조회
Select this_ from Company this_ where this_.accountance.id = 7 -> 회계사의 id 가 7인 Company 데이터 조회
Select this_.ceo from Company this_ join this_.managementTeam as m where m.name='Fred' -> managementTeam중 이름이 Fred인 사람을 포함하고 있는 회사의 ceo 데이터 조회
위에서처럼 다른 연관관계에 있는 데이터를 조회할때는 . 을 사용하여 구분한다.
'Spring' 카테고리의 다른 글
[Spring 기초] Bean 생명주기 콜백 (0) | 2022.06.06 |
---|---|
[Spring 기초] MVC 패턴 (0) | 2022.06.05 |
[Spring 기초] Spring Security 사용하기 (0) | 2022.06.04 |
[Spring 기초] JPA 사용하기 (0) | 2022.06.01 |
[Spring 기초] @Qualifier, @Primary (0) | 2022.05.30 |