본문 바로가기

Programming/Spring Security

[Spring Security][회원가입 및 로그인 예제 3/9] Repository 생성 (JPA : Query Mapping)

들어가며...

이전 글에서 테이블을 매핑할 Model Object를 생성하였습니다. 이번 글에서는 JpaResository를 이용하여 물리적인 데이터베이스의 ACCOUNT, ROLES 테이블에서 Query를 수행한 후 반환되는 데이터를 Account, Role Object Class에 담아주는 역할을 하는 Repository 부분을 살펴보도록 하겠습니다.

 

추가적인 SQL을 추가하지 않는 이상 솔직히 구현하는 부분은 별다른게 없으나 복잡한 SQL문을 수행하기 위해서는 Hibernate(Spring Data JPA)에서 정의한 사용법을 익히는 것이 중요합니다.

 

※ 정리 : Model을 생성하는 작업이 Entity Class와 데이터베이스의 테이블을 Mapping하는 작업이였다면 Repository 생성부분은 Query를 생성(또는 원하는 SQL문을 생성하기 위한 Mapping 방법 정의) 하는 부분이라 할 수 있습니다. Hibernate(Spring Data JPA도 Hibernate를 사용하여 구현한 프레임워크이므로 앞으로의 글에서 Hibernate와 Spring Data JPA를 혼용하여 사용하여도 혼돈 없으시기 바랍니다.)에서는 이를 위해 기본적인 함수를 이용하여 Object class와 매핑하는 방식, JPQL, 네이티브 SQL을 사용하는 방식등을 제공합니다. 본 글에서는 Hibernate함수를 이용하여 Spring Data JPA에서 구현한 함수명 정의에 따른 방법에 대해서만 간략하게 설명할 것입니다.

 

  • Table of Contents
    • AccountRepository, RoleRepository 구현
    • JPA Repositories

AccountRepository, RoleRepository 구현

● AccountRepository.java

package com.demo.security.auth.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.demo.security.auth.model.Account;

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
	public Account findByEmail(String email);
	public Account findByUsername(String username);
}

 

● RoleRepository.java

package com.demo.security.auth.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.demo.security.auth.model.Role;

@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
	public Role findByRole(String role);
}

 

이러한 방식으로 데이터베이스와 Object를 Mapping하는 방식은 Redis, Elasticsearch등과 같이 memory기반의 검색엔진/데이터베이스에서도 비슷한 형태로 정의하여 사용하기 때문에 이러한 방식을 이해하는 것도 나쁘지 않을 듯 합니다.

 

간략하게 설명하면 JpaRepository를 상속받아 필요한 Query를 Spring Data JPA의 문법에 맞게 필요한 함수명으로 명시하여 주면 JpaRepository<T, ID>에서 T에 명시한 Object에 결과값을 채워 반환하는 구조입니다.

 

간단한 구조의 Query를 수행할 때는 더할나위 없이 편하겠으나 복잡한 Query의 경우에는 JPQL 또는 네이티브 SQL을 사용하는 것이 좋을 듯 싶습니다.

JPA Repositories

Hibernate(Spring Data JPA)에서 제공하는 Query를 수행하는 방식에는 다양한 방법이 있으나 본 글에서는 함수명 정의에 따른 동작방식에 대해서만 간략하게 정리하도록 하겠습니다.

 

함수명을 Keyword처럼 구성하여 Query문을 구성하는 방법은 모두 SELECT문을 수행하기 위한 방법이며 "findBy"로 시작하여 컬럼명과 keyword의 조합으로 Query문을 구성합니다. 아래는 간략한 예시입니다.

 

위의 Query Method를 SQL문으로 풀어쓰면 대략 "SELECT * FROM ACCOUNT WHERE USERNAME = ? AND EMAIL = ?"이 될 것입니다.

 

이 외에도 XML문을 참조하는 "XML Named Query Definition", "Annotation-Based named query configuration", @Query Annotation을 사용한 JPQL 및 Native SQL을 사용하는 방법등 다양하게 사용할 수 있습니다.

 

자세한 내용이 궁금하신 분은 아래의 문서를 참조하십시오.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories

 

Spring Data JPA - Reference Documentation

Example 108. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v

docs.spring.io

마무리...

지금까지 JPA를 사용하여 SQL문을 전달하는 방법으로 함수명 정의 방식에 대해서 간략하게 정리하여 보았습니다. 실무에서는 이러한 방식보다는 JPQL 또는 네이티브 SQL문을 더 많이 사용할 듯 합니다만 해당 부분은 추후에 집중적으로 알아보도록 하겠습니다.

 

 


U2ful은 입니다. @U2ful Corp.