데이터 접근

Kkd·2024년 12월 24일
0

매일메일 개념정리

목록 보기
44/93

데이터 접근

Spring에서는 데이터베이스와의 효율적인 통신을 위해 Spring JDBCSpring Data JPA를 제공합니다. 각각의 사용법과 관련 개념을 단계적으로 설명드리겠습니다.


1. Spring JDBC

Spring JDBC는 JDBC(Java Database Connectivity)를 더 편리하게 사용할 수 있도록 도와줍니다. JdbcTemplate은 Spring JDBC에서 제공하는 주요 클래스입니다.

1.1 JdbcTemplate 사용법

설정

  • Spring Boot에서는 spring-boot-starter-jdbc를 의존성으로 추가하면 자동 설정됩니다.

Maven 의존성:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

JdbcTemplate를 이용한 데이터 조회

@Component
public class UserRepository {

    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> findAll() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, (rs, rowNum) -> 
            new User(rs.getLong("id"), rs.getString("name"), rs.getString("email"))
        );
    }
}

JdbcTemplate를 이용한 데이터 삽입

public void save(User user) {
    String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
    jdbcTemplate.update(sql, user.getName(), user.getEmail());
}

2. Spring Data JPA

Spring Data JPA는 JPA(Java Persistence API)를 더 편리하게 사용할 수 있도록 도와주는 라이브러리입니다.
ORM(Object-Relational Mapping)을 기반으로 데이터베이스와 객체 간의 매핑을 처리합니다.

2.1 JPA 기본 개념과 ORM

  • JPA(Java Persistence API):
    • 자바 객체와 데이터베이스 테이블을 매핑하는 표준 스펙.
    • SQL 작성 없이 데이터를 처리할 수 있도록 도와줍니다.
  • ORM(Object-Relational Mapping):
    • 객체(Object)와 데이터베이스 테이블 간의 매핑을 처리하는 기법.
    • 엔티티(Entity)와 데이터베이스의 필드가 서로 연결됩니다.

2.2 Spring Data JPA 설정

Maven 의존성:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

application.yml 설정:

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

2.3 Entity 클래스

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // Getters, Setters, and Constructors
}

2.4 Repository 사용

Spring Data JPA에서는 Repository 인터페이스를 통해 CRUD 작업을 쉽게 수행할 수 있습니다.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

사용 예시:

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public List<User> findAllUsers() {
        return userRepository.findAll();
    }
}

2.5 Query Method와 JPQL

Spring Data JPA는 메서드 이름으로 쿼리를 생성할 수 있는 기능을 제공합니다.

Query Method 사용

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name); // SELECT * FROM user WHERE name = ?
    List<User> findByEmailContaining(String keyword); // LIKE '%keyword%'
}

JPQL(Java Persistence Query Language)

JPQL은 엔티티 객체를 기반으로 쿼리를 작성하는 언어입니다.

@Query("SELECT u FROM User u WHERE u.email LIKE %:keyword%")
List<User> searchByEmail(@Param("keyword") String keyword);

2.6 Paging과 Sorting

Spring Data JPA는 페이징과 정렬을 간단하게 지원합니다.

Paging 사용

public List<User> findAllUsers(Pageable pageable) {
    return userRepository.findAll(pageable).getContent();
}

PageRequest 생성

Pageable pageable = PageRequest.of(0, 10, Sort.by("name").ascending());
List<User> users = userRepository.findAll(pageable).getContent();

3. 트랜잭션 관리

Spring은 데이터베이스 작업에서 트랜잭션을 효과적으로 관리할 수 있는 기능을 제공합니다.
주로 @Transactional 어노테이션을 통해 트랜잭션을 처리합니다.

3.1 @Transactional 어노테이션

  • 주요 역할:
    1. 작업 단위가 성공하면 커밋.
    2. 예외가 발생하면 롤백.

사용 예시

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public void saveUserAndEmail(User user) {
        userRepository.save(user);

        // 일부 작업 중 예외 발생 시 전체 롤백
        if (user.getEmail() == null) {
            throw new IllegalArgumentException("Email cannot be null");
        }
    }
}

3.2 트랜잭션 전파(Propagation)

트랜잭션이 실행되는 방식(전파 수준)을 설정할 수 있습니다.

  • REQUIRED (기본값): 기존 트랜잭션이 있으면 참여, 없으면 새로 생성.
  • REQUIRES_NEW: 항상 새로운 트랜잭션을 생성.
  • NESTED: 기존 트랜잭션 내에 중첩된 트랜잭션 생성.

사용 예시

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUser(User user) {
    userRepository.save(user);
}

학습 포인트

  1. JdbcTemplate와 Spring Data JPA의 차이 이해하기:
    • 간단한 CRUD 작업은 JPA로, 복잡한 쿼리는 JdbcTemplate로 처리.
  2. Entity 설계와 매핑 연습:
    • 1:N, N:M 관계 매핑 실습.
  3. 트랜잭션 전파 수준 이해:
    • 다양한 전파 옵션으로 트랜잭션 관리 실습.
  4. Paging과 Sorting 사용:
    • 대량의 데이터를 다루는 REST API 설계와 구현.
  5. Query Method와 JPQL 작성:
    • 복잡한 조건 쿼리 작성과 최적화.

추가 학습 자료
-[스프링 DB 1편 - 데이터 접근 핵심 원리] JDBC의 이해
-[Spring][DB] 스프링 DB 1편 - 데이터 접근 핵심 원리

profile
🌱

0개의 댓글