Spring Data JPA는 Spring 프레임워크에서 제공하는 데이터 액세스 추상화 라이브러리로, 데이터베이스 작업을 보다 쉽고 효율적으로 처리할 수 있도록 도와줍니다. 이 튜토리얼에서는 Spring Boot 프로젝트에 Spring Data JPA를 적용하여 데이터베이스 연동을 하는 과정을 단계별로 살펴보겠습니다.
개발 환경 설정
먼저 Spring Initializr에서 Spring Boot 프로젝트를 생성합니다. 의존성으로 Spring Web, Spring Data JPA, H2 Database를 선택합니다.
프로젝트를 생성하고 IDE에서 열어줍니다. pom.xml
에는 선택한 의존성들이 자동으로 추가되어 있을 것입니다.
엔티티 클래스 작성
데이터베이스 테이블과 매핑될 엔티티 클래스를 작성합니다. User
클래스를 다음과 같이 작성해봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Entity
@Table(name = “users”)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
// getters and setters
}
|
cs |
@Entity
애노테이션은 JPA 엔티티임을 나타내고, @Table
은 매핑될 테이블 이름을 지정합니다. 필드에는 @Id
, @GeneratedValue
, @Column
등의 애노테이션을 사용하여 매핑 정보를 설정할 수 있습니다.
Repository 인터페이스 작성
다음으로 User
엔티티에 대한 DB 작업을 수행할 UserRepository
인터페이스를 작성합니다.
1
2
3
4
|
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
|
cs |
JpaRepository
를 상속받으면 기본적인 CRUD 메소드를 바로 사용할 수 있습니다. 이메일로 사용자를 조회하는 findByEmail()
메소드도 추가했습니다.
서비스 계층 작성
도메인 로직을 담당할 서비스 계층의 클래스를 작성합니다.
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
|
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional
public User join(User user) {
validateDuplicateMember(user);
return userRepository.save(user);
}
private void validateDuplicateMember(User user) {
userRepository.findByEmail(user.getEmail())
.ifPresent(u –> {
throw new IllegalStateException(“이미 존재하는 회원입니다.”);
});
}
public List<User> findUsers() {
return userRepository.findAll();
}
public Optional<User> findOne(Long userId) {
return userRepository.findById(userId);
}
}
|
cs |
@Transactional
을 사용하여 트랜잭션을 적용하고, UserRepository
를 주입받아 사용합니다. 사용자 등록, 조회 등의 서비스 메소드를 구현합니다. 이메일 중복 검증 로직도 추가했습니다.
데이터베이스 설정
application.properties
파일에 데이터베이스 연결 정보와 JPA 설정을 추가합니다.
1
2
3
4
5
6
|
spring.datasource.url=jdbc:h2:tcp://localhost/~/datajpa
spring.datasource.driver–class–name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show–sql=true
spring.jpa.hibernate.ddl–auto=create
|
cs |
여기서는 H2 데이터베이스를 사용했습니다. spring.jpa.show-sql
은 JPA가 생성한 SQL을 출력하는 옵션이고, spring.jpa.hibernate.ddl-auto
는 어플리케이션 실행 시점에 테이블을 자동으로 생성하는 옵션입니다.
테스트 코드 작성
마지막으로 UserRepository
와 UserService
가 잘 동작하는지 테스트 해봅니다.
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
|
@SpringBootTest
@Transactional
class UserServiceTest {
@Autowired UserService userService;
@Autowired UserRepository userRepository;
@Test
public void 회원가입() throws Exception {
//given
User user = new User();
user.setName(“kim”);
user.setEmail(“kim@example.com”);
//when
Long saveId = userService.join(user);
//then
User findUser = userRepository.findById(saveId).get();
assertEquals(user.getName(), findUser.getName());
}
@Test
public void 중복_회원_예외() throws Exception {
//given
User user1 = new User();
user1.setName(“kim”);
user1.setEmail(“kim@example.com”);
User user2 = new User();
user2.setName(“kim”);
user2.setEmail(“kim@example.com”);
//when
userService.join(user1);
//then
assertThrows(IllegalStateException.class, () –> {
userService.join(user2);
});
}
}
|
cs |
@SpringBootTest
와 @Transactional
을 사용하여 스프링 컨테이너 환경에서 테스트를 실행하고, 트랜잭션을 적용합니다. 회원가입 테스트에서는 UserService.join()
메소드를 호출하여 사용자를 등록하고, 등록된 사용자를 조회하여 검증합니다. 중복 회원 예외 테스트에서는 동일한 이메일로 회원 등록 시 예외가 발생하는지 확인합니다.
이상 Spring Data JPA를 사용하여 데이터베이스 연동을 하는 과정을 살펴보았습니다. 실제로 프로젝트를 개발 시에는 본인의 요구사항에 맞게 엔티티와 서비스 로직을 설계하고, 다양한 쿼리 메소드를 활용하여 데이터를 조작하게 될 것입니다. 테스트 코드로 검증하는 과정도 꼭 거치시길 바랍니다.