
자프링 스터디 두번째로 발표하게 되었습니다!
팀원들 중 스플링을 처음 배우는 분들도 계시다보니, JPA를 갑자기 사용해보셨을 겁니다.
그래서, JPA를 왜 배워야하고, 어떤 점이 좋아서 사용하는지에 대해 발표를 준비해보았습니다.
JDBC의 단점은 반복적인 코드가 많이 필요하다는 것입니다.
예를 들어, 데이터베이스 연결, 자원 해제, 예외 처리 등을 수동으로 처리해야 해서
코드가 복잡해지고, 오류가 발생할 가능성이 큽니다.
그래서 JdbcTemplate가 나오게 되는데..
DB 연결 및 자원 해제를 자동으로 처리 & SQL 쿼리 실행과 결과 매핑을 간소화함으로서
개발 생산성을 높이고, 코드 가독성을 개선합니다.
JPA는 아래 그림과 같이 내부적으로 JDBC를 사용하고 있습니다.

이제 JdbcTemplate와 JPA를 비교해보면서, JPA의 장점을 살펴보겠습니다.
첫번째로 객체 매핑과 Sql작성에 대해서 입니다.
다음 코드는 JdbcTemplate을 사용해서, 고객의 id를 사용해, Customer를 반환해주는 코드입니다. 저희 실습에서 가져왔습니다.
Jdbc에선 객체를 매핑하기 위해선, 다음 코드와 같이 Mapper를 통해 직접 변환해 주어야 합니다.
그리고 Sql문도 직접 작성해 주어야 합니다. 그럼 테이블 이름과 테이블의 컬럼 이름들을 모두 파악하고 있어야겠죠.

JPA는 데이터베이스 테이블과 Java 클래스를 매핑해서 객체 지향적인 방식으로 데이터를 처리합니다.
또한 SQL 작성 없이 메서드 호출만으로 데이터를 다룰 수 있어, 코드가 간결하고 읽기 쉽습니다.
그래서, 예제 코드에서 보듯이, JPA를 사용하면 데이터베이스 접근 로직이 간단해지고, 개발자는 비즈니스 로직에 더 집중할 수 있습니다.

두번째는 데이터베이스 독립성입니다.
Jdbc에서는 데이터베이스에 따라 SQL 쿼리를 다르게 작성해야 합니다.
예제 코드에서는 같은 동작이지만 MySQL과 Oracle에서 다르게 SQL을 작성해야하는 모습을 볼수있습니다.
Orcale에서는 limit, offset이 지원이 안되어서 그런다고 하네요
JPA에서는 복잡한 SQL 작성을 할 때는 JPQL을 사용하는데요.
데이터베이스마다 다르게 작성할 필요 없어서, 데이터베이스 종속성을 줄입니다.

세번째는 변경 사항의 자동 반영 및 트랜잭션 관리입니다.
JPA는 트랜잭션을 자동으로 관리하고, 엔티티의 상태 변화를 자동으로 데이터베이스에 반영합니다.
Jdbc를 사용하면 트랜잭션 관리와 데이터 동기화를 직접 처리해야하기 때문에,
이 과정에서 실수가 발생할 가능성이 높습니다.
여기서 트랜잭션이라는 말이 나오는데,
처음 듣는 분들도 계실 것 같아서 간단하게 설명을 드렸습니다!

은행 시스템을 만들었다고 생각해보았습니다.
사용자 A가 B에게 1000원을 보내는 상황을 구현해보면,
처음에 A계좌에서 마이너스 1000원을 하고, B계좌에서 플러스 1000원을 해야됩니다.
이렇게 2개의 SQL문을 통해, DB에 반영한다고 하겠습니다.

그런데, 만약 1번과 2번 과정 사이에 장애가 발생하면 어떻게 될까요? 1번 과정만 반영이 되고, 2번 과정은 반영이 안되서, A만 1000원 손해보는 상황이 발생할 겁니다
이런 상황을 방지하기 위해서, 1번과 2번을 하나로 묶어 처리하는 것을 트랜잭션이라고 합니다.
그래서, 1번과 2번 사이에 문제가 생기면,
1번만 반영하는 것이 아니라, 통째로 다시 없던 일로 만들게 됩니다.

다음은 변경감지 예시에 대해서 설명드릴게요.
JPA가 엔티티의 변경 사항을 자동반영해준다고 하는데, 그것을 변경감지라고 부릅니다
다음 코드는 맴버의 id를 통해, 해당 맴버의 닉네임을 바꿔주는 코드에요.
memberRepository에서 getById를 통해 member를 찾고, setNickName을 통해 닉네임을 바꿔주었어요.
그런데, 놀랍게도 이렇게만 코드를 작성해도 JPA가 db에 알아서 반영을 해줍니다.
지금보면 저희가 update SQL문을 작성하지 않았죠?
조금 더 자세히 말씀드리면, JPA에서는 영속성 컨텍스트라는 공간을 두어서, 거기 들어온 객체들을 주시합니다.
그래서, 어떤 변경이 일어났을 때, 그것을 체크하고 db에 반영해주는 것을 변경감지라고 합니다.
영속성 컨텍스트에 대해서는 이번 발표에서 다루지는 않아습니다.
하지만, JPA를 제대로 사용하려면 영속성 컨텍스트에 대해서 꼭 이해하고 넘어가야하기 때문에, 추후에 따로 공부를 해보시는 걸 추천드렸습니다!


발표 주제를 준비하면서, 들었던 우테코 발표인데, 영속성 컨텍스트에 대해 이해하는데 도움이 많이 되었습니다.
그래서, 후속 공부로 팀원들에게 들으시길 추천드렸습니다!

영속성 컨텍스트와 EntityManager
https://www.youtube.com/watch?v=c4rDrirE7Bc
Spring Data JPA 삽질일기
https://www.youtube.com/watch?v=kJexMyaeHDs
발표를 듣는 사람보다 '준비하는 사람'이 더 공부가 된다는 것을 느낀 순간이었습니다.
발표 주제 이외에도 영속성 컨텍스트, 변경 감지, 1차 캐시 등에 대해 찾아보게 되면서, 새로운 내용을 알게된 것들도 있어서 좋은 경험이었습니다.
팀원들에게 최대한 쉽고, 이해의 흐름을 잘 전달하려고 노력했습니다.
그런데, 팀원의 피드백 중에 발표할 때 말이 좀 느리다는 평이 있어서, 피드백을 수용하고 보다 잘 발표할 수 있도록 고쳐가야겠다고 생각했습니다!
그래도, 발표하는 것에 대한 두려움은 조금씩 사라지는 것 같아서 뿌듯하고 좋습니다~