๐[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(์์ฑ, ์กฐํ, ์์ , ์ญ์ ) ๊ธฐ๋ฅ๊ณผ ๋ฉ์๋ ์ด๋ฆ ๊ธฐ๋ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋๋ก ๋์์ค๋๋ค.
- ์ด๋ฅผ ํตํด ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ณ์ธต์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.