π[Spring] Spring Data JPAλ 무μμΌκΉμ?
- Spring Data JPAλ Spring Frameworkμ μΌλΆλ‘, JPA(Java Persistence API)λ₯Ό λμ± μ½κ² μ¬μ©ν μ μλλ‘ λμμ£Όλ λͺ¨λ(Module)μ λλ€.
- JPA(Java Persistence API)λ μλ° μ ν리μΌμ΄μ μμ κ°μ²΄μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€(Relational Database, RDB) κ°μ 맀νμ μ 곡νλ νμ€ μΈν°νμ΄μ€μΈλ°, Spring Data JPAλ μ΄λ₯Ό κΈ°λ°μΌλ‘ κ°λ°μκ° λ μ μ μ½λλ‘ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©ν μ μκ² λμμ€λλ€.
1οΈβ£ Spring Data JPAμ μ£Όμ νΉμ§.
1οΈβ£ κ°νΈν λ°μ΄ν° μμΈμ€ κ³μΈ΅.
- Spring Data JPAλ λ°μ΄ν°λ² μ΄μ€μμ CRUD(Create, Read, Update, Delete) μμ μ μμ½κ² ꡬνν μ μλ λ°©λ²μ μ 곡ν©λλ€.
- κ°λ°μλ 볡μ‘ν SQL 쿼리λ₯Ό μ§μ μμ±ν νμ μμ΄, Repository μΈν°νμ΄μ€λ₯Ό μ μνλ κ²λ§μΌλ‘ λ°μ΄ν°λ² μ΄μ€ μμ μ μ²λ¦¬ν μ μμ΅λλ€.
2οΈβ£ μλ ꡬν Repository.
- Spring Data JPAλ Repository μΈν°νμ΄μ€λ₯Ό μ μνλ©΄, λ°νμ μμ μ ν΄λΉ μΈν°νμ΄μ€μ ꡬν체λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- μλ₯Ό λ€μ΄,
findById
,save
,delete
μ κ°μ κΈ°λ³Έμ μΈ λ°μ΄ν°λ² μ΄μ€ μ°μ°μ λ³λλ‘ κ΅¬νν νμκ° μμ΅λλ€.
3οΈβ£ λ©μλ μ΄λ¦ κΈ°λ° μΏΌλ¦¬ μμ±.
- Spring Data JPAλ λ©μλ μ΄λ¦μ λΆμνμ¬ μλμΌλ‘ 쿼리λ₯Ό μμ±ν©λλ€.
- μλ₯Ό λ€μ΄,
findByName
κ³Ό κ°μ λ©μλλ₯Ό μ μνλ©΄,name
νλλ₯Ό κΈ°μ€μΌλ‘ λ°μ΄ν°λ₯Ό μ‘°ννλ 쿼리λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- μλ₯Ό λ€μ΄,
- μ΄λ₯Ό ν΅ν΄ 볡μ‘ν 쿼리λ μ½κ² μμ±ν μ μμΌλ©°, μΆκ°μ μΈ μ½λ μμ±μ΄ μ€μ΄λ€μ΄ κ°λ° μλλ₯Ό λμ¬μ€λλ€.
4οΈβ£ JPQL λ° λ€μ΄ν°λΈ 쿼리 μ§μ.
- νμν κ²½μ° JPQL(Java Persistence Query Language) λλ λ€μ΄ν°λΈ SQL(Structured Query Language) 쿼리λ₯Ό μ§μ μμ±ν μλ μμ΅λλ€.
- 볡μ‘ν 쿼리λ₯Ό μ²λ¦¬νκ±°λ μ±λ₯ μ΅μ νκ° νμν κ²½μ° μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
5οΈβ£ νμ΄μ§ λ° μ λ ¬ μ§μ.
- Spring Data JPAλ λ°μ΄ν° μ‘°ν μ νμ΄μ§(Paging)κ³Ό μ λ ¬(Sorting) κΈ°λ₯μ κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λλμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
2οΈβ£ μ£Όμ κ΅¬μ± μμ.
1οΈβ£ Entity ν΄λμ€.
- λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈκ³Ό 맀νλλ μλ° ν΄λμ€μ
λλ€.
- JPA(Java Persistence API) μν°ν°(Entity) μ΄λ
Έν
μ΄μ
(
@Entity
)μ μ¬μ©νμ¬ ν μ΄λΈ ꡬ쑰λ₯Ό μ μν©λλ€.
- JPA(Java Persistence API) μν°ν°(Entity) μ΄λ
Έν
μ΄μ
(
2οΈβ£ Repotitory μΈν°νμ΄μ€.
- Spring Data JPAμμ λ°μ΄ν°λ² μ΄μ€μ μ κ·ΌνκΈ° μν΄ μ¬μ©νλ μΈν°νμ΄μ€μ λλ€.
-
CrudRepository
,JpaRepository
,PagingAndSortingRepository
μ κ°μ λ€μν Repository μΈν°νμ΄μ€κ° μ 곡λ©λλ€.- μ΄λ₯Ό νμ₯νμ¬ κΈ°λ³Έμ μΈ CRUD(μμ±, μ‘°ν, μμ , μμ ) κΈ°λ₯λΏλ§ μλλΌ νμ΄μ§, μ λ ¬ λ±μ μ½κ² ꡬνν μ μμ΅λλ€.
3οΈβ£ Spring Data JPAμ μ΄λ Έν μ΄μ
-
@Entity
: ν΄λμ€λ₯Ό JPA μν°ν°(Entity)λ‘ μ μν©λλ€. -
@Id
: κΈ°λ³Έ ν€(Primary Key)λ₯Ό μ§μ ν©λλ€. -
@Repository
: λ°μ΄ν° μ κ·Ό κ°μ²΄(DAO)λ‘ μ¬μ©λ μΈν°νμ΄μ€ λλ ν΄λμ€μ μ¬μ©ν©λλ€. Springμμ ν΄λΉ ν΄λμ€λ₯Ό λΉμΌλ‘ κ΄λ¦¬ν μ μλλ‘ ν©λλ€. -
@Query
: JPQL λλ λ€μ΄ν°λΈ 쿼리λ₯Ό μ§μ μμ±ν λ μ¬μ©ν©λλ€.
πββοΈ APIμμμ μΈν°νμ΄μ€μ μννΈμ¨μ΄ 곡νμμμ μΈν°νμ΄μ€ κ°λ .
πββοΈ JPA μ΄λ Έν μ΄μ -@Entity
πββοΈ JPA μ΄λ Έν μ΄μ -@Id
πββοΈ μΈμ @Service
,@Repository
,@Controller
μ κ°μ μ΄λ Έν μ΄μ μ μ¬μ©ν κΉ?
πββοΈ μν°ν°(Entity)λ 무μμΌκΉμ?
3οΈβ£ Spring Data JPA μ¬μ© μμ.
1οΈβ£ μν°ν° ν΄λμ€ μ μ.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneretedValue;
import javax.persistence.GenerationType;
@Entity
public class User {
@Id
@GeneretedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// κΈ°λ³Έ μμ±μ, getter, setter μλ΅
}
2οΈβ£ Repository μΈν°νμ΄μ€ μ μ.
import org.springframework.data.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// κΈ°λ³Έ CRUD λ©μλ μΈμ μΆκ° λ©μλ μ μ
User findByName(String name);
}
- μ μ½λμμ
UserRepository
λJpaRepository
λ₯Ό νμ₯νμ¬, User μν°ν°(Entity)μ Long νμ μ κΈ°λ³Έ ν€(Primary Key)λ₯Ό μ¬μ©νλ Repositoryλ‘ μ μλ©λλ€. -
findByName
: λ©μλ μ΄λ¦μ κΈ°λ°μΌλ‘ Spring Data JPAκ°name
νλλ‘ Userλ₯Ό μ°Ύλ 쿼리λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
3οΈβ£ Service ν΄λμ€μμ μ¬μ©.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User getUserByName(String name) {
return userRepository.findByName(name);
}
public User createUser(User user) {
return userRepository.save(user);
}
}
4οΈβ£ Spring Boot μ€μ (application.properties
)
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
4οΈβ£ Spring Data JPAμ μ₯μ .
1οΈβ£ κ°λ° μμ°μ± ν₯μ.
- λ°μ΄ν° μ κ·Ό μ½λλ₯Ό μ€μ¬μ£Όλ©°, λ©μλ μ΄λ¦ κΈ°λ°μ 쿼리 μμ±μΌλ‘ κ°λ° μλλ₯Ό λμ λλ€.
2οΈβ£ μ μ°μ±.
- 볡μ‘ν 쿼리λ₯Ό μ§μ μμ±ν μ μμΌλ©°, λ€μν κΈ°λ₯μ μ½κ² νμ₯ν μ μμ΅λλ€.
3οΈβ£ Spring μνκ³μ ν΅ν©.
- Spring Frameworkμ μ½κ² ν΅ν©λλ©°, Spring Bootλ₯Ό ν΅ν΄ μ€μ μ΄ κ°νΈν΄μ§λλ€.
4οΈβ£ νμ΄μ§ λ° μ λ ¬ μ§μ.
- λλμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλλ‘ κΈ°λ³Έ νμ΄μ§κ³Ό μ λ ¬μ μ 곡ν©λλ€.
5οΈβ£ μμ½.
- Spring Data JPAλ JPA κΈ°λ°μ μ ν리μΌμ΄μ κ°λ°μ λμ± μ½κ² ν μ μλλ‘ μ§μνλ Spring λͺ¨λμ λλ€.
- Repository μΈν°νμ΄μ€λ₯Ό ν΅ν΄ κΈ°λ³Έμ μΈ CRUD(μμ±, μ‘°ν, μμ , μμ ) κΈ°λ₯κ³Ό λ©μλ μ΄λ¦ κΈ°λ°μ 쿼리λ₯Ό μ 곡νλ©°, κ°λ°μκ° λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ© μ½λλ₯Ό μ€μΌ μ μλλ‘ λμμ€λλ€.
- μ΄λ₯Ό ν΅ν΄ λΉ λ₯΄κ³ κ°νΈνκ² λ°μ΄ν°λ² μ΄μ€ μ κ·Ό κ³μΈ΅μ ꡬνν μ μμΌλ©°, λ 볡μ‘ν μΏΌλ¦¬κ° νμν κ²½μ° μ§μ 쿼리λ₯Ό μμ±ν μλ μμ΅λλ€.