과거 백엔드 개발에서 DB에 데이터를 저장하려면, 순수 JDBC 기술만을 이용해서 수행해야했다.
public void create_Employee_info(Connection conn, String url, String user, String pwd)throws SQLException, ClassNotFoundException, IOException {
conn= null;
url = url;
user = user;
pwd = pwd;
// sb에 테이블생성 sql문을 담고 이를 실행하는 방식 테이블 내용은 보고서 참고
// 존재하지 않는 경우에만 생성해야한다
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url,user,pwd);
Statement stmt = null;
stmt = conn.createStatement();
StringBuilder sb = new StringBuilder();
String sql = sb.append("Create table if not exists Employee_info(")
.append("Eno varchar(255) not null primary key,")
.append("Ename varchar(255) not null,")
.append("Epnum varchar(255),")
.append("Email varchar(255),")
.append("Year Int")
.append(");").toString();
stmt.execute(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn != null && !conn.isClosed())
conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
예전에 작성한 JDBC 기반 DB 프로그램인데, 대충봐도 엄청 복잡하다는걸 알 수 있다 .
그 후, MyBatis같은 JDBCTemplate이 나오면서 많이 간단해지긴했지만, sql을 직접 써야하는건 변하지 않았다.
JPA에서는 sql문을 쓸 필요가 없다. EntityManager를 통해서 sql작성 없이 db에 query를 날릴 수 있다.
하지만 JPA는 어렵다.
실무에서 수십 개 이상의 복잡한 객체와 테이블을 사용하는데 이를 정확하게 매핑하는것이 어렵기 떄문이다.
김영한씨의 분석에 의하면, 2015년 1월부터 최근 수치가 계속 증가, mybatis의 검색량을 많이 따라잡았다.
특히 글로벌 검색량은 jpa가 압도적이다.
최신 스프링 예제에서는 대부분 jpa를사용하고 있다.
현 시대의 개발 트렌드는 객체를 관계형 DB에 관리하는 시대이다.
따라서 RDB가 알아들을 수 있는 SQL을 많이 작성하게 된다.
하지만 이는 비슷한 코드를 계속 반복작성하는 노가다성 작업에 가깝다.
만약, 필드가 추가되면, Query를 하나씩 다 수정해야하고 이러한 유지보수과정은 오류를 불러온다.
객체다운 모델링을 할 수록, 매핑 작업만 늘어난다
이에 객체를 자바 컬렉션에 저장하듯, DB 저장은 안될까 하는 고민이 나왔고 이를 해결하는것이 JPA이다.
JPA은 어플리케이션과 JDBC 사이에서 동작한다.
사용자가 JPA로 명령하면 JDBC에 JPA가 대신 명령해서 DB에 Query를 날려주는것이다.
기존의 객체지향 패러다임과 DB 패러다임이 다른 상황을 JPA라는 기능을 통해 페러다임이 통일되었다.