끄적끄적 코딩일지

[Spring 기초] Hibernate 다루기 본문

Spring

[Spring 기초] Hibernate 다루기

BaekGyuHyeon 2022. 6. 5. 19:46

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