본문으로 바로가기

[JPA] 사용해보기

category Back-end/Spring 2016. 5. 4. 14:29

간단하게 JPA실습을 해보자



1. 메이븐 프로젝트로 바꾼뒤에

pom.xml에 아래 디펜던시들과 레파지토리를 추가해준다.




2. rootContext와 applicationContext를 Spring Bean Configuration File로 만들어준다.



rootJPAContext.xml

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
 
    <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>    
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
        <property name="username" value="SPRING"/>
        <property name="password" value="spring"/>
    </bean>
    
    
 
    
    <!-- JPA  공급자 설정-->
    <bean id="hibernateJpaVendorAdaptor"
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <!-- 자동 생성되는 SQL문을 보여주는 역할인듯 -->
        <property name="showSql" value="true"/>
    </bean>
    
    <!-- 캐시(영속성 컨테이너)에 접근할 수 있는 EntityManager 생성 -->
    <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdaptor"/>
        <property name="packagesToScan" value="com.ktds.jgbaek"/>
    </bean>
    
    <!-- JPA 전용 TransactionManager 생성 -->
    <bean id="txManager"
            class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>        
    </bean>
    
    
    <!-- JPA Repository 자동 탬색 경로 설정 -->
    <jpa:repositories base-package="com.ktds.jgbaek"
                        transaction-manager-ref="txManager"/>
    <!-- Transaction Advice 설정 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" rollback-for="RuntimeException"/>
        </tx:attributes>
    </tx:advice>
    
    <!--  Transanction AOP(Proxy) 설정 -->
    <aop:config>
        <aop:pointcut id="requiredTx"
                        expression="execution(* com.ktds.jgbaek..service..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx"/>
    </aop:config>        
</beans>
 
cs


applicationContext.xml

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
32
33
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <mvc:annotation-driven/>
    <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"></property>        
    </bean>
    
    <bean id="jpaBiz"
            class="com.ktds.jgbaek.biz.impl.JPABizImpl">
        <property name="jpaRepository" ref="jpaRepository"/>
    </bean>
    
    <bean id="jpaService"
            class="com.ktds.jgbaek.service.impl.JPAServiceImpl">
        <property name="jpaBiz" ref="jpaBiz"/>
    </bean>
    
    <bean id="jpaController"
            class="com.ktds.jgbaek.web.JPAController">
        <property name="jpaService" ref="jpaService"/>
    </bean>
    
</beans>
 
 
 
cs




3. vo대신 domain/ dao 대신 repository 로 biz, domain, repository, service, web을 만든다.



JPA.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.ktds.jgbaek.domain;
 
import java.util.List;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
 
@Entity
@Table(name="JPA")
public class JPA {
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", nullable=false)
    private int id;
    
    @Column(name="subject", nullable=true)
    private String subject;
    
    @Column(name="description", nullable=true)
    private String description;
    
    @OneToMany(mappedBy="jpa", fetch=FetchType.LAZY)
    private List<JPA2> jpa2;
    
 
    public List<JPA2> getJpa2() {
        return jpa2;
    }
    public void setJpa2(List<JPA2> jpa2) {
        this.jpa2 = jpa2;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
 
}
 
 
 
cs




JPABizImpl.java
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.ktds.jgbaek.biz.impl;
 
import java.util.ArrayList;
import java.util.List;
 
import com.ktds.jgbaek.biz.JPABiz;
import com.ktds.jgbaek.domain.JPA;
import com.ktds.jgbaek.domain.JPA2;
import com.ktds.jgbaek.repository.JPARepository;
 
public class JPABizImpl implements JPABiz{
 
    private JPARepository jpaRepository;
    
    public void setJpaRepository(JPARepository jpaRepository) {
        this.jpaRepository = jpaRepository;
    }
 
    @Override
    public JPA insertData() {
        JPA jpa= new JPA();
        jpa.setSubject("JPA Test");
        jpa.setDescription("JPA Desctiprion");
        
        JPA2 jpa2 = new JPA2();
        jpa2.setMemo("반갑습니다..");
        
        List<JPA2> jpa2List = new ArrayList<JPA2>();
        jpa2List.add(jpa2);
        
        jpa.setJpa2(jpa2List);
        
        jpaRepository.save(jpa);
        
        System.out.println(jpa.getSubject());
        System.out.println(jpa.getDescription());
        System.out.println(jpa.getId());
        
        return jpa;
    }
 
    @Override
    public JPA updateData(JPA jpa) {
        jpaRepository.save(jpa);
        
        JPA jpas = jpaRepository.findOne(7);
        return jpa;
    }
 
}
 
 
 
cs

JPARepository.java
신기하게 아무것도 구현하지 않았는데 자동으로 쿼리가 만들어진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.ktds.jgbaek.repository;
 
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
 
import com.ktds.jgbaek.domain.JPA;
 
@Repository("jpaRepository")
public interface JPARepository extends JpaRepository<JPA, Integer>{
 
}
 
 
 




JPAServiceImpl.java

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
package com.ktds.jgbaek.service.impl;
 
import com.ktds.jgbaek.biz.JPABiz;
import com.ktds.jgbaek.domain.JPA;
import com.ktds.jgbaek.service.JPAService;
 
public class JPAServiceImpl implements JPAService{
 
    private JPABiz jpaBiz;
    
    public void setJpaBiz(JPABiz jpaBiz) {
        this.jpaBiz = jpaBiz;
    }
 
    @Override
    public void insertData() {
        JPA jpa = jpaBiz.insertData();
        
        jpa.setSubject("수정합니다...");
        jpaBiz.updateData(jpa);
    }
    
}
 
 
cs



결과창에 자동으로 쿼리가 만들어진다.

만약 안된다면 직접 HIBERNATE_SEQUENCE를 만들어주면 된다.

테이블은 JPA테이블의 ID, SUBJECT, DESCRIPTION 칼럼을 만들어줬다.





'Back-end > Spring' 카테고리의 다른 글

[Spring] 웹소켓 js파일  (0) 2017.06.05
[Spring] 공부문제  (2) 2016.05.31
[JPA] JPA에 관해..  (0) 2016.05.04
[HTML] 자동완성 기능 만들기  (0) 2016.05.03
[HTML] 서버돌리지 않고 창 띄우기  (0) 2016.05.02