티스토리 뷰

1. Hibernate Configuration file 추가

(1) Hibernate 개발 과정

 1) hibernate configuration file 추가

 2) Java class에 annotation추가

 3) database operation 수행을 위해 Java code 작성

 

아래 코드를 src폴더 안에 저장한다. 

source directory의 root에 저장하는 이유는 hibernate가 이 config file을 사용가능하게 만들어 주는데 그냥 간단하게 하기 위해서 이 위치에 놓는것이지 다른 특별한 이유는 없다.

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- JDBC Database connection settings -->
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false&amp;serverTimezone=UTC</property>
        <property name="connection.username">hbstudent</property>
        <property name="connection.password">hbstudent</property>

        <!-- JDBC connection pool settings ... using built-in test pool -->
        <property name="connection.pool_size">1</property>

        <!-- Select our SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Echo the SQL to stdout -->
        <property name="show_sql">true</property>

		<!-- Set the current session context -->
		<property name="current_session_context_class">thread</property>
 
    </session-factory>

</hibernate-configuration>

 - Configuration file은 기본적으로 hibernate에게 어떻게 database에 연결하는지를 말해준다.

hibernate가 database와 소통을 위해 JDBC를 백그라운드에서 사용하는데, config file의 대부분은 JDBC configuration이다.

 - session factory의 역할 : database 연결을 위해 session object를 얻는것을 가능하게 해준다. JDBC database connection setting을 하는것이 정말 중요하다.

 - Hibernate는 또한 가장 기본적인 JDBC connection pool이 있는데, 이것을 1로 설정해주는 이유는 간단한 java app이기 때문이다(나중에 다시 다룰것이기 때문에 이정도만으로 넘어감..)

 - SQLdialect를 설정해 주는 이유 : SQL이 기준이지만, 각 database마다 약간씩 다른 dialect가 있다. 따라서 여기서 우리는 MySQLDialect를 통해서 hibernate가 SQL을 생성했을때, MySQL에 말하는 방법을 설정해주는 것이다.

 - show the sql을 설정해주는것 : true로 설정해주면 hibernate가 실행될때, 실제 database에 넘겨줄때 hibernate가 사용하게 될 SQL문을 출력할 것이다. (개발과 테스트에 매우 유용함)

 - current session context class of thread : 실제 session context가 threaded model을 사용 할 것이다 라는 것.

 - 다른 session-factory에서 설정할 수 있는것이 많지만, 위에서 설정한것이 핵심 요소이다.

 

 2. Java class에 annotation추가

 

(1)Entity class

 : database table과 매핑된 자바 클래스에 대한 이름. plain old java class에 getter와 setter가 있는것. annotation을 추가해서 database 테이블과 매핑이 가능하게 돕는데, 이러한 database와 매핑된 자바 클래스를 entity class라고 한다. 

 

(2) Mapping을 위한 두가지 옵션

Java class와 그에 속한 field들을 hibernate를 통해서 database의 table과 column에 각각 매핑하고 싶을때, 방법은 두가지 방법이 있다.

 1) Option 1 : XML config file 이용 (legacy)

 2) Option 2 : Java annotation 이용 (modern, preferred)

하지만 여기선 1번은 다루지 않을것이다. 인터넷에 검색하면 방법이 나오고 요즘에는 잘 안쓰인다고 한다. 

package com.luv2code.hibernate.demo.entity;

// java persistence API(standard interface that hibernate implements)
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity // class mapped to table
@Table(name="student")
public class Student {
	
	// field set up & map fields to database columns
	@Id //primary key 추가
	@Column(name="id") // database의 어떤 column과 mapping할것인지
	private int id;
	
	@Column(name="first_name")
	private String firstName;
	
	@Column(name="last_name")
	private String lastName;
	
	@Column(name="email")
	private String email;

	public Student() {
		
	}
	// 필수는 아니지만  나중에 사용할 편리한 constructor를 만들어 준다. id를 체크안하는 이유는 나중에 안사용할것이기 때문에.
	public Student(String firstName, String lastName, String email) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.email = email;
	}
	// generate getters and setters
	...
	// generate toString(for debugging purposes)
	@Override
	public String toString() {
		return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
	}	
	
}

 - 위와 같이 Student객체를 src 폴더안의 com.luv2code.hibernate.demo.entity안에 생성하였다,

a. Step 1 : database table에 class 매핑

 - @Entity : 이 클래스를 database table에 매핑할것이라는 표시

 - @Table(name=table이름) : 위의 코드에서는, student라는 table에 이 클래스를 매핑하겠다는 의미.

b. Step 2 : database column에 필드를 매핑

 - @Id : primary key를 주는것

 - @Column(name=column이름) : 필드와 database column을 연결해준다. 

 - 필드이름과 db 칼럼이름이 같을 필요는 없다. (자바는 보통 camel case, db는 snake case를 사용하기 때문)

 - @Column attribute를 자바 필드이름과 db 칼럼이름이 같다면 안해줘도 된다. hibernate가 자동으로 해주기때문에. 하지만 명시해주는것이 좋다.

 

지금까지 자바 annotation까지 추가 했고, database 작동을 위해 자바코드를 작성해야 하는데, 이것은 다음 게시물에서 CRUD별로 정리하여 다루도록 하겠다.

 

* Annotation 사용시 Hibernate가 아닌 JPA annotation을 사용하는 이유

 : JPA는 표준 specification이고 Hibernate는 이 JPA specification을 구현한것이다. Hibernate는 모든 JPA annotation들을 implement하는데, Hibernate team은 JPA annotation을 사용하는 것을 최고의 방법(best practice)으로서 추천한다.

참고 : www.dineshonjava.com/hibernate/hbm2ddl-configuration-and-name/를 통해서 Hibernate로 db table 만든는법 

 

hbm2ddl Configuration and Name Annotations in Hibernate - Dinesh on Java

Here we will learn about hbm2ddl Configuration in the hibernate configuration file (hibernate.cfg.xml). Actually hbm2ddl Configuration means hibernate mapping to create schema DDL (Data Definition Language). Advertisements          

www.dineshonjava.com

 

* JPA(Java Persistence API)란 : DB 테이블과 자바 객체 사이의 매핑을 처리해 주는 ORM 기술의 표준이다. 따라서 JPA에는 객체와 DB사이의 매핑을 어떻게 설정하고 어떻게 동작해야하는지를 포함하고 있다.

즉, 자바 클래스와 DB 테이블을 매핑하는 기술이라는 뜻이다. 이것을 implement한 한 종류가 바로 hibernate이다.

출처 : dev-troh.tistory.com/150

 

JPA란

실무에서 JPA를 사용하고 있는데 올바르게 사용하고 있는지 확신이 들지않아 최근에 공부를 시작했습니다. "JPA 프로그래밍 입문"이란 책을 읽고 공부하며 제가 이해한 내용을 정리하는 곳이니

dev-troh.tistory.com

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday