본문 바로가기
나의 공부

JPA? 왜사용할까.

by 이숴 2023. 4. 21.
반응형

Java Persistence API

 

 

백엔드 개발을 할때면 저는 DB 와 매핑할때는 JPA를 무조건 선택해서 작업을 했습니다. 근데 이 JPA, 왜쓸까요? MyBatis 등의 다른 매핑 API가 있는데 어떤 점이 있어서 많은 사람들이 사용하는지 아시나요? 저또한 아무것도 모르고 JPA~ 뭐좋으니까 쓰고 있겠지~~ 하고 개발만 해왔었습니다. 하지만 무엇을 쓰고 있는지 알고있는 것이 아니면 더욱이나 제대로 사용하고 있는 것이 아니겠다고 생각했습니다. 이후에 다른 더 좋은 API가 왔을때도 어떤점이 JPA보다 좋은지 따져보고 넘어갈지 생각도 할 수 있으니까요. 그래서 오늘은 JPA가 무엇이고, 왜 사용하는지 저와 함께 알아보아용.

 

MyBatis

백엔드 개발을 하면 데이터를 DB에 저장을 해야합니다. DB에 데이터, 즉 객체를 저장하기 위해선 MyBatis 기준으로는 직접 SQL 쿼리문을 작성해야합니다. 또 개발자와 DB간의 세밀한 상호 작용을 제어할 수 있게 합니다. 

 

여러 장점이 있는 MyBatis. 좋은 기술임에는 틀림이 없는데요. 하지만 JPA를 더 많이 사용하는 이유가 있겠죠?

 

JPA

JPA도 DB에 객체를 저장하기 위한 기술입니다. 무엇이 다를까요? JPA는 많은 장점 중에서도 ORM을 지원한다는 점이 있을 것같습니다. DB에 객체를 저장하기 위해선 매핑하는 작업이 필요한데요. 이를 간단하게 작성할 수 있도록 지원하는 기술이 객체 관계 매핑(ORM)입니다. ORM 기술이란 객체를 DB에 저장할 수 있도록 중간에 설계를 매핑해준다고 보면 될 것같습니다. 거의 모든 대중적인 언어에는 대부분 ORM 기술이 존재합니다. 

 

MyBatis에도 이런 ORM 기술을 지원할까요? 아닙니다. MyBatis는 개발자가 직접 작성한 SQL 쿼리문을 사용합니다. JPA와 같이 SQL 쿼리문을 추상화하거나 자동 생성하는 기능을 제공하지 않습니다. 그렇지만 직접 작성하기 떄문에 Java상에서 DB와에 세밀한 작업이 요구되는 에플리케이션에서는 특히 유용한 점 때문에 계속 사용되고 있습니다. MyBatis는 여기까지만 하겠습니다. 오늘은 JPA를 공부하려는 거니까요!

 

JPA는 왜사용하는가?

JPA를 사용하는 이유로는 여러가지가 있습니다. SQL 중심적인 개발이 아닌 Java 객체 중심으로 개발을 할 수 있다는 점이 있겠네요. 또 생산성이 아주 뛰어납니다.

JPA가 있으면 SQL쿼리문을 직접 작성하지 않고 Java코드만으로도 DB에 데이터를 CRUD기능을 할 수 있습니다.

DB에 저장: EntityManager.persist(user);
조회: User user = EntityManager.find(userId);
수정: user.setName("이름");
삭제: EntityManger.delete(user);

위 예시코드와 같이 정말 간단하게 DB의 데이터를 조작할 수 있습니다.

 

따라서 유지보수성도 뛰어나다고 할 수 있을 것 같습니다.

그저 우리는

public class User {
	private Long userId;
    private String name;
}

이런 객체의 필드 변경을 직접 SQL문을 작성하는 것이 아닌 JPA 로만 조작이 가능하다는 거에요! 아주 간편합니다.

 

또한 우리가 관계형 데이터베이스를 사용하는 이유에는 데이터간의 상속기능을 이용하기 때문일 겁니다. JPA는 이런 상속관계, 연관관계를 손쉽게 생성, 조회 등을 할 수 있도록 지원합니다.

 

위에 만들어두었던 user객체와 추가로 Team객체를 만들어 보겠습니다.

public class Team {
	private Long teamId;
    private String name;
    List<User> users;
}

보통은 상속이란 것을 SQL에서 확인하게 될때는, 예시를 들어 수호라는 이름을 가지고 멋사라는 팀에 포함된 사람을 찾는다는 SQL문을 생성하려고 할때 필요한 파라미터값이 뭐가 있을까요? userId, name, teamId 가 필요할 것입니다. 어떤팀의 어떤 이름을 가진 유저를 찾는 것이니까요. 그러나 이런것을 전부 신경써서 작업을 하기에는 해야할 것이 많습니다. JPA는 그저 객체를 상속해주면 그 상속 객체를 자유롭게 탐색할 수 있도록 지원합니다. 그저 User를 넘겨도 알아서 SQL문이 생성된다는 것이죠. 아주 간편합니다.

 

또한 트랜잭션 기능을 지원하는데요. 중요합니다.

트랜잭션이란 데이터베이스에서 수행되는 연산들의 논리적인 단위입니다. DB의 상태를 변화하는 작업들을 하나로 묶은 거라고 하네요. 트랜잭션은 원자성, 일관성, 격리성, 지속성의 특징을 띕니다. 모든 트랜잭션은 완전히 수행되거나 다 취소되어야하며, 트랜잭션 작업 이전,이후의 상태가 동일해야합니다. 또 트랜잭션들간에는 영향이 없고 독립적으로 실행되어야합니다. 마지막으로 작업된 트랜잭션의 결과는 영구적으로 DB에 저장이 됩니다.

 

User user1 = list.get(n);
User user2 = list.get(n);

위같은 경우가 있으면 user1 == user2 는 같을까요? 아닙니다. 값은 같을 수 있더라도 둘은 다른 객체로 새롭게 생성이 되었기 때문입니다. 하지만 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장하기에 데이터 수정에 간편합니다.

 

이외에도 정말 많은 장점이 있지만, 글이 너무 길어지네요.. 2편으로 나눠야겠습니다. 오늘은 이렇게 JPA가 왜 좋은지, 왜써야하는지 알아보았습니다. 2편을 쓸지는 모르겠지만, 저도 정리해두고싶으니 노력해보겠습니다. 글을 읽어주셔서 감사합니다!

반응형

댓글