반응형

Springboot + JPA 조합의 시스템을 처음으로 개발하게 되면서 JPA를 어떻게 방식으로 접근해서 공부해야할지 생각해봤다.

JPA, 엄밀히 말하면 ORM을 처음 만났을 때의 나의 모습이다.

"웹어플리케이션이 실행될 때 마다 테이블을 매번 생성한다고?" (옵션 변경 가능)

"단순히 DB 모델링을 @Entity class로 단순히 형상화한게 아니라 DB에 직접 관여하는 객체라고?"

"아니, update가 auto commit이라고? commit 시점은 언젠데?"

"아, transaction을 잘 설정해야하는구나. 근데 self Invocation에서는 안된다고ㅠㅠ?" (Spring AOP는 proxy기반이라 Self Invocation 상황에서는 proxy 객체를 가르키는게 아니라 this를 가르키기 때문)

JPA를 제대로 공부하기 전에 용도와 한계에 대해 짚고 넘어갈 필요가 있다.

JPA란?

객체를 관계형 데이터베이스에 저장하려면 개발자는 많은 코드와 SQL을 작성해야 합니다. 예를 들어 객체를 SQL로 변환하는 단순한 일부터, 객체의 상속 구조를 테이블에 저장하는 복잡한 일까지, 개발자는 객체와 데이터베이스 사이에서 무수한 매핑 코드와 SQL을 직접 작성해야 합니다. 자바 ORM 표준인 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결합니다.

(위 글은 김영한님 인프런 강의 소개글 발췌, https://www.inflearn.com/course/ORM-JPA-Basic#description)

즉, 서버 개발자가 DB와 SQL Infra 로직 보다는 비즈니스 로직 설계와 개발에 더 집중할 수 있도록 도와주는 것이다.

장점

SQL 중심적인 개발에서 객체 중심으로 개발

  • 개발 생산성 향상
  • 유지보수 편의
  • 패러다임의 불일치 해결
  • 성능 향상
  • 데이터 접근 추상화와 벤더 독립성
  • 자바 ORM 표준 기술

(위 글은 김영한님 인프런 강의 소개글 발췌, https://www.inflearn.com/course/ORM-JPA-Basic#description)

한계

일단 JPA의 한계는 명확하다. JPA는 DB를 대체하는 게 아니라는 것이다.

JPA가 대신 테이블, 인덱스, 시퀀스를 대신 생성해주고 관리해주지만 모델링(설계)를 대신해주지는 않는다. 그렇기 때문에 단순히 객체지향적으로 설계하던 대로 RDB를 모델링한다면 미래의 나와 동료들에게 엄청난 시련을 주는 것일 수 있으니 조심하자.

결국에는 RDB를 훼손하지 않는 선에서 나의 서비스 코드가 객체지향적으로 생산성과 유연성을 극대화하는 것이 중요하다고 생각한다. 객체지향이라는 것에 홀려 도메인을 잃어버리지 않도록 주의하자.

RDB를 훼손하지 않는 선에서 객체지향을 극대화하는 방법은 뭘까?

애초에 설계 목적이 다른 객체지향관계형 DB 모델링을 어떻게 활용해서 장점을 극대화할 수 있을 지 감이 잘 잡히지 않는다. 하지만 불가능한 것은 아니다. 실제로 JPA를 잘 활용하고 있는 회사도 보인다. (우아한형제라던가...)

사용하기 쉽고(?) 생산성을 극대화해주는 JPA를 많이들 추천하지만, 사실 러닝커브가 만만치 않다. JPA의 기술적 사용방법과 어노테이션 용도는 숙지할 수 있더라도, RDB 모델링과 객체지향의 개념까지 습득하기에는 시간이 많이 소요될 것 같다.

점점 더 개발자가 일하기 쉽게 이것 저것 제공해주는 프레임워크가 나오지만, 이를 잘 쓰려면 그만큼 공부해야할 양도 많아진다. 객체지향도 익숙하지 않은데 객체지향 베이스인 프레임워크와 라이브러리를 쓰다니 :) 이거참 아이러니다.

결론은 객체지향 공부하고 김영한님의 JPA 책부터 읽어보자.

해답을 얻을 수 있지 않을까?

그래도 헷갈리는 거

애초에 DB는 정규화를 거친 엔티티 단위로 모델링을 해야하고, java에서는 각 엔티티 모델에 매핑되는 엔티티 클래스를 생성한다. 그리고 JPA를 통해 그 클래스를 DAO처럼 활용하는데 이 틀이 정해진 상태에서 어떻게 더 객체지향을 적용할 수 있을 지 고민이다. 이제 막 객체지향에 대한 책을 읽고 있는 중인 입문자라 그런 것 같은데, DB~엔티티 클래스까지 작성하고 나면 객체지향을 조금이나마 생각하고 적용할 수 있는 부분은 서비스와 인터페이스 간의 통신 정도 뿐인 것 같다. 큰 틀에서까지 객체지향을 적용하는 방법은 잘 모르겠으니 일단 조그맣게 서비스와 서비스, 서비스 내 함수끼리의 통신부터 생각해봐야겠다.


ORM과 JPA 그리고 Hibernte : https://victorydntmd.tistory.com/195

우아한형제들 JPA 강의 소감과 적용 사례 : https://woowabros.github.io/woowabros/2018/12/29/woowahan-jpa1.html

책 - 자바 ORM 표준 JPA 프로그래밍 (김영한) : https://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330

반응형