-
ORM - JPA시작(비지니스 로직)FrameWork/ORM 2024. 2. 28. 12:35
JPA시작(비지니스 로직)
비지니스 로직
@Component public class JpaMain { @Transactional public void logic(EntityManager em){ String id = "id1"; Member member= new Member(); member.setId(id); member.setUsername("진영"); member.setAge(2); //등록 em.persist(member); //수정 member.setAge(20); //한건 조회 Member findMember = em.find(Member.class,id); System.out.println("findMember="+findMember.getUsername()+ ", get="+findMember.getAge()); //목록조회 List<Member> members = em.createQuery("select m from Member m",Member.class).getResultList(); System.out.println("member.size="+members.size()); //삭제 em.remove(member); } }
실행
@SpringBootApplication public class OrmUsageApplication { public static void main(String[] args) { ApplicationContext ac = SpringApplication.run(OrmUsageApplication.class, args); EntityManager em = ac.getBean(EntityManager.class); JpaMain jm = ac.getBean(JpaMain.class); jm.logic(em); } }
출력결과는 다음과 같다.
findMember=진영, age=20
member.size=1비지니스 로직을 보면 등록, 수정, 삭제 조회 작업이 엔티티 메니저(em)를 통해서 수행되는 것을 알 수 있다. 엔티티 매니저는 객체를 저장하는 가상의 데이터베이스처럼 보인다. 먼저 등록, 수정, 삭제 코드를 분석해 보자
▼등록
String id = "id1"; Member member= new Member(); member.setId(id); member.setUsername("진영"); member.setAge(2);
엔티티를 저장할려면 엔티티 매니저의 persist() 메소드에 저장할 엔티티를 넘겨주면 된다. 예제를 보면 회원 엔티티를 생성하고 em.persist(member)를 실행해서 엔티티를 저장했다. JPA는 회원 엔티티 매핑 정보(애노테이션)분석해서 다음과 같은 SQL을 만들어서 데이터베이스에 전달한다.
insert into member (age, name, id) values ( 2 , '지한', 'id1' );
▼수정
//수정 member.setAge(20);
수정 부분을 보면 조금 이상하다. 엔티티를 수정한 후에 수정 내용을 반영하려면 em.update() 같은 메소드를 호출해야 할 것 같은데 단순히 엔티티의 값만 변경했다. JPA는 어떤 엔티티가 변경되었는지 추적하는기능을가을 갖추고있다. 따라서 member.setAge(20)처럼 엔티티의 값만 변경하면 다음과 같은 UPDATE SQL을 생성해서 데이터베이스에 값을 변경한다. 사실 em.update()라는 메소드는 존재하지 않는다.
update member set age=20, name='지한' where id='id1'
▼삭제
em.remove(member);
엔티티를 삭제하려면 엔티티 매니저의 remove()메소드에 삭제하려는 엔티티를 넘겨준다. JPA는 다음 DELETE SQL을 생성 해서 실행한다.
delete from member where id='id1'
JPQL
하나 이상의 회원 목록을 조회하는 타음 코드를 자세히 살펴보자.
//목록 조회 TypedQuery<Member> query = em.createQuery("select m from member m", Member.class); List<Member> members = query.getResultList();
JPA를 사용하면 애플리케이션 개발자는 엔티티 객체 중심으로 개발하고 데이터베이스에대한 처리는 JPA에 맡겨야한다. 바로 앞에서 살펴본 등록, 수정, 삭제 예를 보면 SQL을 전혀 사용하지 않았다. 문제는 검색 쿼리다. JPA를 사용하게 되면 엔티티 중심으로 개발하게 되므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야한다.
그런데 테이블이아닌엔티티 객체를생상으로 검색하려면 데이터베이스의 모든 데이터를 애플리케이션으로 불러와서 엔티티 객체로 변경한 다음 검색해야 하는데, 이는 사실상 불가능하다. 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 퐘된 SQL을 사용해야 한다. JPA는 JPQL(Java Persistence Query Language)이라는 쿼리 언어로 이런 문제를 해결한다.
JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공한다. JPQL은 SQL과 문법이 거의 유사해서 SELECT, FROM, WHERE,GROUP BY, HAVING, JOIN등 을 사용할 수 있다. 둘의 가장 큰 차이저은 다음과 같다.
- JPQL은 엔티티 객체를 대상으로 쿼리한다.쉽게 이야기해서 클래스와 필드를 대상으로 한다.
- SQL은 데이터베이스 데이블을 대상으로 한다.
위 목록 조회 예제에서 "select m from member m"이 바로 JPQL이다. 여기서 from Member는 회원 엔티티 객체를 말하는 것이지 MEMBER 테이블이 아니다. JPQL은 데이터베이스 테이블을 전혀 알지 못한다.
JPQL을 사용하려면 먼저 em.createQuery(JPQL,반환 타입) 메소드를 실행해서 쿼리 객체를 생성한 쿼리 객체의 getResultList() 메소드를 호출하면 된다.
정리
JPA를 사용함으로써 JPA가 반복적인 JDBC API와 결과 값 매핑을 처리해준 덕분에 코드량이 상당히많이 줄어든 것을 물론이도 심지어 SQL도 작성할 필요가 없다. 하지만 코드량을 줄이고 SQL을 자동 생성하는 것은 JPA가 제공하는 전체 기능 중 일부에 불과하다.
출처 - [자바 ORM 표준 JPA 프로그래밍 - 저, 김영한]
http://www.acornpub.co.kr/book/jpa-programmig
'FrameWork > ORM' 카테고리의 다른 글
ORM - 영속성 관리(엔티티 등록,수정,삭제) (0) 2024.02.29 ORM - 영속성관리(엔티티 매니저 팩토리와 엔티티 매니저) (1) 2024.02.28 ORM - JPA설정 (1) 2024.02.14 ORM - JPA란 무엇인가? (0) 2024.01.22 ORM - ORM과 문제 해결3 (객체 그래프 탐색, 비교) (1) 2024.01.22