제육's 휘발성 코딩
반응형

Hello JPA - 어플리케이션 개발

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0.0</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>
    </dependencies>
    <!-- 자바 11버전의 경우 추가설정 -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
</project>
  • pom.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
 xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
 <persistence-unit name="hello">
 <properties>
 <!-- 필수 속성 -->
 <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
 <property name="javax.persistence.jdbc.user" value="sa"/>
 <property name="javax.persistence.jdbc.password" value=""/>
 <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
 <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

 <!-- 옵션 -->
 <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.hbm2ddl.auto" value="create" />-->
 </properties>
 </persistence-unit>
</persistence> 
  • resources - META-INF - pesistence.xml 생성

데이터베이스 방언

  • JPA는 특정 DB에 종속 X
  • 가변 문자 : MySQL : VARCHAR, Oracle은 VARCHAR2
  • 문자열 자르는 함수 : SQL 표준 : SUBSTRING(), Oracle 은 SUBSTR()
  • 페이징 : MySQL은 LIMIT, Oracle 은 ROWNUM
  • JPA는 Dialect를 사용하여 방언별 SQL을 생성한다.

JPA 구동 방식

sec2  사진1

JPA CRUD

@Entity
public class Member {

    @Id
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • Member 클래스 생성
public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member member = new Member();
            member.setId(2L);
            member.setName("HelloB");

            em.persist(member);

            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}
  • 회원 등록 - 트랜잭션 시작, 커밋 설정이 있어야 오류 발생하지 않는다.
Member findMember = em.find(Member.class, 1L);
System.out.println("findMemberId = " + findMember.getId());
System.out.println("findMemberName = " + findMember.getName());
tx.commit();
  • 회원 조회 - 제공되는 find 메서드 사용 (클래스, PK)
 Member findMember = em.find(Member.class, 1L);       
 em.remove(1L);
 tx.commit();
  • 회원 삭제
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
  • 회원 수정 - setName 만하고 em.persist()를 사용하지 않았음에도 DB에 값이 변경 된다.
  • 자바의 컬렉션을 다루는것 처럼 JPA가 관리해준다.

주의점

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드 간에 공유X (사용하고 버려야 한다.)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

JPQL

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL 문법과 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리, SQL은 테이블을 대상으로 쿼리
  • 즉, 한마디로 정의하자면 객체 지향 SQL이다.
List<Member> result = em.createQuery("select m from Member as m ", Member.class)
                    .getResultList(); //Member 가 테이블 대상이 아닌 객체 대상 으로 조회한다.
for (Member member : result) {
    System.out.println("member.name = " + member.getName());
}
tx.commit();
  • 테이블 대상이 아닌 객체 대상 으로 조회한다.
  • 엔티티 객체를 중심으로 개발이 가능 (Member.class)

본 포스팅은 인프런 김영한님 강의(자바 ORM 표준 JPA 프로그래밍 - 기본편)를 토대로 정리한 내용입니다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^