yoncho`s blog

[JDBC, JPA, MyBatis] JAVA 기반 DB 연결 본문

기술, 나의 공부를 공유합니다./[Web][BE] JAVA

[JDBC, JPA, MyBatis] JAVA 기반 DB 연결

욘초 2023. 11. 8. 21:01

Flow :

[ Spring JDBC ]  >  [ JPA ]  > [ Spring JPA ]  > [ Hibernate ]

 

목차 : 

1. Spring JDBC

2. JPA

3. Spring JPA

4. Hibernate - JPA 구현체

5. MyBatis


#1. Spring JDBC

JDBC는 Java DataBase Conneticity 의 약자로 데이터베이스에 접속할 수 있는 API이다.

JAVA로 CRUD가 가능하며 Query문을 String 형태(틀)를 이용해 데이터를 주고받는다.

하지만 String 이라 입력 오타 예외 처리가 고려되지 않았고 Query 코드가 많아진다는 단점이 있다.

 

1-1. Feature

JdbcTemplate 를 이용해 미리 정의한 Query문을 호출하고 필요한 인자를 넘겨준다.

 

1-2. Usage

//Repository

@Autowired
private JdbcTemplate springJdbcTemplate;

//query string
private static String INSERT_QUERY =
	"""
    	insert into TABLE (x, y, z)
        values (?, ?, ?);
    """;
 
 public void insert(Vo vo){
 	springJdbcTemplate.update(
    	INSERT_QUERY, 			//query
    	vo.getNo(),				//1st param
        vo.getName(),			//2nd param
        vo.getContents()		//3rd param
   );
 }

 

 

#2. JPA

JPA는 Java Persistence API의 약자로 자바 기반 객체 관계 매핑(ORM)을 위한 표준 API이다.

별도 JAVA코드나 Query문 작성은 없고 Entity와 EntityManager에 의존한다. 객체와 데이터베이스 간 매핑 처리로 많은 오버헤드가 발생하며 세밀한 제어가 불가능하다.

 

2-1. Feature

JPA는 Entity와 EntityManager를 사용해 편리하게 Query를 처리하며 EntityManager는 기본적으로 merge(insert), find 등 제공해주는 Query 함수가 많다. 단, EntityManager는 Transation기능이 별도로 없어서 Repository에 @Transactional 을 붙여야한다.

 

2-2. Usage

//vo
// Entity Annotation 사용, Id는 PK를 뜻함, Column은 table 요소를 뜻함.
@Entity
public class Vo {
	@Id
	private long no;
    
    @Column(name="name")
    private String name;
    
    @Column(name="contents")
    private String contents;
 
   	//getter...
    //setter...
}


//repository
@Repository
@Transactional
public class Repository{

    @PersistenceContext //@Autowired 보다 더 구체적인 어노테이션 사용임.
    private EntityManager entityManager;  //jakarta
    
    public void insert(Vo vo){
    	entityManager.merge(vo);		//merge가 insert 기능을 수행, 단 vo는 Entity 등록 작업 필요.
    }
    
    public Vo findById(long id){
    	return entityManager.find(Vo.class, id); //Vo객체로 id에 해당하는 Vo객체를 return 해준다.
    }
    
    public void deleteById(){
    	Vo deleteVo = entityManager.find(Vo.class, id);
        entityManager.remove(deleteVo);
	}
}

 

 

#3. Spring Data JPA 

Spring Data JPA는 JPA와 Spring Framework를 함께 사용해 데이터 액세스 계층을 더 쉽게 구축할 수 있다.

 

3-1. Feature

Spring Data JPA는 JpaRepository interface를 구현해줘야한다. 

JpaRepository<TargetVo, Id Type>로 Vo와 Id(PK) Type을 지정해줘야하며 interface에서 기본적으로 제공해주는 query 함수들이 많고 사용자가 직접 네이트비 Query문 작성도 가능하다. JPA보다 편리하게 이용할 수 있다.

 

3-2. Usage

//interface
public interface SpringDataJpaRepository extends JpaRepository<Vo, Long>{
	// 구현만 하면 끝.
    
    // 특정 객체로 탐색하는 Query 함수 추가
    List<Vo> findByName(String name);
}

//entity
public vo ...

//component
@Autowired
private SpringDataJapRepository repository;

repository.save(new Vo(...));
repository.findById(1L);		//기본 제공
repository.findAll();			//기본 제공
repository.deleteById(1L);		//기본 제공
repository.count();				//기본 제공 select count(*) 과 동일
repository.findByName('yoncho')	//추가 함수

 

 

#4. Hibernate vs JPA 

4-1. Feature

JPA는 기술 명세 API이다. Interface와 비슷하고 @Entity를 사용해 Entity를 정의할 수 있다. 

Entity안에서 @Id로 PK를, @Column으로 Table Column값을 지정할 수 있다.
즉, JPA는 Entitiy Mapping방법, 속성 Mapping방법, EntityManager 활용 방법을 정의한다.

 

Hibernate는 JPA 구현체 중 제일 인기있다. JPA는 객체를 테이블로 매핑하는 방식을 정의하고, 그걸 구현하는게 Hibernate이다. 

 

코드에선 항상 Hibernate로 사용하는 것보다 JPA(jakarta)로 사용하는게 좋다. 

 

 

#5. MyBatis

JDBC로 데이터베이스 연결 작업을 캡슐화, 일반 Query, 저장 프로시저 및 고급 매핑 지원

JDBC 코드 및 매개 변수 중복 작업 제거, Query를 한 파일로 구성할 수 있다.

 

5-1. Feature

복작/Dynamic한 Query에 강하고 코드와 Query를 분리시킬 수 있다. 빠른 개발이 가능하다.

SpringBoot 기준으로 application.yml에서 datasource(데이터베이스 연결 정보), mybatis config file path 을 명시

config file에서 Vo와 Query file 을 연결해 환경을 구성한다.

 

5-2. Usage

//Spring Boot 기준

### application.yml
...
spring:
	#datasource
	datasource:
	driver-class-name: org.mariadb.jdbc.Driver
	url: jdbc:mariadb://192.168.0.181:3307/jblog?charset=utf8
	username: jblog1
	password: jblog
	hikari:
		minimum-idle: 10
		maximum-pool-size: 20

# mybatis
mybatis:
	config-location: classpath:mybatis/configuration.xml
...

### mybatis/configuration.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="com.poscodx.jblog.vo.UserVo" alias="uservo"/>
	</typeAliases>
	<mappers>
		<mapper resource="mybatis/mappers/user.xml" />
	</mappers>
</configuration>

### mybatis/mappers/user.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="user">
	<insert id="insert" parameterType="uservo">
		<![CDATA[
		insert 
		into user 
		values (#{id},#{name},password(#{password}))
		]]>
	</insert>
</mapper>

 

 

  

Comments