당니의 개발자 스토리

강좌 소개 본문

스프링/자바 ORM 표준 JPA 프로그래밍 - 기본편

강좌 소개

clainy 2024. 5. 23. 11:15

강좌 소개

JPA 기본편 강의에 오신 여러분을 환영합니다.

제 이름은 김영한이고 Java ORM 표준 JPA 프로그래밍 책의 저자입니다.

저는 현재 우아한 형제들에서 개발 팀장으로 일하고 있습니다.

먼저 JPA가 뭔지 간단하게 소개를 해드리겠습니다.

과거에는 객체를 데이터베이스에 저장을 하려면, 이렇게 복잡한 JDBC API와 SQL을 한 땀 한 땀 직접 작성해야 했습니다.

조회할 때도 마찬가지고요.

그런데 JdbcTemplate이나 MyBatis 같은 SQL mapper가 등장해서 보시는 것처럼 개발 코드는 많이 줄었지만, 아직도 SQL은 개발자가 한 땀 한 땀 직접 다 작성을 해야됩니다.

자 그러다가 이제 JPA가 나오죠. JPA를 사용하면 SQL 조차도 작성할 필요가 없습니다.

지금 보면 단순하게 객체를 저장하고 조회하는 코드가 있는데요. 이렇게 한 줄로 JPA한테 던지면 됩니다. 마치 Java 컬렉션에 객체를 저장하고 조회하는 것처럼 단순하게 JPA를 이용하시면 돼요. 그러면 JPA가 개발자 대신에 적절한 SQL을 생성을 하고 데이터베이스에 실행을 해서 객체를 저장하거나 불러오게 됩니다.

자 이제 과거에는 JDBC를 사용했었죠. 그리고 MyBatis나 JdbcTemplate을 사용하다보니 조금 나아졌죠. 여기서 더 나아가서 JPA는 거의 트랙터로 다 밀어버리는 수준으로 자동화가 된 거죠. 그니까 굳이 비유를 하자면 SQL을 한 땀 한 땀 작성하는 거는 개발 생산성 측면에서 이전에 비해 뒤떨어질 수 밖에 없어요. 다들 트랙터로 농사를 짓는데 호미랑 삽으로 농사를 짓는거랑 다를 바가 없죠. JPA를 사용하시면 확실하게 개발 생산성을 혁신할 수가 있구요. 개발 속도와 유지 보수 측면에서 이전과는 확연하게 차이가 납니다.

그런데 아무래도 트랙터 같은 거를 운전하려면 운전법을 좀 배워야 되겠죠. 아무래도 호미랑 삽 보다는 사용하는 방법이 어려울 거잖아요.

근데 이 JPA라는 게 실무에서 사용하기가 만만하지가 않아요. 여러분들이 처음 JPA나 스프링 데이터 JPA 같은 거에 대해서 한번쯤은 들어보셨을 거예요. 인터넷에 돌아다니는 튜토리얼이나 발표 자료 같은 것을 보면 와 편하다 실무에서 내가 개발을 정말 빨리 할 수 있을 것 같아' 하죠. 왜냐면 SQL도 안 짜도 되지, 코드도 수십 줄을 쫙 짜던 거를 한, 두 줄로 하면 다 돌아가거든요. 그래서 섣부르게 튜토리얼을 보는 정도로 해서 실무에 딱 들어가면 바로 망합니다.

왜 그럴까요?

명확하게 두 가지 이유 때문에 그래요.

첫 번째는 객체와 테이블을 딱 올바르게 맵핑하고 설계하는 방법을 몰라서 그래요. 실무는 튜토리얼처럼 객체랑 테이블이 한, 두 개가 아니잖아요. 못해도 최소 수십 개 이상의 객체와 테이블이 정말 복잡하게 얽혀서 돌아가거든요. 그런데 이제 JPA에서 제일 중요한 게 뭐냐면, 이 객체랑 테이블을 잘 설계하고 맵핑을 정확하게 하는 게 제일 중요해요. 이거를 이해를 못하면 복잡한 실무 상황에서 어떻게 해야 되는지 정말 감조차 안 잡혀요. 막 테이블에 한, 두 개 있는 예제랑 다르단 말이에요. 그래서 막상 도입을 하면 고민만 하다가 포기하시거나 아니면 잘못된 맵핑을 해서 두고두고 고생을 합니다.

자 그런데 잘 생각을 해보시면 이렇게 정말 복잡한 실무 상황에 객체와 테이블을 설계하고 JPA로 맵핑하는 방법을 제대로 가르쳐 주는 곳이 없어요.

그래서 제 강의에서는 객체와 테이블을 제대로 설계하고 맵핑하는 방법을 정확하게 알려드릴 거예요.

예를 들어서 테이블의 기본키와 외래 키를 객체랑 어떻게 맵핑하는지, 일대다, 다대일, 일대일, 다대다 관계처럼 복잡한 관계들을 JPA에서 어떻게 맵핑해야 되는지 단순하게 기계적으로 이럴 땐 이렇게 하세요! 가 아니라 제가 아는 실무 노하우와 실무 관점에서 가장 중요한 성능까지 다 고려해서 명확한 기준을 가지고 정리를 해드릴 겁니다.

저도 지금까지 정말 복잡하고 거래 금액도 조 단위가 넘어가는 결제 시스템, 정산 시스템, 주문 시스템 같은 다양한 시스템을 JPA로 설계하고 개발했는데요 여러분도 이 강의에서 설명하는 내용을 이해하시면 그 정도 수준의 복잡한 시스템도 JPA로 충분히 설계하실 수가 있습니다.

그리고 JPA가 어려운 두 번째 이유는 뭐냐면,

JPA의 내부 동작 방식을 이해하지 못해서 그래요. 그러니까 JPA 보면 코드 한 줄로 객체가 데이터베이스에 저장되고, 코드 한 줄로 불러올 수 있단 말이에요. 그래서 정말 쉬워 보이는데 이거에 대한 동작 방식을 모르고 이용을 하면 디버깅이 되게 오래 걸리고 최악의 경우에는 장애 상황에서 대처가 안 돼요. 실제로 실무에서 JPA가 이상하게 동작한다고 해서 제가 가서 가보면 JPA가 이상하게 동작하는 경우가 아니라 대부분 JPA의 내부 동작 방식을 이해하지 못해서 몇 시간이고 계속 낭비하시는 개발자분들 정말 많이 봤어요.

그래서 제 강의에서는 JPA가 내부적으로 어떻게 동작하는지를 그림과 코드로 정말 자세하게 설명을 해드릴 거예요.

그래서 이게 제일 중요한 건데요. JPA가 어떤 SQL을 만들어내는지, 그리고 이 SQL을 JPA가 언제 실행하는지 이 강의가 끝날 때쯤이면 여러분들의 머리 속에 그림이 그려지실 거예요.

그래서 과거에는 여러분이 SQL을 직접 작성해야 했지만 이제는 JPA를 이해하고 JPA에게 그냥 시키면 되는 겁니다.

자 그러면 이 JPA 기본편은 어떻게 학습해야 되는지 학습방법을 소개를 해드릴게요.

JPA는 표준 스펙만 500페이지가 넘을 정도로 정말 방대해요. 그래서 이 강의는 어떻게 준비를 했냐면 가급적이면 이론을 베이스로 까는데 이 이론을 최대한 라이브 코딩으로 다 풀어드릴 거예요.

그리고 6단계 실전 예제를 만들어 둘 거예요. 그래서 이론을 정립한 거를 예제로 풀어서 자기 걸로 만들고, 또 그 다음 이론과 라이브 코딩으로 해드린 부분을 2단계 예제로 또 더 올려서 하고, 이런 식으로 6단계까지 끌어올려서 한 실전 예제를 1단계부터 6단계까지 쭉 바꿔가면서 이해할 수 있도록 해드릴 겁니다. 그리고 가급적이면 제가 권장하는 방법은 강의를 메인으로 하고 실무하면서 제가 낸 책을 참고서로 옆에 두시고 보는 것을 추천을 드려요.

이 강의에서 JPA를 제대로 배우면 실무에서 SQL을 작성하는 그 수많은 시간부터 삽질하는 시간을 줄여드릴 수 있을 겁니다.

JPA에 대해서 잘 모르시는 분들을 위해서 제가 JPA를 실제로 정말 많이 사용하는지, 그리고 이제 적용 사례, 저의 실무 경험담을 마지막으로 들려 드릴게요.

빨간색이 MyBatis이고 파란색이 JPA, 그리고 노란색이 MyBatis의 과거 버전인 iBatis인데요. 이 그래프만 봐도 아시겠지만 앞으로 2-3년 안에 국내 시장에서 JPA 점유율이 MyBatis를 넘으면서 1위가 될 확률이 굉장히 높습니다.

이것도 보시면 JPA가 그냥 압도적으로 1위고요. 그 밑에 MyBatis와 iBatis가 깔려 있습니다.

그리고 JPA 적용 사례를 국내 사례들을 설명해드리면 네이버나 카카오 같은 인터넷 비즈니스 회사부터 우아한 형제들, 쿠팡 같은 이커머스 회사까지 정말 많은 곳에서 JPA를 사용하고 있습니다.

그리고 이런 고민이 될 수가 있어요. 'JPA가 정말 안정적이에요?'

이걸 말씀드리면 쿠팡이나 우아한 형제들 전부 거래 금액이 다 조 단위를 넘어가는 시스템들이거든요. 이렇게 조 단위의 거래 금액이 발생하는 다양한 서비스에서 이미 사용되고 검증됐다고 보시면 됩니다. 그리고 제가 있는 우아한 형제들 같은 경우에는 관계형 데이터베이스를 쓴다면 현재 거의 90% 이상 JPA를 기본으로 쓰고 있습니다. 그리고 최신 스프링 예제들만 봐도 JPA가 기본 다 적용되어 있는 걸 아실 수가 있고요. 그래서 자바 개발자에게 JPA는 기본 기술이라고 할 수 있습니다.

이제 마지막으로 저의 개인적인 실무 경험담을 좀 공유를 해드릴게요. 저도 참 실무에 수많은 프로젝트를 JPA로 설계하고 개발을 해왔는데요. 제가 JPA를 쓰면서 코드가 줄어든다, 더 객체 지향적으로 설계할 수 있다. 이런 걸 다 떠나서 가장 좋았던 것은 같이 JPA로 프로젝트를 했던 동료들이 항상 이 얘기를 했어요. 다시는 그 SQL 계속 노가다를 하던 과거로 돌아가고 싶지 않다고. 단순 SQL 작성하는 데에 낭비하는 시간이 확 줄어드는 거죠. 이제 단순한 SQL 작성으로 내 인생을 낭비하지 않아도 된다는 게 좋았습니다. 그리고 동료들이랑 같이 그 남는 시간에 더 많이 설계를 고민하고 더 많은 테스트 코드를 작성할 수 있고 코드 리뷰 같은 걸 하면서 보내면 이게 얼마나 즐거운지 몰라요. 여러분도 그런 개발의 즐거움을 누리셨으면 좋겠어요.

그래서 실무에서 자신있게 JPA를 사용할 수 있도록 저의 모든 노하우를 전달해 드리도록 하겠습니다.