JPA와 ORM
음지(?)에 묻혀서 그다지 주목받지 못하고있는 JPA, ORM, 하이버네이트라는 개념에대해서 알아보겠습니다.
처음 SPRING을 공부할 때 DB연동이라면 Mybatis프레임워크만을 사용하는 줄 알았고, 실제로 전문학원에서도 Mybatis만을 배웠습니다. 그 이후 가끔 공고에서 JPA, ORM을 사용하는 기업들이 조금씩 보여서 JPA, ORM에대해서 찾아보다가 이렇게 포스팅하게 됐습니다.
JPA는 ORM을 사용하기위한 인터페이스를 모아놓은 것이며 JPA를 사용하기 위해서는 JPA를 구현한 하이버네이트같은 ORM 프레임워크를 사용해야 합니다. 결론적으로 Hibernate는 자바에서 사용하는 ORM프레임워크의 한종류입니다. 여기서 ORM이란 무엇일까요?
ORM은 객체와 DB테이블이 매핑을 이루는 것을 뜻합니다. 즉 객체가 테이블이 되도록 매핑 시켜주는 것을 말합니다.
ORM을 사용하면 SQL쿼리 사용없이 메서드로서 데이터를 조작할 수 있습니다. 예를들어 EMP테이블의 데이터를 출력하기 위해서는 쿼리를 사용하면 SELECT * FROM EMP를 사용하지만 ORM에서는 emp.findAll() 이라는 메서드를 통해서 데이터 출력이 가능합니다. 객체지향프로그래밍언어인 자바를 더욱 객체지향적으로 만들어주는 방식입니다.
query를 직접사용하지 않고 메서드 호출만으로 query가 수행되다 보니까, 생산성이 매우 높아집니다. 하지만 query가 복잡해지면 ORM에서는 세밀하게 작업하기에는 한계가 있다는 단점도 있습니다.
Mybatis와 Hibernate
JPA를 구현한 여러 ORM프레임워크가 있지만 현재는 Hibernate가 JPA의 주를 이루고 있습니다.
전세계적으로 Mybatis와 Hibernate중 어느것이 많이 사용되고있을까요? 우리나라 기준에서는 압도적으로 Mybatis사용량이 많지만 그것은 SI와 금융시장 중심으로 되어있는 우리나라 IT시장의 특성 때문에 그렇습니다. (배우거나 사용하기 쉽다는점도한몫..?)
그렇다면 JPA가 이렇게 전세계적으로(우리나라를 제외한) 주목받는 이유가 무엇일까요?
Mybatis는 테이블마다 반복적인 CRUD작업을 계속해야합니다. 또한 테이블과 DAO간의 의존성이 매우 높습니다. 만약 테이블에서 어떤 칼럼하나가 수정됐다고 가정했을 때 그 테이블을 사용하는 모든 SQL문을 수정해야합니다. 이작업이 소규모프로젝트에서는 넘어갈 수 있을 정도라고해도 대규모프로젝트가 되면 상당히 귀찮아지는 수준이 될겁니다. 심지어 객체지향적 특징을 사용하지않고 단순히 데이터 전달만을 목적으로 하여 객체지향 개발자들이 객체지향적으로 개발하지 못하게 만들고 있습니다.
그래서 결국 객체와 테이블을 매핑시켜줘서 객체지향적 개발을 가능하게 만들어주는 ORM이 주목받게 되었고 자바에서는 JPA라는 표준 스펙이 정의 되었습니다.
Hibernate의 장단점
장점
1. 생산성
Hibernate는 SQL을 직접 작성하지않고 메서드를 통해서 쿼리가 수행이 되기때문에 생산성이 매우높습니다.
하지만 SQL을 작성하지않는다고 SQL을 몰라서는 안됩니다. Hibernate가 수행한 쿼리를 콘솔에 출력해서 내가 원하는대로 쿼리가 잘 짜여져있는지 확인하려면 SQL에대해서 잘 알아야 합니다.
2. 유지보수
테이블의 칼럼이 하나 변경되었을 때 Mybatis는 모든 SQL문을 수정해주어야하지만 이러한 것들을 JPA가 대신해주어서 유지보수가 편리합니다.
단점
1. 세밀함
복잡한 쿼리를 작성해야할 때 메서드만으로 처리하기에는 세밀함이 부족합니다. 이때는 sql쿼리를 직접 작성할 수 있게 지원하고 있습니다.
우리나라 대부분이 사용하지않는 기술이지만 알아보니 정말 멋진 기술인 것 같습니다. 우리나라 기업들도 새로운 기술을 도입하는것을 적극적으로 시행했으면 좋겠습니다.
출처 : https://victorydntmd.tistory.com/195#comment11718244 블로그..
'Spring' 카테고리의 다른 글
Spring(17) - 웹 어플리케이션 구조 (0) | 2019.04.23 |
---|---|
Spring(16) - Mybatis연동 (0) | 2019.04.18 |
Spring(14) - 데이터베이스 연동(JDBC), 트랜잭션 (0) | 2019.04.17 |
Spring(13) - WebSocket (0) | 2019.04.16 |
Spring(12) - 파일업로드 (0) | 2019.04.16 |