티스토리 뷰
JPA를 왜 사용하는가?
필자는 블로그 프로젝트와 팀원들과 토이 프로젝트를 진행하며 JPA를 사용해 왔다. 과거에 JPA를 사용하면서 "SQL쿼리를 직접 작성하지 않는다"는 이점만 보고 JPA를 무작정 사용했던 것 같았다.
하지만 JPA는 우리가 생각하는 것 만큼 간단하지 않다. 복잡하지 않은 일반 개인 프로젝트에서는 무난히 사용했을 지 몰라도 복잡한 연관 관계를 갖고 있는 테이블이 있다고 가정해보자 우리는 이를 JPA로 간단하게 처리할 수 있는가?
그렇다면 JPA를 왜 사용하는지 JPA를 사용했을 때의 이점을 정확히 파악하고 우리는 그것을 남들에게 설명할 수 있어야 한다. 그 이유에 대해 먼저 알아보자
SQL을 직접 다룰 때 발생하는 문제점
RDBMS는 가장 대중적이고 신뢰할 만한 안전한 데이터 저장소다. 필자도 마찬가지로 MySQL을 사용하여 프로젝트를 진행하고 있다. 그렇다면 Java는 데이터를 관리하기 위해 SQL을 사용하는데 JDBC API를 사용해서 SQL을 DB에 전달한다. 그렇다면 이것이 개발하는데 있어 어떤 문제가 될까?
다음 코드들을 살펴보자
pulbic class Member {
private String memberId;
private String name;
...
}
회원 객체를 만들었으니 데이터베이스에 관리하기 위한 회원 DAO를 만들어보자
public class MemberDAO {
public Member find(String memberId) { ... }
}
이제 MemberDAO의 find() 메소드를 완성해서 회원을 조회하는 기능을 개발해보자. 보통 다음 순서로 개발을 진행할 것이다.
1. 회원 조회용 SQL을 작성한다.
SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?
2. JDBC API를 사용해서 SQL을 실행한다.
ResultSet rs = stmt.executeQuery(sql);
3. 조회 결과를 Member 객체로 매핑한다.
String memberId = rs.getString("MEMBER_ID")
String name = rs.getString("NAME")
Member member = new Member();
member.setId(memberId);
member.setName(name);
회원 조회 기능을 완성했다. 다음으로 회원 등록 기능을 만들어보자.
public class MemberDAO {
public Member find(String memberId) { ... }
public void save(Member member) { ... } // 추가
}
1. 회원 등록용 SQL을 작성한다.
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUE(?,?)";
2. 회원 객체의 값을 꺼내어 등록 SQL에 전달한다.
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
3. 회원 객체의 API를 사용해서 SQL을 실행한다.
pstmt.executeQuery(sql);
회워을 조회하는 기능과 등록하는 기능을 만들었다. 다음으로 회원을 수정하고 삭제하는 기능을 추가하면 또 SQL을 작성하고 JDBC API를 사용하는 비슷한 일을 반복할 것이다.
반면 객체를 Collection에 저장한다면 정말 간단하게 저장할 수 있다.
list.add(member);
하지만 DB는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수는 없다. 따라서 개발자가 객체지향 어플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직접 해주어야 한다.
문제는 객체를 데이터베이스에 CRUD 하려면 너무 많은 SQL과 JDBC를 코드로 작성해야한다. 이러한 일들을 반복해야하고 이러한 작업은 생산성을 떨어트린다고 생각한다.
SQL에 의존적인 개발
앞에서 만든 회원 객체를 관리하는 MemberDAO를 완성하고 애플리케이션의 나머지 기능도 완료했는데 갑자기 객체 속성에 연락처를 추가해 달라고 한다면 코드가 다음 처럼 변경될 것이다.
public class Member {
private String memberId;
private String name;
private String tel;
...
}
코드만 단순히 바뀌겠지만 또 수많은 SQL을 작성해줘야한다. 이러한 불편을 없애기 위해 나온 기술이 JPA인 것이다.
JPA는 단순 쿼리를 대신 작성해 준다가 아닌 객체 지향적인 프로그래밍을 개발자가 DB에 영향을 받지않고 마음 껏 할 수 있게 어느정도 개선해준다. 그리고 이는 생산성을 높여주고, 개발자들에게 좀 더 여유로운 개발환경을 선물해준다.
Refer. 자바 ORM 표준 JPA 프로그래밍 - 김영한 저자
'Spring Framwork & JPA > JPA' 카테고리의 다른 글
JPA 연관관계에 대한 생각 (4) | 2022.07.26 |
---|---|
프로젝트 JPA 성능 개선기(2) - 불필요한 Join 삭제 (0) | 2022.06.04 |
프로젝트 JPA 성능 개선기 (1) - 로그인 시 성능을 올려보자~! (1) | 2022.06.04 |
JPA에서 발생하는 생성, 수정, 삭제 시간을 추적해보자 (2) | 2022.05.14 |
JPA란 무엇인가? (0) | 2021.10.28 |
- Total
- Today
- Yesterday
- docker
- 백엔드
- 면접준비
- 취준
- Kotlin
- Spring
- thread
- Redis
- MySQL
- 프로그래밍
- DevOps
- 취업준비
- 개발자
- 취업
- JPA
- 게시판
- 인터뷰
- 면접
- 개발
- 자바
- IT
- 프로젝트
- 동시성
- swarm
- 코딩
- java
- CS
- DB
- 면접 준비
- 코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |