스프링으로 게시판을 만들어본다.
아직 간단한 기능으로 게시글에 대한 CRUD만 만들기로 한다.
책에서는 마이바티스를 쓰던데
나는 JPA를 쓰기로 하였다.
persistence framework의 두 종류로
JPA와 마이바티스가 있다.
Java, Python 등의 언어로 DB를 제어하려면
JDBC를 써서 쿼리를 작성하고, fetch 하고 실행하고 복잡한 과정을 거쳤다.
시스템콜과 사용자 사이에 POSIX api 를 둬서 좀 더 간편한 사용을 꽤하듯
JDBC와 사용자 사이에 JPA와 마이바티스가 들어간 것이다.
JPA는 쿼리를 직접 작성할 필요가 없다는 장점을 지녔다.
따라서 DB를 바꾸더라도 같은 코드를 사용할 수 있다.
반면 마이바티스는 쿼리를 내가 직접 작성해야 한다.
마이바티스를 쓰려면 sql 을 매핑하는 xml 을 만들어서
쿼리를 작성해야 한다.
이유는 JPA는 ORM (object relational mapping)으로 동작하고
마이바티스는 SQL mapping 으로 동작하기 때문이다.
JPA의 철학은 SQL의 릴레이션을 객체로 매핑하는 것이다. 간단한 엔티티 -> 클래스로 매핑하고 엔티티와 엔티티 간의 관계를 객체 간의 관계로 매핑한다.
또한 어플리케이션 -> JPA -> JDBC -> DB 의 순서로 작동하기 때문에,
내가 하려는 일이 정확히 JPA에서 일어나는지, JPA에서 내가 원하는 결과를 줄 수 있는지를 잘 알아야 한다.
JPA와 마이바티스를 쓰는 사람들이 나뉘어져 있으므로
둘 중에 우월한 장점을 가지는 것은 없을 것이다.
JPA는 (간단한 수준에서) 쿼리를 직접 작성할 필요는 없지만 대신 자유도가 줄어든다.
복잡한 쿼리로 DB를 제어하는 것이 어렵다.
캐싱, 쓰기 지연, 지연 로딩 등
간단한 수준에선 성능상의 이점이 있으나
일정 수준이 넘어가면, 관계 매핑을 잘못해주거나 하면 불필요한 작업을 반복하는 등 오히려 성능이 하락할 수 있다.
마이바티스는 쿼리를 작성하는 대신 쿼리를 자유롭게 사용할 수 있다. 물론 그만큼 쿼리가 최적화되어 있어야 한다. 하지만 DB 접근 로직이 바뀌면 그거대로 코드를 수정해야 한다.