Spring Data JPA의 장점
- 자동화된 CRUD 메서드 제공: Spring Data JPA는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 자동으로 제공하는 인터페이스(JpaRepository, CrudRepository)를 통해 간단하게 데이터베이스 작업을 수행할 수 있습니다.
- 메서드 이름을 통한 쿼리 생성: 복잡한 쿼리를 메서드 이름만으로 생성할 수 있습니다. 예를 들어, findByUsername과 같은 메서드 이름을 사용하여 특정 필드로 데이터를 조회할 수 있습니다.
- 트랜잭션 관리: Spring Data JPA는 트랜잭션 관리를 자동으로 처리하여 데이터베이스 작업의 원자성을 보장합니다.
- JPQL 및 네이티브 쿼리 지원: 필요에 따라 JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리를 사용할 수 있습니다.
Mapper를 사용하는 경우
Mapper는 객체 간의 변환을 담당하는 도구입니다. 일반적으로 데이터베이스 엔티티와 비즈니스 로직에서 사용하는 DTO(Data Transfer Object) 간의 변환을 처리할 때 사용됩니다. Spring Data JPA를 사용하면 직접적인 매핑 작업이 줄어들지만, 여전히 특정 상황에서는 Mapper가 유용할 수 있습니다.
Mapper를 사용하는 상황
- DTO 사용: 데이터베이스 엔티티와 클라이언트 사이에서 데이터를 주고받기 위한 DTO를 사용할 때, Mapper를 이용해 엔티티와 DTO 간의 변환을 처리할 수 있습니다. 이를 통해 데이터베이스 모델을 클라이언트에게 직접 노출하는 것을 방지할 수 있습니다.
- 복잡한 변환 로직: 엔티티와 DTO 간의 변환 로직이 복잡한 경우, Mapper를 사용하여 변환 로직을 분리하고 재사용할 수 있습니다.
- 다양한 데이터 소스: 여러 데이터 소스에서 데이터를 수집하여 하나의 객체로 변환해야 하는 경우, Mapper를 사용하여 각 데이터 소스로부터 수집한 데이터를 통합할 수 있습니다.
Mapper 예시
Entity
package com.example.board.model; import jakarta.persistence.*; import lombok.Data; @Entity @Data public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; private String role; }
DTO
package com.example.board.dto; import lombok.Data; @Data public class UserDto { private Long id; private String username; private String role; }
Mapper 인터페이스 (MapStruct 사용)
package com.example.board.mapper; import com.example.board.dto.UserDto; import com.example.board.model.User; import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface UserMapper { UserDto toDto(User user); User toEntity(UserDto userDto); }
Service에서 Mapper 사용
package com.example.board.service; import com.example.board.dto.UserDto; import com.example.board.mapper.UserMapper; import com.example.board.model.User; import com.example.board.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private UserMapper userMapper; public UserDto save(UserDto userDto) { User user = userMapper.toEntity(userDto); user = userRepository.save(user); return userMapper.toDto(user); } public UserDto findByUsername(String username) { User user = userRepository.findByUsername(username); return userMapper.toDto(user); } }
결론
Spring Data JPA를 사용하면 많은 데이터베이스 관련 작업이 자동으로 처리되기 때문에 Mapper를 사용할 필요가 줄어듭니다. 하지만, DTO를 사용하거나 복잡한 객체 변환이 필요한 경우 Mapper를 사용하는 것이 유리할 수 있습니다. MapStruct와 같은 라이브러리를 사용하면 이러한 작업을 더욱 간편하게 처리할 수 있습니다. 각 프로젝트의 요구사항에 맞게 적절한 도구와 방법을 선택하는 것이 중요합니다.