-
많이 들어본 DB 기술 정리database 2022. 1. 16. 14:25
내가 속한 조직은 Spring을 사용하고 있고, DB 기술로는 mybatis와 JPA를 사용하고 있다. 아직까지는 내가 맡은 일에서 mybatis를 더 많이 사용하고 있고, JPA는 간단한 업무나 해봐서 기초적인 코드만 이해하는 수준이다. 어찌저찌 일은 해나가고 있지만, DB 기술에 대한 이해가 너무 얕아서 늘 약간의 불안함을 가지고 있었다.
이 글로써 앞으로 DB 기술을 공부하겠다는 계획에 운을 띄워보려고 한다. 그동안 많이 들어봤던 용어들의 의미를 간단하게 정리하는 것이 목적이다.
(얕게나마 개념을 정리하다 보니 머릿속에 떠오르는 키워드는 추상화였다. 컴퓨터과학/공학에서 기술이 발전해가는 과정을 보다보면 추상화의 아름다움을 느낄 수 있다.)
JDBC
JDBC는 Java Database Connectivity의 줄임말이며, DB에 연결하고 쿼리를 실행하기 위한 API이다. JDBC driver은 각 DB마다 JDBC API를 구현한 것이며, 해당 DB(mysql, oracle, postgresql 등)에 연결하는 역할을 담당한다.
대략 다음과 같은 코드로 connection을 얻고, SQL 구문을 실행한다. (코드는 여기를 참고함)
try (Connection con = DriverManager.getConnection("jdbc:mysql:url", "username", "password")) { try (Statement stmt = con.createStatement()) { try (ResultSet result = stmt.executeQuery("SELECT * FROM employees")) { while (result.next()) { Employee emp = new Employe(); emp.setId(resultSet.getInt("emp_id")); emp.setName(resultSet.getString("name")); emp.setPosition(resultSet.getString("position")); emp.setSalary(resultSet.getDouble("salary")); employees.add(emp); } } } }
평소에 이런 코드를 잘 작성하지 않기 때문에 든 생각: 이거 많이 귀찮다.
(참고: 간단한 예제이기 때문에 DriverManager을 사용했지만, documentation에 따르면 DataSource 사용하는 것이 좋다. 유지보수가 더 쉽고, DriverManager가 제공하지 못하는 connection pooling, distributed transaction 등의 기능을 제공할 수 있기 때문이다.)
cf. hikaricp
DB 예제를 따라해본 사람이라면 꼭 만나봤을 이름이다. hikaricp는 JDBC connection pooling framework 중 하나이다. 요즘에는 hikari를 가장 많이 선택하기 때문에 많이 들어본 것 같다. 선택한 JDBC connection pooling framework에 따라 DataSource 타입의 객체를 만들어 사용한다.
MyBatis
MyBatis는 JDBC API의 지루한 코드를 대신 처리해준다. 개발자는 SQL만 작성하면, 해당 쿼리를 자바 메서드를 통해 편리하게 사용할 수 있다. 한 마디로 SQL mapper라고 볼 수 있다. (참고로 MyBatis는 ORM은 아니다. ORM은 자바 객체를 DB 테이블에 매핑하는 것이지만, MyBatis는 자바 메서드를 SQL 구문에 매핑한 것이다.)
나는 MyBatis를 제일 먼저 접했기 때문에 이 편리함을 미처 못 느꼈지만, 매번 JDBC 코드를 스스로 작성해야 한다면 생각만해도 너무 번거롭고 벌써 짜증이 난다. (내가 처음에 이 기술을 쓰고 느낀 장점은 학습할 내용이 많지는 않다는 점이었다.)
JPA와 비교할 때의 장점이지만, 어떠한 복잡한 로직이라도 다 구현 가능하다는 것도 장점이다. MyBatis는 결국 SQL을 직접 작성하는 것과 근본적으로는 크게 다르지 않기 때문이다. 물론 MyBatis가 여러 기능을 지원하기 때문에, raw SQL을 작성하는 것보다는 많이 편리하긴 하다.
하지만 SQL을 직접 작성하기 때문에 유지보수가 헬이 될 수 있다. 자잘한 실수를 모두 개발자가 온전히 감당해야 한다. 노가다를 방지해주는 도구가 딱히 없다. entity에 필드를 새로 추가했다면, 해당하는 SQL을 다 찾아서 수정해줘야 한다. 관리가 잘 되지 않아 몇 백 줄, 몇 천 줄이 되어버린 매핑 파일을 보면 눈물이 난다. 그런데 SQL 수정은 그렇다 치더라도, DB를 바꾸는 일은 거의 불가능에 가까울 것 같다. oracle에 맞는 쿼리를 다 작성해놓았는데, mysql로 바꾸는 것이 과연 엄두가 나는 일일까..? (난 안 할래)
cf. JdbcTemplate
스프링 프레임워크에서 사용하며, JDBC를 편리하게 사용할 수 있도록 도와준다. 비슷한 이름의 RestTemplate, RedisTemplate와 마찬가지로, 스프링이 귀찮은 것들을 대신해주고 개발자가 흔히 저지르게 되는 실수를 방지해준다.
JPA
JPA는 Java Persistence API의 줄임말로서, 자바 진영에서 사용하는 ORM 기술이다. ORM(Object Relational Mapping)은 자바 객체와 DB 테이블을 매핑하는 것인데, ORM을 사용하면 SQL 없이 RDB를 조작할 수 있다.
JPA는 API이고, 이를 구현한 프레임워크가 필요하다. 가장 유명하고, 표준으로 사용되고 있는 것이 Hibernate라는 구현체이다. Hibernate도 내부적으로 JDBC를 사용하고 있다. (Hibernate가 잘 만들어져서, Hibernate를 기준으로 JPA 명세를 정한 것으로 알고 있다.)
이렇게 간단히 살펴보았을 때에도 JPA는 추상화의 수준이 높은 기술이라는 것을 알 수 있다. 이에 따른 장점이 뚜렷하다. 우선 SQL에 의존하는 단순 반복적인 개발을 피할 수 있고 생산성이 올라간다. 간단한 CRUD는 아예 SQL을 작성할 필요가 없고, 엔티티에 수정이 일어나더라도 일일이 다 고칠 필요가 없다. 또한 JPA 코드는 특정 DB에 종속되지 않기 때문에, 다른 DB로 바꾸는 것도 쉽게 가능하다. 이러한 편리함은 JPA 코드만 봐도 바로 느낄 수 있는 아름다움이다.
객체 모델과 RDB 모델의 패러다임 불일치 문제도 해결할 수 있다. 두 패러다임의 간극을 메우기 위해서 개발자의 수고를 해야 하거나, 간극을 해결하기 어려운 경우가 있는데, JPA는 이를 해결해주는 기술이다. (이게 되게 큰 장점이라고 하던데, 개인적으로는 아직 와닿지 않는다. 이 점을 깨달으면 나도 JPA를 외치게 될까?)
하지만 편리함을 제공하는 만큼, JPA가 어려운 부분도 있다. 너무 복잡한 쿼리는 JPA를 사용하는 것이 오히려 독이 될 수도 있다. 이런 경우에는 MyBatis나 JdbcTemplate을 사용하는 것이 정신 건강에 더 이로울 것 같다.
cf. Persistence Context
JPA는 MyBatis와 달리 러닝커브가 좀 있는 편이다. 영구성 컨텍스트, 엔티티 매니저 등 뭔가 알아야할 개념들이 많다. 함께 사용하는 QueryDsl이라는 기술도 있더라. JPA는 잘 모르고 사용하면 어딘가에서 큰 코 다치게 되는 기술인 것으로 알고 있다. 다음 시간에는 JPA를 제대로 공부해보기로 한다.
'database' 카테고리의 다른 글
쿼리 튜닝하기 (0) 2022.04.18 MyBatis 관련 삽질 모음 (0) 2022.02.28