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

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

스프링 ORM 기초

목록 보기
6/12

1. Spring Data JPA 설정

이 강의에서는 기존 Spring JDBC 기반의 Eazy School 웹 애플리케이션을 Spring Data JPA로 마이그레이션하는 방법을 설명합니다. 이번 강의에서는 주로 Repository 인터페이스 구현과 이를 활용한 CRUD 작업을 다룹니다.

2. Repository 인터페이스 생성

Spring Data JPA를 사용하여 데이터베이스와 상호작용하려면 각 엔티티에 대한 리포지토리 인터페이스를 생성해야 합니다. 이는 SQL 쿼리나 명시적인 비즈니스 로직을 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 합니다.

  • HolidaysRepository 인터페이스 생성
    @Repository
    public interface HolidaysRepository extends CrudRepository<Holiday, String> {
    }
    • CrudRepository 인터페이스를 확장하여 Holiday 엔티티에 대한 기본적인 CRUD 작업을 처리합니다.
    • 엔티티 클래스 Holiday와 기본 키 타입 String을 지정합니다.

3. HolidaysController 수정

기존의 findAllHolidays() 메서드는 더 이상 필요하지 않습니다. 대신 CrudRepository에서 제공하는 findAll() 메서드를 사용하여 모든 휴일 데이터를 가져옵니다.

Iterable<Holiday> holidays = holidaysRepository.findAll();
List<Holiday> holidayList = StreamSupport.stream(holidays.spliterator(), false)
    .collect(Collectors.toList());
  • Iterable 타입으로 반환되는 데이터를 Stream으로 변환하여 필터링 작업을 수행합니다.

4. ContactRepository 인터페이스 생성

@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
}
  • Contact 엔티티와 기본 키 타입 Integer를 지정하여 CrudRepository를 확장합니다.

5. ContactService 수정

ContactService에서 기존 saveContactMsg() 메서드는 제거되고, 대신 CrudRepositorysave() 메서드를 사용하여 데이터를 저장합니다.

Contact savedContact = contactRepository.save(contact);
if (savedContact != null && savedContact.getContactId() > 0) {
    isSaved = true;
}
  • save() 메서드는 새 레코드를 저장하거나 기존 레코드를 업데이트하는 데 사용됩니다. 반환된 객체에는 자동 생성된 기본 키가 포함됩니다.

6. updateMsgStatus() 메서드 수정

기존 JdbcTemplate 기반의 코드 대신 CrudRepository를 사용하여 데이터를 업데이트합니다. findById() 메서드를 사용하여 데이터를 가져온 후, 필요한 변경을 적용한 다음 save() 메서드로 업데이트를 처리합니다.

Optional<Contact> contactOpt = contactRepository.findById(contactId);
contactOpt.ifPresent(contact -> {
    contact.setStatus("CLOSE");
    contact.setUpdatedBy(updatedBy);
    contact.setUpdatedAt(LocalDateTime.now());
    contactRepository.save(contact);
});
  • Optional을 사용하여 값이 존재할 때만 업데이트를 수행하도록 처리합니다.

7. Spring Data JPA의 자동 쿼리 생성

Spring Data JPA는 자동으로 SQL 쿼리를 생성합니다. 예를 들어, save() 메서드는 새 레코드를 삽입하거나, 기존 레코드를 업데이트하는 데 사용됩니다. findById() 메서드는 기본 키로 레코드를 검색합니다. 이를 통해 개발자는 직접 SQL을 작성하지 않고도 데이터베이스와 상호작용할 수 있습니다.

8. 기타 중요 사항

  • Spring Data JPA는 기본적으로 Hibernate를 사용하여 ORM(객체 관계 매핑)을 수행합니다.
  • CRUD 작업은 기본적으로 CrudRepository 인터페이스에 의해 처리됩니다. 개발자는 인터페이스만 정의하고 Spring Data JPA가 나머지 작업을 자동으로 처리합니다.

소스코드 정리

  1. HolidaysRepository.java
@Repository
public interface HolidaysRepository extends CrudRepository<Holiday, String> {
}
  1. HolidaysController.java
@GetMapping("/holidays")
public String displayHolidays(Model model) {
    Iterable<Holiday> holidays = holidaysRepository.findAll();
    List<Holiday> holidayList = StreamSupport.stream(holidays.spliterator(), false)
        .collect(Collectors.toList());
    model.addAttribute("holidays", holidayList);
    return "holidays.html";
}
  1. ContactRepository.java
@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
}
  1. ContactService.java
@Service
public class ContactService {

    @Autowired
    private ContactRepository contactRepository;

    public boolean saveMessageDetails(Contact contact) {
        boolean isSaved = false;
        Contact savedContact = contactRepository.save(contact);
        if (savedContact != null && savedContact.getContactId() > 0) {
            isSaved = true;
        }
        return isSaved;
    }

    public boolean updateMsgStatus(int contactId, String updatedBy) {
        boolean isUpdated = false;
        Optional<Contact> contactOpt = contactRepository.findById(contactId);
        contactOpt.ifPresent(contact -> {
            contact.setStatus("CLOSE");
            contact.setUpdatedBy(updatedBy);
            contact.setUpdatedAt(LocalDateTime.now());
            contactRepository.save(contact);
        });
        return isUpdated;
    }
}

과정 요약

  1. 리포지토리 인터페이스 생성: CrudRepository를 확장하여 기본 CRUD 작업을 처리합니다.
  2. 컨트롤러 수정: Spring Data JPA에서 제공하는 메서드를 사용하여 데이터를 조회하고 필터링합니다.
  3. 서비스 계층 수정: 데이터 저장, 업데이트 로직에서 CrudRepository를 사용하여 SQL 쿼리를 자동으로 처리합니다.
  4. Spring Data JPA의 자동화된 SQL 처리: SQL 쿼리와 같은 로우레벨 코드를 작성하지 않고도 Spring Data JPA를 사용하여 데이터베이스와 상호작용할 수 있습니다.

이 과정에서 Spring Data JPA가 제공하는 기능을 통해 코드의 복잡성을 줄이고, 데이터베이스와의 상호작용을 더 간단하게 만들 수 있습니다.

profile
무슨 생각하며 사니

0개의 댓글