JPA란
- Java 진영의 ORM(Oriented Relational Mapping)표준 기술
- 범용 기술로 만들어졌기 때문에 Java EE와 SE환경 어디서도 사용 가능하다.
- Java EE 5.0 어노테이션을 사용하여 Java 객체에서 RDB로 Mapping하는 방법을 단순화 시켰다.
※ ORM : 데이터베이스와 객체 지향 프로그래밍 언어간 호환되지 않은 데이터를 변환하는 프로그래밍 기법이다.
따라서 OOP와 RDBMS 중간에서 소통을 위해 통역기 역할을 해주기 때문에 개발자는 OOP 개발에 더욱 집중할 수 있게되고
RDBMS 는 상대적으로 덜 고려해도 된다.
※ RDB : 관계형 데이터베이스. 키(Key)-값(Value)의 쌍으로 이루어진 관계를 테이블화 시킨 전산 정보 데이터베이스
JPA 의존성 추가
- Maven
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.1.RELEASE</version>
</dependency>
</dependencies>
- Gradle
dependencies {
compile 'org.springframework.data:spring-data-jpa:1.11.1.RELEASE'
}
Query 메소드
-쿼리 생성
메소드 이름으로 쿼리 생성
* 예
public interface UserRepository extends Repository<User, Long>{
List<User> findByNameAndAddress(String name, String address)
}
위의 메소드 쿼리는 다음과 같이 변환된다.
SELECT u FROM User u WHERE u.name =?1 AND u.address=?2
* 지원되는 키워드
Keyword | Sample | JPQL snippet |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- NamedQuery
1. XML
* <named-query/> 요소를 META-INF내의 orm.xml JPA 설정 파일에 작성한다.
<named-query name="User.findByName>
<query>SELECT u FROM User u WHERE u.name=?1</query>
</named-query>
2. 어노테이션 설정
* 다른 설정 파일이 필요하지 않고 Entity 클래스에서 설정할 수 있습니다.
@Entity
@NamedQuery(name = "User.findByName", query="SELECT u FROM User u WHERE u.name =?1")
public class User{
...
}
- @Query
* Query 어노테이션은 위의 NamedQuery에 비해 우선순위가 높다.
1. 쿼리 선언
public interface UserRepository extends Repository <User, Long>{
@Query("SELECT u FROM User u WHERE u.name = ?1")
List<User> findByName(String name);
}
2. like
* Like 구분 문자 %가 인식 되면서 유효한 JPQL(%가 삭제하면서)로 변형되는 쿼리가 됩니다. 쿼리 실행 동안 메소드로 전달된 파라미터가 LIKE 아규먼트가 됩니다.
@Query("SELECT u FROM User u WHERE u.name like %?1")
List<User> findByNameEndsWith(String name);
3. 네이티브 쿼리 선언
* 네이티브 SQL은 오라클 SQL등과 같은 데이터 소스가 사용하는 SQL이다. 특정 DBMS가 제공하는 기능을 사용하기 위해 네이티브 SQL을 지원한다.
* 해당 선언으로 네이티브 쿼리의 실행을 허용한다.
@Query(value="SELECT * FROM USER WHERE NAME =?0", nativeQuery=true)
List<User> findByName(String name);
4. named parameter 사용
* @Param 어노테이션을 사용해 메소드의 파라미터에 구체적인 이름을 주고 해당 이름으로 바인딩하게 한다.
@Query("SELECT u FROM User u WHERE u.name = :name OR u.address = :address")
List<User> findByNameOrAddress(@Param("address") String address, @Param("name") String name);
'WEB > Spring' 카테고리의 다른 글
HandlerMethodArgumentResolver (0) | 2017.02.01 |
---|---|
@Controller (1) | 2017.01.30 |
Spring Boot : Bootstrap 연결 (0) | 2017.01.20 |
Spring Boot에서 Jsp 사용 (0) | 2017.01.20 |
Spring Boot (0) | 2017.01.20 |