JPA(Java persistence API)란
💡현재 자바 진영의 ORM 기술 표준, 인터페이스 모음
쉽게 표현하자면 자바의 ORM기술을 쉽게 구현하도록 도와주는 API입니다.
여기서 ORM은 뭘까
ORM(Object-Relation Mapping)
💡객체가 DB 테이블이 되도록 매핑 시켜주는 프레임워크
- 프로그램의 복잡도를 줄이고, 가바 객체와 쿼리를 분리할 수 있습니다
- 트랜잭션 처리나 기타 데이터 베이스 관련 작업들을 편리하게 할 수 있습니다
node.js의 sequelize 도 ORM 의 한 종류입니다
한눈에 이해할 수 있도록 표로 정리해 보았습니다
SQL Mapper |
ORM Mapper |
자바 클래스와 sql을 매핑 |
자바 클래스와 DB 테이블을 매핑 |
SQL을 명시하여 직접 DB 조작 |
객체 간의 관계를 바탕으로 SQL 자동 생성 |
myBatis,jdbc Template |
JPA,Hibernate |
JPA의 동작과정
JPA는 애플리케이션과 JDBC 사이에서 동작합니다
개발자가 JPA를 사용하면 JPA내부에서 JDBC API를 사용하여 SQL을 호출하고 DB와 통신을 하는 방식으루 이루어 집니다
'
JPA의 장단점
장점 |
단점 |
SQL 중심적인 개발보다 객체 중심적인 개발이 가능 합니다 |
대용령 데이터 기반 환경에서 튜닝이 어렵습니다 |
DDL문을 자동 생성해주기 때문에 생산성이 증가합니다 |
업무 비지니스가 복잡할 경우 JPA로 처리하기 어렵습니다 |
유지보수가 쉽습니다 |
|
그럼 이제 예제 코드로 JPA를 어떻게 사용하는 지 알아보겠습니다
먼저 순서는 엔티티 정의-레포지토리정의-서비스 정의-컨트롤러 정의 순으로 이루어집니다
1. 엔티티 클래스 정의
데이터베이스 테이블과 매핑될 엔티티 클래스를 정의합니다
엔티티 클래스는 @Entity 어노테이션을 이용하여 정의합니다
엔티티에는 setter가 없는 것이 좋습니다
@Entity //엔티티 클래스 임을 선언
@Table(name="users") // 엔티티 클래스와 매핑될 데이터 베이스 테이블 이름 지정
public class User{
@Id //primary key임을 선언
@GeneratedValue(strategy=GenerationType.IDENTITY) //엔티티ㅡ이 식별자 값을 자동으로 생성
private Long id;
//해당 엔티티 클래스의 필드가 데이터베이스의 컬럼으로 매핑될 때 컬럼의 제역 조건을 설정
@Column(nullable=false)
private String name;
@Column(nullable=false)
private String email;
@Column(nullable=false)
private String password;
}
2. Repository 인터페이스 정의
엔티티를 조작하기 위한 Repository 인터페이스를 정의합니다
JPARepository인터페이스를 상속 받아 사용합니다
JpaRepository인터페이스
💡스프링 데이터 JPA에서 제공하는 CRUD 메서드를 상속받아 사용할 수 있는 인터페이스 입니다
@Repository
public interface UserRepository extends JpaRepository<User,Long>{
}
3. 서비스 클래스 정의
엔티티를 사용하는 비지니스 로직을 구현하는 서비스 클래스를 정의합니다
이때 repository인터페이스를 주입받아 사용합니다
예시로는 유저를 생성하는 api를 만들어봤습니다
@Service
public class UserService{
@Autowired
private UserRepository userRepository;
public User createUser(User user){
return userRepository.save(user);
}
}
4. 컨트롤러 클래스 정의
HTTP 요청을 처리하는 컨트롤러 클래스를 정의합니다
@RestController
@RequestMapping("/users")
public class UserController{
@Autowired
private UserService userService;
@PostMapping
public User createUser(@RequestBody User user){
return userService.createUser(user);
}
}