JDBC
테이블 생성
CREATE table jdbc(
id int auto_increment primary key,
name char(5) null,
description char(20) null
)
connection 설정
static final String DB_URL = "jdbc:mysql://localhost/jdbc";
static final String USER = "??";
static final String PASS = "??";
static final String QUERY = "SELECT id, name, description FROM jdbc";
try {
Connection connection = DriverManager.getConnection(DB_URL + DATABASE_NAME, USER, PASSWORD);
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
}
데이터 삽입
final String DB_URL = "jdbc:mysql://localhost:3306/";
final String DATABASE_NAME = "jdbc";
final String USER = "????";
final String PASSWORD = "????";
final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
try {
Class.forName(DRIVER_NAME);
Connection connection = DriverManager.getConnection(DB_URL+DATABASE_NAME,USER,PASSWORD);
System.out.println(connection);
Statement statement = connection.createStatement();
final String dropTableQueryIfExists = "create table todo (val INT)";
statement.execute(dropTableQueryIfExists);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
위 예시로 알아본 JDBC의 특징
- sql문을 하나씩 다 작성해야한다는 점
- Connection 객체 관리 (수동으로 열고 닫기)
- statement나 preparedstatement, resultset를 통해 sql을 전달하고 결과를 받아야 했음
JPA
- 그림 처럼 JPA는 Java Application과 jdbc api 사이에서 매개하는 역할
- sql 구조를 생각하지 않고 Java Application을 설계하는 방식으로 데이터에 접근
장점
- sql문을 적을 경우가 적어짐
- sql 구조를 java application내에서 적용하지 않아도 됨
- ex) 테이블 간의 참조를 해주려면 참조하려는 테이블의 pk가 fk로 필요하게 된다
단방향 매핑 A -> B
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@Column(name = "USERNAME")
private String username;
}
@Entity
private class Team{
@Id @GeneratedValue
private Long id;
@Column(name = "NAME")
private String name;
}
양방향 매핑 A <=> B
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@Column(name = "USERNAME")
private String username;
}
@Entity
private class Team{
@Id @GeneratedValue
private Long id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
}
- JPA(java persistence api)는 자바 진영의 ORM 기술 표준
- JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
- JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다.
- JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로 인해 효율성이 떨어진다.
- 이 때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는 점에서 생산성을 크게 높인다.
ORM(객체 관계 매핑)
- ORM(Object-Realational Mapping)은 객체와 관계형 DB를 매핑한다는 뜻
- ORM 프레임워크를 사용하면 객체를 마치 자바 컬렉션에 저장하듯 저장할 수 있고, 이에 대해 ORM 프레임워크가 적절한 SQL을 생성해서 DB에 객체를 저장해준다
- 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
- ORM 프레임워크가 중간에서 매핑해준다
Hibernate
- 자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크