본문 바로가기

IT/Spring

[Spring Boot] Hibernate 연동 방법

1. Hibernate란

  • Boss에서 개발한 ORM(Object Relation Mapping)프레임워크 중 한개입니다.
  • ORM이란 객체와 DB 테이블의 매핑을 의미합니다.
  • ORM 매핑을 이용하면 객체로 DB 테이블 조작할 수 있습니다.

2. pom.xml

     ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
        </dependency>
      ... 
  • Spring Boot 버전 - 2.1.0.RELEASE
  • hibernate-core-5.3.7.Final

프로젝트 구조

 


3. application.yml

spring :
    datasource :
        url : jdbc:mysql://localhost:3306/db_name
        username : (DB User Name)
        password : (DB Password)
    jpa :
        properties :
            hibernate :
                format_sql:true
        show-sql : true        
        hibernate :
            ddl-auto : update    
            # ddl-auto - @Entity 테이블 정보를 실제 DB에 반영 할건지 설정(create/update/none..)

 


4. User.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(length = 20, nullable = false)
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • @Entity 어노테이션은 해당 클래스가 DB Table과 1:1 매핑이 될 수 있게 합니다.
  • @Id - Primery Key 지정
  • @GeneratedValue(strategy = GenerationType.IDENTITY) - 기본키 생성을 DB에게 위임합니다.
    Mysql에 경우, AUTO_INCREMENT를 사용합니다.
  • @Column(length = 20, nullable = false) - 테이블 컬럼을 선언합니다. (길이 20, null을 허용하지 않음)
  • 위 클래스 생성 후, 서버를 실행 시키면 실제 DB에 해당 테이블에 대한 정보가 반영됩니다.

서버 구동 시 아래와 같이 로그에 user테이블 생성 로그가 남았다면, 실제로 테이블이 생성되었는지 확인


5. UserDao.java 생성

import com.example.bamdule.model.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserDao extends JpaRepository<User, Integer> {

}

6. UserController.java 생성

import com.example.bamdule.dao.UserDao;
import com.example.bamdule.model.entity.User;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping(value = "/save")
    @ResponseBody
    public List<User> saveUser(User user) {
        userDao.save(user);
        
        return userDao.findAll();
    }
}
  • user save 요청 추가
  • "/user/save" 요청 받는 유저를 DB에 저장하고, 유저 리스트를 반환합니다.
  • host/{contextPath}/user/save?name=park

브라우저에 위와 같은 응답이 왔으면 하이버네이트가 정상 동작 하는 것입니다.