1. JPA란?
JPA의 개념
JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스를 쉽게 다룰 수 있도록 지원하는 ORM(Object Relational Mapping) 기술입니다. JPA를 활용하면 SQL을 직접 작성하지 않고 객체 지향적으로 데이터를 조작할 수 있습니다.
JPA의 등장 배경
전통적인 데이터베이스 접근 방식인 JDBC는 SQL을 직접 작성해야 하고, 반복적인 코드가 많아 유지보수가 어려웠습니다. 이를 해결하기 위해 MyBatis와 같은 SQL 매퍼가 등장했지만, 여전히 SQL 작성이 필요했습니다. JPA는 객체와 데이터베이스 간의 매핑을 자동으로 처리해 주어 개발자의 생산성을 높여줍니다.
2. JPA의 기본 개념
1) Entity와 EntityManager
- Entity: JPA에서 데이터베이스 테이블과 매핑되는 자바 클래스
- EntityManager: 엔티티를 관리하고 데이터베이스와의 상호작용을 처리하는 역할
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
2) 영속성 컨텍스트(Persistence Context)
- JPA는 엔티티를 영속성 컨텍스트(Persistence Context)에서 관리하며, 동일한 트랜잭션 내에서 같은 객체를 재사용할 수 있도록 합니다.
3. JPA에서 관계 매핑
1) 엔티티 간의 관계
JPA에서는 다양한 관계를 매핑할 수 있습니다.
관계 어노테이션
일대다 | @OneToMany |
다대일 | @ManyToOne |
일대일 | @OneToOne |
다대다 | @ManyToMany |
예제: User와 Order 간의 관계 (일대다, 다대일 관계)
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
2) Fetch Type (EAGER vs LAZY)
JPA에서는 연관된 엔티티를 가져오는 방식으로 즉시 로딩(EAGER) 과 지연 로딩(LAZY) 을 제공합니다.
- EAGER: 연관된 엔티티를 즉시 조회
- LAZY: 필요할 때 조회 (성능 최적화 가능)
@ManyToOne(fetch = FetchType.LAZY)
private User user;
4. Spring Data JPA 활용
1) JpaRepository를 활용한 CRUD 구현
Spring Data JPA를 사용하면 별도의 SQL을 작성하지 않고도 CRUD 기능을 쉽게 구현할 수 있습니다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
2) @Query를 활용한 커스텀 쿼리 작성
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findByName(@Param("name") String name);
3) JPQL과 Native Query
- JPQL (Java Persistence Query Language): 엔티티 객체를 대상으로 하는 쿼리
- Native Query: 데이터베이스의 SQL을 직접 실행하는 방식
@Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
User findByEmailNative(String email);
5. JPA의 장점과 단점
✅ 장점
- SQL을 직접 작성할 필요 없이 객체 지향적인 데이터 조작 가능
- 영속성 컨텍스트를 활용한 성능 최적화
- 코드 유지보수가 용이하고 생산성이 높음
- 스프링과 함께 사용하면 개발 속도 향상
❌ 단점
- 초반 설정이 복잡하고 학습 곡선이 높음
- 복잡한 쿼리 작성 시 성능 이슈 가능
- 자동 쿼리 최적화에 대한 이해가 필요함
결론
JPA는 백엔드 개발에서 데이터베이스와 객체 간의 매핑을 단순화하고 생산성을 높이는 강력한 기술입니다. Spring Boot와 함께 사용하면 더욱 강력한 기능을 활용할 수 있으며, JPA를 활용한 CRUD, 관계 매핑, 페이징 등을 학습하면 백엔드 개발자로서 더욱 탄탄한 실력을 갖출 수 있습니다. 🚀
'모각코' 카테고리의 다른 글
[백엔드]비동기 처리와 메시지 큐 이해하기 (0) | 2025.02.12 |
---|---|
[백엔드]JWT 이해하기 (0) | 2025.02.10 |
[백엔드]RESTful API 이해하기 (0) | 2025.02.10 |
[백엔드]SQL 이해하기 (0) | 2025.01.29 |
[백엔드]자바 스프링부트 이해하기 (0) | 2025.01.29 |