yoncho`s blog
[JDBC, JPA, MyBatis] JAVA 기반 DB 연결 본문
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>
'기술, 나의 공부를 공유합니다. > [Web][BE] JAVA' 카테고리의 다른 글
선박모니터링 - Vessel Monitoring (1) | 2024.02.24 |
---|---|
[JavaScript] Prototype (*JS에서 Class처럼 사용됨) (1) | 2023.10.18 |
[JAR/ WAR] 설명, 그리고 ..[더보기] (0) | 2023.10.16 |
[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml ) (0) | 2023.10.14 |
[Plugin Setting & Jenkins Build] 배포 준비 과정 (0) | 2023.10.11 |