Spring Data JPA는 데이터베이스와 상호작용하는 애플리케이션을 더 쉽고 효율적으로 개발할 수 있게 해주는 강력한 프레임워크입니다.
Java Persistence API의 약자인 JPA는 자바 객체와 데이터베이스 간의 매핑을 처리하기 위한 ORM(Object Relational Mapping) 기술입니다.

Spring Data JPA는 JPA를 더 편리하게 사용할 수 있도록 도와주는 Spring 모듈입니다.
Spring Data JPA를 사용하면 애플리케이션에서 데이터베이스까지의 흐름이 다음과 같이 단계적으로 진행됩니다.
Service와 Repository 계층을 통해 들어옵니다.Spring Data JPA로 반환됩니다.Spring Data JPA → JPA → Hibernate → JDBC → DB Driver → DBMS
← ← ← ← ← ←
최종 결과 반환

1. @Entity
데이터베이스 테이블과 매핑되는 클래스임을 명시.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
}
2. @Id / @GeneratedValue
@Id: 기본 키(Primary Key)를 지정.@GeneratedValue: 키 생성 전략 설정.3. @Column
nullable, unique, length 등.@Column(nullable = false, unique = true, length = 100)
private String email;4. @Query
@Query("SELECT u FROM User u WHERE u.name = :name")
User findByName(@Param("name") String name);5. @Transactional
@Transactional
public void updateUser(Long id, String name) {
User user = userRepository.findById(id).orElseThrow();
user.setName(name);
}1. Entity 생성
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
// Getter, Setter
}
2. Repository 작성
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name); // 메서드 이름만으로 쿼리 실행
}
3. Service 작성
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public User createUser(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user);
}
public List<User> getUsersByName(String name) {
return userRepository.findByName(name);
}
}
4. Controller 작성
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.ok(userService.createUser(user.getName(), user.getEmail()));
}
@GetMapping
public ResponseEntity<List<User>> getUsersByName(@RequestParam String name) {
return ResponseEntity.ok(userService.getUsersByName(name));
}
}
엔티티 설계 시 양방향 매핑에 주의:
양방향 관계에서는 무한 루프를 방지하기 위해 @JsonIgnore 또는 DTO 사용 필요.
N+1 문제 방지:
연관 데이터를 조회할 때 필요 이상의 쿼리가 발생하지 않도록 페치 조인 또는 @EntityGraph를 사용.
@EntityGraph(attributePaths = "orders")
List<User> findAllWithOrders();
트랜잭션 관리:
데이터의 일관성을 보장하기 위해 서비스 계층에서 트랜잭션 설정 권장.
SQL 최적화:
복잡한 쿼리는 @Query나 QueryDSL을 활용하여 작성.