Spring JDBC에서 Spring Data JPA로의 마이그레이션 1

날아올라돼지야·2024년 9월 7일

스프링 ORM 기초

목록 보기
5/12

이 강의에서는 Spring JDBC에서 Spring Data JPA로 Eazy School 웹 애플리케이션을 마이그레이션하는 과정을 설명합니다. 여기에서는 ContactHolidays 페이지와 관련된 비즈니스 로직을 Spring Data JPA로 전환하는 방법을 다루며, 이를 통해 더 효율적이고 유지보수가 쉬운 코드를 작성할 수 있습니다.

1. Spring Data JPA 의존성 추가

먼저, Spring Data JPA를 사용하기 위해 pom.xml 파일에 의존성을 추가해야 합니다. Spring Boot를 사용하고 있으므로, Spring Data JPA를 위한 스타터 의존성을 추가합니다.

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

2. 모델 클래스에 엔티티 및 테이블 관계 정의

Spring Data JPA에서는 엔티티 클래스를 데이터베이스 테이블과 매핑해야 합니다. 이를 위해 @Entity@Table 애너테이션을 사용하여 Java 객체와 데이터베이스 테이블 간의 관계를 설정합니다.

  1. Contact.java 엔티티 클래스
@Entity
@Table(name = "contact_msg")
public class Contact {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer contactId;

    private String name;
    private String mobileNum;
    private String email;
    private String subject;
    private String message;
    private String status;

    // Getters and Setters
}
  • @Entity: 이 클래스가 데이터베이스 테이블과 매핑됨을 나타냅니다.
  • @Table(name = "contact_msg"): 클래스 이름과 테이블 이름이 다를 경우 명시적으로 매핑.
  • @Id@GeneratedValue: contactId가 기본 키이며, 자동으로 생성되는 값임을 설정.
  1. BaseEntity 클래스의 상속
    기본적인 시간 및 작성자 정보를 저장하는 BaseEntity 클래스에서 상속을 받는 경우, 해당 필드를 상속받은 모든 엔티티에서 사용하도록 설정해야 합니다.
@MappedSuperclass
public class BaseEntity {

    private LocalDateTime createdAt;
    private String createdBy;
    private LocalDateTime updatedAt;
    private String updatedBy;

    // Getters and Setters
}
  • @MappedSuperclass: 이 클래스를 상속받는 모든 엔티티에 해당 필드를 포함하도록 설정.
  1. Holiday.java 엔티티 클래스
@Entity
@Table(name = "holidays")
public class Holiday {

    @Id
    private String day;

    @Enumerated(EnumType.STRING)
    private HolidayType type;

    // Getters and Setters
}
  • @Enumerated(EnumType.STRING): Enum 타입을 데이터베이스의 varchar 컬럼에 저장하기 위한 설정.

3. 리포지토리 인터페이스 생성

Spring Data JPA의 핵심 기능을 사용하려면 CrudRepository 또는 JpaRepository 인터페이스를 확장하여 리포지토리를 생성합니다.

  1. ContactRepository.java
@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
}
  1. HolidayRepository.java
@Repository
public interface HolidayRepository extends CrudRepository<Holiday, String> {
}

4. Spring Data JPA 설정

Spring Boot 애플리케이션에 Spring Data JPA가 적용되도록 설정합니다. @EnableJpaRepositories@EntityScan 애너테이션을 사용해 리포지토리와 엔티티 클래스를 스캔하도록 설정합니다.

@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.easybytes.easyschool.repository")
@EntityScan(basePackages = "com.easybytes.easyschool.model")
public class EasySchoolApplication {
    public static void main(String[] args) {
        SpringApplication.run(EasySchoolApplication.class, args);
    }
}

5. 서비스 계층에서 리포지토리 사용

Spring Data JPA를 통해 비즈니스 로직에서 리포지토리를 사용하여 데이터베이스 작업을 수행합니다.

  1. ContactService.java
@Service
public class ContactService {

    @Autowired
    private ContactRepository contactRepository;

    public void saveContact(Contact contact) {
        contactRepository.save(contact);
    }
}
  1. HolidayService.java
@Service
public class HolidayService {

    @Autowired
    private HolidayRepository holidayRepository;

    public Iterable<Holiday> getAllHolidays() {
        return holidayRepository.findAll();
    }
}

마이그레이션 과정 요약

  1. Spring Data JPA 의존성 추가: pom.xml 파일에 Spring Data JPA 스타터 의존성 추가.
  2. 엔티티 클래스 매핑: @Entity, @Table, @Id 등을 사용하여 모델 클래스와 데이터베이스 테이블을 매핑.
  3. 리포지토리 인터페이스 생성: CrudRepository를 확장한 리포지토리 인터페이스를 생성하여 기본 CRUD 작업을 처리.
  4. Spring Data JPA 설정: @EnableJpaRepositories@EntityScan을 사용해 리포지토리와 엔티티를 스캔.
  5. 서비스에서 리포지토리 사용: 비즈니스 로직에서 리포지토리를 사용해 데이터를 저장, 조회, 삭제.

이 과정에서는 기존의 Spring JDBC 코드를 Spring Data JPA로 마이그레이션함으로써, 코드의 복잡성을 줄이고 유지보수성을 높이는 방법을 배웠습니다.

profile
무슨 생각하며 사니

0개의 댓글