JPA가 무엇인가

강한친구·2022년 6월 28일
0

JPA

목록 보기
1/27

과거에는

과거 백엔드 개발에서 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

JPA에서는 sql문을 쓸 필요가 없다. EntityManager를 통해서 sql작성 없이 db에 query를 날릴 수 있다.

하지만 JPA는 어렵다.
실무에서 수십 개 이상의 복잡한 객체와 테이블을 사용하는데 이를 정확하게 매핑하는것이 어렵기 떄문이다.

그래서 이거 많이 쓰는가?

김영한씨의 분석에 의하면, 2015년 1월부터 최근 수치가 계속 증가, mybatis의 검색량을 많이 따라잡았다.
특히 글로벌 검색량은 jpa가 압도적이다.

최신 스프링 예제에서는 대부분 jpa를사용하고 있다.

SQL중심적 개발의 문제점

현 시대의 개발 트렌드는 객체를 관계형 DB에 관리하는 시대이다.
따라서 RDB가 알아들을 수 있는 SQL을 많이 작성하게 된다.
하지만 이는 비슷한 코드를 계속 반복작성하는 노가다성 작업에 가깝다.

만약, 필드가 추가되면, Query를 하나씩 다 수정해야하고 이러한 유지보수과정은 오류를 불러온다.

객체다운 모델링을 할 수록, 매핑 작업만 늘어난다
이에 객체를 자바 컬렉션에 저장하듯, DB 저장은 안될까 하는 고민이 나왔고 이를 해결하는것이 JPA이다.

JPA의 동작

JPA은 어플리케이션과 JDBC 사이에서 동작한다.
사용자가 JPA로 명령하면 JDBC에 JPA가 대신 명령해서 DB에 Query를 날려주는것이다.

JPA가 뭘 해결했는가?

기존의 객체지향 패러다임과 DB 패러다임이 다른 상황을 JPA라는 기능을 통해 페러다임이 통일되었다.

최적화기능

  1. 1차 캐시와 동일성 보장
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. 실무에서 아주 아주 약간의 조회 성능 상향이 있다.
    • DB Isolation Level이 Read Commit이여도 애플리케이션에서 Repeatable Read 보장한다.
  2. 트랙잰션을 지원하는 쓰기 지연
    • UPDATE, DELETE로 인한 Row락 시간 최소화하고, 커밋시 SQL 실행하고나서 바로 커밋해준다.
  3. 지연 로딩
    • 즉시로딩을 사용하면 연관된 모든 Join SQL로 한번에 연관된 모든 객체까지 미리 조화한다. 이는 낭비이다. 이를 방지하는 지연로딩이 존재한다.

JPA 쓰자

0개의 댓글