• jpa를 알아보자

    2017. 8. 10. 20:45

    by. 위지원

    날라갔다...후


    jpa란 자바진영의 orm 기술 표준이다.애플리케이션과 jdbc 사이에서 동작한다.


    orm은 객체과 관계디비를 매핑한다는 뜻으로 프레임워크이다.과거에는 자바빈즈라는 기술을 이용했지만 너무 비효율적이였다.

    그래서 하이버네이트라는 오픈소스 orm 프레임워크가 등장했고 이 EJB 3.0에서 하이버네이트 기반으로 새롭게 드장한 orm기술이 jpa인것이다.




    우선 사용하기전 책에 나온 프로젝트 구조를 살펴보면


    src/main

    -java

    -jpabook/start

    -jpamain.java (실행 클래스)

    -member.java (회원 엔티티)

    -resources

    -meta-inf

    -persistence.xml    (jpa 설정정보)

    -pom.xml



    jpa 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리는


    hibernate-core  하이버네이트 라이브러리

    hibernate-entitymanager 하이버네이트가 jpa 구현체로 동작하도록 jpa 표준을 구현한 라이브러리

    hibernate-jpa-2.1-api jpa 표준 api를 모아둔 라이브러리


    각 파일을 생성하고 메이븐 설정파일인 pom.xml에 아래와 같이 jar을 추가해준다. 메이븐은 라이브러리 관리/빌드 도구이다


    <!-- jpa,hibernate -->

    <dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-entitymanager</artifactId>

    <version>4.3.10.Final</version>

        </dependency>



    객체 매핑을 시작한다.


    우선 위의 member.java에 매핑어노테이션을 추가하여 생성한다.


    import javax.persistence.*;(jpa 어노테이션 패키지)


    @Entity

    @Table(name="MEMBER")

    public class Member{

    @Id

    @Column(name="ID")

    private String id;


    @Column(name="NAME")

    private STring username;


    private Inter age; (어노테이션을 생략하면 필드명 자체로 매핑한다)


    persistence.xml 설정 (필요한 설정정보 관리)


    <?xml version="1.0" encoding="UTF-8"?>

    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"

    version="2.1">

    <persistence-unit name="DepartmentEvaluation">

    <properties>

    <!-- 필수 -->

    <property name="javax.persistence.jdbc.url"

    value="jdbc:mysql://[데이터베이스주소]/[데이터베이스명]?useServerPrepStmts=false" />

    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

    <property name="javax.persistence.jdbc.user" value="[아이디]" />

    <property name="javax.persistence.jdbc.password" value="[비밀번호]" />

    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>

    <!-- 옵션 -->

    <property name="hibernate.show_sql" value="true"/>

    <property name="hibernate.format_sql" value="true"/>

    <property name="hibernate.use_sql_comments" value="true"/>

    <property name="hibernate.id.new_generator_mappings" value="true"/>

    </properties>

    </persistence-unit>

    </persistence>



    이제 가장중요한(아마도..)  실제 어플리케이션을 개발하는 코드


    세부분으로 나뉘어져있다.

    1.엔티티 매니저 설정

    2.트랜잭션 관리

    3.비즈니스 로직



    먼저 뭔지 개념을 살펴본다음에 코드를 보자


    1.엔티티 매니저 설정


    1)생성과정


    persistence.xml에 설정한 정보를 가지고 entitymanagerfactory를 생성한다. 이 팩토리가 entity매니저를 여러개 생성한다


    2)팩토리 생성


    EntityManagerFactory emf=Persistence.createEntityManagerFactory("DepartmentEvaluation")


    이러면 xml파일에서 설정한 unit 이름을 찾아서 팩토리를 생성한다.


    엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다

    데이터베이스 커넥션 풀도 생성하고 jpa 동작하기 위한 기반객체도 만들기 때문에 생성비용이 아주크기때문이다.


    3)엔티티 매니저 생성


    EntityManager em=emf.createEntityManager();


    엔티티 매니저를 이용해서 데이터베이스에 등록/수정/삭제/조회할 수 있다.


    데이터 베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다.


    4)종료


    em.close()

    emf.close()


    둘다 반드시 종료해준다.


    2.트랜잭션 관리  (jpa를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야한다. 그렇지 않으면 예외가 발생한다)


    트랜잭션을 시작하려면 엔티티 매니저에서 트랜잭션 api를 받아와야한다.


    EntityTransaction tx=em.getRansaction(); // 이게 api를 받는것이다


    try{

    tx.begin();//트랜잭션시작

    logic(em); //비즈니스 로직실행

    tx.commit()

    }

    catch{

    tx.rollvack(); //예외 발생시 트랜잭션 rollback

    }


    3.비즈니스 로직 ( 테이블 엔티티를 하나 생성한 다음 엔티티 매니저를 통해 데이터베이스에 데이터를 만지작..)


    public static 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()+",age="+findMember.getAge());


    //목록으로 조회

    List<Member> members=em.createQuery("select m from Member m",Member.class).getResultList()


    //삭제

    em.remove(member);



    4.jqpl
        

    검색쿼리는 문제가 좀 있다. 예를들어 목록으로 조회할때를 보면 데이터를 모두 불러와서 엔티티 객체로 변경해야할터인디 

    이것은 사실상 불가능하므로 sql를 쓴다 이때 jpa는 jpql이라는 java persistence query language 쿼리언어로 해결한다.


    jpql은 디비 테이블에 대해 전혀 모른다.select m from Member m",Member.class 여기서 from Member는 

    객체 Member를 말하는 것이다.



    '2017년 > web Development' 카테고리의 다른 글

    SpringJPA를 알아보자  (0) 2017.08.13
    mysql과 spring을 연동해보자  (0) 2017.08.07
    웹개발환경을 구축해보자 [spring framework,maven]  (0) 2017.08.07
    세션과 자스의 이해  (0) 2017.07.19
    xml과 json  (0) 2017.07.05

    대화의 장 💬