현대의 웹 애플리케이션에서 관계형 데이터베이스(RDB)는 빠질 수 없는 요소입니다. 그러다 보니 객체를 관계형 데이터베이스에서 관리하는 것이 무엇보다 중요하게 되었습니다. 관계형 데이터베이스가 웹 서비스의 중심이 되다 보니 현업 프로젝트들은 대부분 애플리케이션 코드보다 SQL로 가득하게 되었습니다. 이 부분을 해결하고자 JPA가 나오게 되었습니다.
JPA란?
JPA(Java Persistence API)는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임 워크이다.
ORM
애플리케이션 Class와 RDB의 테이블을 연결한다는 뜻이며, 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화해주는 것이다.
JPA를 사용해야 하는 이유
개발자가 아무리 자바 클래스를 아름답게 설계해도, SQL을 통해야만 데이터베이스에 저장하고 조회할 수 있디. 결국 관계형 데이터베이스를 사용해야 하는 상황이라면 SQL은 피할 수 없는 존재이다. 실제 현업에서는 수십, 수백 개의 테이블이 있는데 이 테이블의 몇 배의 SQL을 직접 만들고 유지 보수해야만 한다.
또한, 패러다임 불일치 문제가 있다. 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점을 맞춘 것이고, 반대로 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다. 쉽게 말하면, 관계형 데이터베이스에서 객체지향을 표현할 수 없다.
예를 들면 Java에서는 부모클래스와 자식 클래스의 관계 즉, 상속관계가 존재하는데 RDB에서는 이러한 객체의 상속관계를 지원하지 않는다.
한 가지 더 예시로, 객체지향 프로그래밍에서는 부모가 되는 객체를 가져오려면 아래와 같이 코드를 구성해야 한다.
User user = findUser();
Group group = user.getGroup();
누구나 명확하게 User와 Group은 부모-자식 관계임을 알 수 있다. 하지만 여기에 데이터베이스가 추가되면 다음과 같이 변경된다.
User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());
User 따로, Group 따로 조회하게 된다. 이렇게 되면 User와 Group이 어떤 관계인지 정확하게 알 수가 없다. 상속, 1:N 등 다양한 객체 모델링을 데이터베이스에서는 구현할 수 없게 되는 것이다. 그러다 보니 웹 애플리케이션 개발은 점점 데이터베이스 모델링에만 집중하게 되었다. 그래서 이런 문제를 해결하기 위해 JPA가 등장하였다.
JPA 장점
- SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.
- 특정 데이터베이스에 종속되지 않는다. 만약 DB를 바꿔야 하는 상황이 온다면 데이터베이스마다 쿼리문이 다르기 때문에 전체를 수정해야 하지만, JPA를 사용한다면 설정 파일만 바꿔서 얼마든지 데이터베이스를 변경할 수 있다
- 데이터베이스 테이블에 새로운 컬럼이 추가된 경우, JPA를 사용하지 않으면 DTO클래스의 필드를 모두 변경해야 하는 번거로움이 있다. JPA에서는 테이블과 매핑된 클래스에 필드만 추가하면 쉽게 관리가 가능하다.
- SQL문을 직접 작성하지 않기 때문에, 반복적인 SQL문 작성을 피할 수 있고 이로인해, 유지보수 측면에서 좋고 재사용성도 증가한다.
JPA 단점
- 통계 처리 같은 복잡한 쿼리를 사용할 경우 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야 할 수도 있다.
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨릴 수 있다.
- JPA를 제대로 사용하려면 알아야 할 것이 많아서 학습하는 데 시간이 오래 걸린다.
객체를 저장하는 코드
jpa.persist(member); // 저장
객체를 조회하는 코드
Member member = jpa.find(memberId); // 조회
👨👩👦👦 오픈채팅방 운영
취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁
참여코드 : 456456
https://open.kakao.com/o/gVHZP8dg
👨💻 전자책 출간
아울러 제가 🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁
마치며
아직 SI 환경에서는 Spring & MyBatis를 많이 사용하지만, 흔히 아는 네카라쿠배 등 자사 서비스를 개발하는 기업들은 SpringBoot & JPA를 전사 표준으로 사용하고 있다고 합니다. 앞서 언급했듯이, JPA를 배우고 사용하는 데 있어서 시간이 오래 걸리지만 그만한 output을 줄 수 있는 프레임워크인 것 같네요. 대기업을 목표로 삼고 계신다면 이번 기회에 시작해보시면 좋을 것 같습니다.
JAVA 관련 포스팅
'TIL' 카테고리의 다른 글
객체 지향 프로그래밍(OOP)이란? (0) | 2022.05.16 |
---|---|
JPA 영속성 컨텍스트 정의 및 핵심요약 (0) | 2022.05.12 |
가짜 데이터 생성 Faker.js 파헤치기 (0) | 2022.05.03 |
Maven VS Gradle (0) | 2022.05.02 |
Load Balancing, Sticky Session, Session Clustering (0) | 2022.04.28 |