블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
04-29 12:43
 

달력

« » 2025.4
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
 

공지사항

최근에 올라온 글

최근에 달린 댓글

'Spring Data JPA'에 해당되는 글 3건

  1. 2011.09.05 Spring Data JPA 맛보기 (3) 4
  2. 2011.09.05 Spring Data JPA 맛보기 (2) 2
  3. 2011.09.05 Spring Data JPA 맛보기 (1) 2

지난 번 포스팅에서 작성한 코드에 대한 테스트 코드를 만들어보겠습니다.


1. 테스트 클래스 생성

/spring-data-sample/src/test/java/kr/co/vicki/sample/spring/data/jpa/repository/IMemberRepositoryTest.java
01package kr.co.vicki.sample.spring.data.jpa.repository;
02 
03import static org.junit.Assert.*;
04 
05import kr.co.vicki.sample.spring.data.jpa.domain.Member;
06 
07import org.junit.Test;
08import org.junit.runner.RunWith;
09import org.springframework.beans.factory.annotation.Autowired;
10import org.springframework.test.context.ContextConfiguration;
11import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12import org.springframework.transaction.annotation.Transactional;
13 
14@RunWith(SpringJUnit4ClassRunner.class)
15@ContextConfiguration(locations = "classpath:/repository-context.xml")
16@Transactional
17public class IMemberRepositoryTest {
18     
19    @Autowired
20    IMemberRepository repository;
21     
22    @Test
23    public void testCrud() {
24        // Create      
25        Member entity = new Member();
26        entity.setMemberId("vicki");
27        entity.setMemberName("자수씨");
28         
29        repository.save(entity);
30 
31        ...
32    }
33 
34}


위의 테스트 코드를 실행하니 아래와 같은... 시퀀스가 없다고 합니다.




하이버네이트 용 시퀀스를 생성합니다.

1CREATE SEQUENCE hibernate_sequence
2    INCREMENT BY 1
3    START WITH 1
4    NOMAXVALUE
5    NOMINVALUE
6    NOCYCLE
7    NOORDER


코드를 실행하면 결과는 체크가 불가능하지만 녹색바가 뜨기 때문에 정상 동작한다고 생각합니다 -ㅅ-;;;


2. JpaRepository 의 이용



JpaRepository 는 기존에 사용하였던 CrudRepository 와 PagingAndSortingRepository 를 상속받는 구조입니다.

기존에 사용하였던 CRUD 외에 페이징과 소팅도 지원을 하며 메소드 이름을 통해 쿼리 제너레이션이 가능합니다.

IMemberRepository 의 superclass 를 JpaRepository 로 변경한 후 아래와 같이 메소드를 추가합니다.

1public interface IMemberRepository extends JpaRepository<Member, Long> {
2     
3    Member findByMemberId(String memberId);
4 
5}


findByMemberId(String memberId) 메소드는 메소드 이름 통해 쿼리를 생성하여 실행되게 됩니다.

select m from Member m where m.memberId = ?1


아래와 같은 규칙으로 메소드 이름으로 쿼리가 생성되니 참고를...
Keyword
Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Between findByStartDateBetween … where x.startDate between 1? and ?2
LessThan findByAgeLessThan … where x.age < ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
OrderBy findByAgeOrderByLastnameDesc … where x.age > ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1


SQL 없이 직관적으로 코딩이 가능한 Spring Data JPA!!! 실제 개발 프로젝트에 적용시키까지는 많은 시간이 걸리겠지만 컨셉은 아주 상콤합니다!!!

Posted by 자수씨
, |

이전 포스팅에 이어 샘플 소스를 작성해보도록 하겠습니다.


1. 테이블 생성
샘플 테스트에 사용할 테이블을 아래 스크립트를 실행시켜 생성합니다.

01CREATE TABLE "MEMBER" (
02    "ID"            NUMBER NOT NULL,
03    "MEMBER_ID"     VARCHAR2(20) NOT NULL,
04    "MEMBER_NAME"   VARCHAR2(25) NOT NULL,
05    "MEMBER_DESC"   VARCHAR2(25) NULL,
06    "INSERT_DATE"   DATE DEFAULT SYSDATE NULL,
07    "UPDATE_DATE"   DATE DEFAULT SYSDATE NULL,
08    CONSTRAINT "PK_MEMBER" PRIMARY KEY("ID")
09     
10)



2. domain, repository 소스 구성



Member 클래스: id 컬럼을 기본적으로 제공해주는 AbstractPersistable 를 상속받습니다.
- kr.co.vicki.sample.spring.data.jpa.domain.Member
001package kr.co.vicki.sample.spring.data.jpa.domain;
002 
003import java.util.Date;
004 
005import javax.persistence.Column;
006import javax.persistence.Entity;
007 
008import org.springframework.data.jpa.domain.AbstractPersistable;
009 
010@Entity
011public class Member extends AbstractPersistable<Long> {
012 
013    private static final long serialVersionUID = -7580946962260808515L;
014     
015    @Column(name = "MEMBER_ID", nullable = false)
016    private String memberId;
017     
018    @Column(name = "MEMBER_NAME", nullable = false)
019    private String memberName;
020     
021    @Column(name = "MEMBER_DESC")
022    private String memberDesc;
023     
024    @Column(name = "INSERT_DATE")
025    private Date insertDate;
026     
027    @Column(name = "UPDATE_DATE")
028    private Date updateDate;
029 
030    /**
031     * @return the memberId
032     */
033    public String getMemberId() {
034        return memberId;
035    }
036 
037    /**
038     * @param memberId the memberId to set
039     */
040    public void setMemberId(String memberId) {
041        this.memberId = memberId;
042    }
043 
044    /**
045     * @return the memberName
046     */
047    public String getMemberName() {
048        return memberName;
049    }
050 
051    /**
052     * @param memberName the memberName to set
053     */
054    public void setMemberName(String memberName) {
055        this.memberName = memberName;
056    }
057 
058    /**
059     * @return the memberDesc
060     */
061    public String getMemberDesc() {
062        return memberDesc;
063    }
064 
065    /**
066     * @param memberDesc the memberDesc to set
067     */
068    public void setMemberDesc(String memberDesc) {
069        this.memberDesc = memberDesc;
070    }
071 
072    /**
073     * @return the insertDate
074     */
075    public Date getInsertDate() {
076        return insertDate;
077    }
078 
079    /**
080     * @param insertDate the insertDate to set
081     */
082    public void setInsertDate(Date insertDate) {
083        this.insertDate = insertDate;
084    }
085 
086    /**
087     * @return the updateDate
088     */
089    public Date getUpdateDate() {
090        return updateDate;
091    }
092 
093    /**
094     * @param updateDate the updateDate to set
095     */
096    public void setUpdateDate(Date updateDate) {
097        this.updateDate = updateDate;
098    }
099 
100}



IMemberRepository 클래스: id 를 이용하여 기본적인 CRUD 를 제공해주는 CrudRepository 를 상속받습니다.
- kr.co.vicki.sample.spring.data.jpa.repository.IMemberRepository
1package kr.co.vicki.sample.spring.data.jpa.repository;
2 
3import kr.co.vicki.sample.spring.data.jpa.domain.Member;
4 
5import org.springframework.data.repository.CrudRepository;
6 
7public interface IMemberRepository extends CrudRepository<Member, Long> {
8 
9}



3. 환경 설정



/META-INF/persistence.xml (JPA 설정)
1<?xml version="1.0" encoding="UTF-8"?>
4    <persistence-unit name="spring-jpa" />
5</persistence>


/infrastructure.xml (DB 환경 설정)
01<?xml version="1.0" encoding="UTF-8"?>
06 
07    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
08        <property name="dataSource" ref="dataSource" />
09        <property name="jpaVendorAdapter">
10            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
11                <property name="showSql" value="true" />
12                <property name="database" value="ORACLE" />
13            </bean>
14        </property>
15    </bean>
16 
17    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
18        <property name="entityManagerFactory" ref="entityManagerFactory" />
19    </bean>
20 
21    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
22        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
23        <property name="url" value="jdbc:oracle:thin:@[IP]:1521/[SID]" />
24        <property name="username" value="[username]" />
25        <property name="password" value="[password]" />
26    </bean>
27 
28</beans>


/repository-context.xml (jpa repository 등록)
01<?xml version="1.0" encoding="UTF-8"?>
06 
07    <import resource="infrastructure.xml" />
08 
09    <jpa:repositories base-package="kr.co.vicki.sample.spring.data.jpa.repository" />
10 
11</beans>




이제 테스트 코드를 만들일만 남았습니다.

Posted by 자수씨
, |

Spring Data JPA 가 눈에 들어와서 간략한 튜토리얼을 작성합니다.


1. Maven 프로젝트 생성하기

이클립스에서 "New Maven Project" 로 Spring Data JPA 용 프로젝트를 생성합니다.

생성 시에 "Create a simple project (skip archetype selection)" 을 체크하시면 좀 더 빠르게 구조화된 프로젝트 구성이 가능합니다.




빌드 패스에서 "JRE System Library" 를 1.4 에서 1.6 으로 변경하고 /src/test/resource 를 삭제하면 위와 같은 구성이 됩니다.


2. pom.xml 설정

pom.xml 에 디펜던시와 플러그인과 관련된 설정을 적용합니다.
003    <modelVersion>4.0.0</modelVersion>
004    <groupId>kr.co.vicki</groupId>
005    <artifactId>spring-data-sample</artifactId>
006    <version>0.0.1-SNAPSHOT</version>
007 
008    <properties>
009        <spring.version>3.0.5.RELEASE</spring.version>
010        <jpa.version>2.0.0</jpa.version>
011        <junit.version>4.8</junit.version>
012        <hibernate.version>3.5.6-Final</hibernate.version>
013        <slf4j.version>1.6.1</slf4j.version>
014        <aspectj.version>1.6.8</aspectj.version>
015        <jodatime.version>1.5.2</jodatime.version>
016        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
017    </properties>
018 
019    <repositories>
020        <repository>
021            <id>repository.springframework.maven.release</id>
022            <name>Spring Framework Maven Release Repository</name>
023            <url>http://maven.springframework.org/release</url>
024        </repository>
025        <repository>
026            <id>repository.springframework.maven.milestone</id>
027            <name>Spring Framework Maven Milestone Repository</name>
028            <url>http://maven.springframework.org/milestone</url>
029        </repository>
030        <repository>
031            <id>repository.springframework.maven.snapshot</id>
032            <name>Spring Framework Maven Snapshot Repository</name>
033            <url>http://maven.springframework.org/snapshot</url>
034        </repository>
035        <repository>
036            <id>jboss</id>
037            <name>JBoss repository</name>
039        </repository>
040    </repositories>
041 
042    <dependencies>
043 
044        <dependency>
045            <groupId>org.springframework.data</groupId>
046            <artifactId>spring-data-jpa</artifactId>
047            <version>1.0.0.RELEASE</version>
048        </dependency>
049 
050        <dependency>
051            <groupId>junit</groupId>
052            <artifactId>junit</artifactId>
053            <version>${junit.version}</version>
054            <scope>test</scope>
055        </dependency>
056 
057        <dependency>
058            <groupId>log4j</groupId>
059            <artifactId>log4j</artifactId>
060            <version>1.2.16</version>
061            <scope>test</scope>
062        </dependency>
063        <dependency>
064            <groupId>org.springframework</groupId>
065            <artifactId>spring-test</artifactId>
066            <version>${spring.version}</version>
067            <scope>test</scope>
068        </dependency>
069        <dependency>
070            <groupId>org.hamcrest</groupId>
071            <artifactId>hamcrest-all</artifactId>
072            <version>1.1</version>
073            <scope>test</scope>
074        </dependency>
075 
076        <dependency>
077            <groupId>org.hibernate.javax.persistence</groupId>
078            <artifactId>hibernate-jpa-2.0-api</artifactId>
079            <version>1.0.0.Final</version>
080        </dependency>
081        <dependency>
082            <groupId>org.hibernate</groupId>
083            <artifactId>hibernate-entitymanager</artifactId>
084            <version>${hibernate.version}</version>
085            <scope>runtime</scope>
086        </dependency>
087        <dependency>
088            <groupId>org.slf4j</groupId>
089            <artifactId>slf4j-log4j12</artifactId>
090            <version>${slf4j.version}</version>
091            <scope>runtime</scope>
092        </dependency>
093 
094        <!-- ORACLE -->
095        <dependency>
096            <groupId>com.oracle</groupId>
097            <artifactId>ojdbc14</artifactId>
098            <version>10.2.0.4.0</version>
099        </dependency>
100 
101        <!-- HSQL -->
102        <dependency>
103            <groupId>org.hsqldb</groupId>
104            <artifactId>hsqldb</artifactId>
105            <version>1.8.0.10</version>
106            <scope>runtime</scope>
107        </dependency>
108 
109        <dependency>
110            <groupId>joda-time</groupId>
111            <artifactId>joda-time</artifactId>
112            <version>${jodatime.version}</version>
113        </dependency>
114 
115        <dependency>
116            <groupId>org.aspectj</groupId>
117            <artifactId>aspectjweaver</artifactId>
118            <version>${aspectj.version}</version>
119            <scope>runtime</scope>
120        </dependency>
121    </dependencies>
122 
123    <build>
124        <plugins>
125            <plugin>
126                <groupId>org.apache.maven.plugins</groupId>
127                <artifactId>maven-compiler-plugin</artifactId>
128                <version>2.3</version>
129                <configuration>
130                    <source>1.6</source>
131                    <target>1.6</target>
132                </configuration>
133            </plugin>
134        </plugins>
135    </build>
136</project>



위와 같이 pom.xml 을 설정하고 저장하면, Spring Data JPA 로 개발할 수 있는 기본 환경 구성이 완료되었습니다~

Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백