인프런 커뮤니티 질문&답변

euni님의 프로필 이미지
euni

작성한 질문수

Java/Spring 주니어 개발자를 위한 오답노트

어디까지 추상화 해야 하는가?

진짜 객체지향과 테스트하기 쉬운 코드를 위헤서는 jpa가 의미없는게 아닌가하는 생각이 들어요

작성

·

1.4K

2

 

이전에 혼자 ddd, 헥사고날 아키텍처를 공부하면서 느꼈던게

객체지향적인 코드 + 테스트하기 용이한 코드를 작성하기 위해서는 결국 domain layer와 persistence layer의 분리가 필수적인데

jpa entity와 domain entity를 완전히 분리했을 때 JPA가 mybatis나 jdbc template를 사용하는 것과 비교해 가지는 강점이 있는지 잘 모르겠습니다..

그나마 jpa entity와 domain entity를 분리하지 않는다면 어떻게든 온몸 비틀기로 그나마 테스트하기 용이하고 객체지향스러운 코드를 작성해볼 수는 있지만 결국 복잡한 로직에서는 쿼리 때문에 문제가 생기고 ㅜ

지식 공유자님께서는 이 문제에 대해 어떻게 생각하시나요?

 

답변 2

6

김우근님의 프로필 이미지
김우근
지식공유자

안녕하세요. 답변이 늦어 죄송합니다.

JPA는 사실상 요즘 날 자바 개발자의 기본 소양과도 같은 것이라… 저에게 이를 부정해달라는 킬 패스를 주시면… 조금 곤란하네요ㅎㅎㅎ;; 그래도 문의하셨기에 조금이나마 발언해 보겠습니다. 권위 없는 일개 개발자의 의견이니 참고만 해주시길 바랍니다.

음… 그래서 개인적으로도 질문자님과 같은 생각을 하고 있습니다. 안 그래도 요즘에 책을 출간할 기회가 생겨서 집필을 조금 하고 있는데요. 이야기해 주신 것과 비슷한 이야기를 쓰고 있었습니다.

저의 경험은 매우 짧습니다. 그래서 모든 상황을 대변할 수 없을 것입니다. 그런데 경험에 비추어봤을 때 어디서나 말하는 좋은 설계에 감명받고 이를 실천에 옮기다 보면, JPA의 편리한 기능들을 사용할 수 없게 되는 경우가 많았습니다. 즉 좋은 설계를 추구하면 추구할수록 JPA를 사용하는 이유가 없어졌습니다.

그리고 이는 매우 당연한 결과라고 생각합니다. 왜냐하면 그렇게 되려는 것이 좋은 설계의 목표이기 때문입니다. 특정 라이브러리에 종속되지 않는 애플리케이션을 만들려는 것이니까요.

따라서 좋은 설계를 만족시키기 위해선 ORM과 작별 인사를 해야 한다고 생각합니다. 그래서 이 때문에 많은 고민이 생기는 것 같습니다. 개발자는 둘 중 하나에 회의감을 느낄 수 밖에 없습니다.

  • 이론상 좋은 설계

  • 편리한 기능을 제공하는 JPA

여기서 저나 질문자님은 JPA에 대해 회의감을 느끼고 있는 것 같고요. (요새는 이런 갈등이 계속되다 보니 혹시 ‘이론상 좋은 설계’를 제가 잘못 이해하고 있는 것은 아닌가?에 대해서도 고민합니다.)

JPA가 데이터를 자동 맵핑을 해주는 것과 쿼리를 자동으로 만들어 준다는 것은 너무나도 만족스러운 기능입니다. 하지만 이야기하신 대로 저 또한 복잡한 쿼리를 만들어야 하는 상황에서 JPA는 항상 문제가 되었던 것 같습니다. 이게 ‘JPA 숙련도 때문에 발생하는 문제인 건가?’ 싶으면서도 회의감이 드는 것은 어쩔 수 없더라고요.

저는 이런 생각이 들 때, 이러니저러니 해도 JPA는 수단일 뿐이라는 것을 상기합니다. JdbcTemplate, MyBatis, JPA 모두 좋은 라이브러리입니다. 어느 하나가 더 우월하다 같은 것은 없다고 생각합니다. 그렇다면 여러 수단을 두고 하나의 방법을 선택해서 개발하면 되는 것이겠지요. 나아가 요즘 같은 메타에서 주 데이터베이스가 꼭 관계형 DB일 것이라는 보장도 없습니다. 모든 문제는 수단을 정해두고 거기에 맞춰 이유를 만들려 하니 발생하는 것이 아닌가 생각합니다.

JPA의 역사가 아직 짧으니, 나중이 되면 더 좋은 사용 사례, 해결책이 나올 것이라 생각합니다. 어쩌겠나요. 그전까지는 계속 고민해야지요…ㅎ 좋은 경험 사례가 있다면 나중에 꼭 강의든 웨비나든 다양한 형태로 공유해 주시길 바랍니다. 필요하다면 저도 꼭 구매해서 보도록 하겠습니다.

부족하지만 답변이 도움이 되셨길 바랍니다. :)

-3

안녕하세요, 인프런 AI 인턴이에요.

JPA는 객체와 데이터베이스 사이의 매핑을 쉽게 해주는 ORM(Object-Relational Mapping) 프레임워크입니다. JPA를 사용하면 SQL 쿼리 작성을 줄일 수 있고, 객체지향적인 코드를 작성할 수 있습니다.

JPA는 Entity 클래스를 통해 데이터베이스 테이블과 매핑되는 객체를 생성합니다. 기본적으로 JPA Entity는 도메인(Domain) 모델과 결합되어 있습니다. 따라서 테스트 가능한 코드를 작성하기 위해 JPA Entity와 도메인(Entity)을 완전히 분리하는 것은 중요한 원칙이 될 수 있습니다.

JPA를 사용할 때, Entity와 도메인을 분리하는 것은 테스트 용이성과 유지 보수성을 높이는 데 도움이 됩니다. 도메인 객체는 비즈니스 로직을 담고 있으며, JPA Entity는 데이터베이스와의 연결을 관리합니다. 이를 분리하면 간단한 단위 테스트를 수행할 수 있으며, 도메인 모델을 변경할 때도 데이터베이스와의 의존성을 최소화할 수 있습니다.

JPA를 사용하면 SQL 쿼리 작성을 줄일 수 있어 개발 생산성을 높일 수 있습니다. 또한 JPA의 영속성 컨텍스트를 통해 데이터베이스 작업을 효율적으로 처리할 수 있습니다. 이는 MyBatis나 JDBC Template과 비교했을 때 JPA의 장점 중 하나입니다.

복잡한 로직에서는 쿼리 문제가 발생할 수 있습니다. 이런 경우에는 JPA를 사용하면서도 쿼리의 성능을 개선할 수 있는 방법이 있습니다. JPA의 성능 최적화 기능을 사용하거나, 직접 쿼리를 작성해서 성능을 향상시킬 수 있습니다.

단순성과 효율성을 동시에 충족시키는 것은 어려운 일입니다. 하지만 JPA를 사용하면 객체지향적인 코드를 유지하면서도 데이터베이스와의 연결을 쉽게 관리할 수 있습니다. 따라서 JPA를 사용하는 것이 객체지향과 테스트 용이성을 포기하는 것이 아니라고 할 수 있습니다.

더 자세한 내용은 JPA의 장단점과 관련된 글이나 책을 참고하시면 도움이 될 것입니다. 감사합니다.

euni님의 프로필 이미지
euni

작성한 질문수

질문하기