이 강의에서는 기존 Spring JDBC 기반의 Eazy School 웹 애플리케이션을 Spring Data JPA로 마이그레이션하는 방법을 설명합니다. 이번 강의에서는 주로 Repository 인터페이스 구현과 이를 활용한 CRUD 작업을 다룹니다.
Spring Data JPA를 사용하여 데이터베이스와 상호작용하려면 각 엔티티에 대한 리포지토리 인터페이스를 생성해야 합니다. 이는 SQL 쿼리나 명시적인 비즈니스 로직을 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 합니다.
@Repository
public interface HolidaysRepository extends CrudRepository<Holiday, String> {
}CrudRepository 인터페이스를 확장하여 Holiday 엔티티에 대한 기본적인 CRUD 작업을 처리합니다.기존의 findAllHolidays() 메서드는 더 이상 필요하지 않습니다. 대신 CrudRepository에서 제공하는 findAll() 메서드를 사용하여 모든 휴일 데이터를 가져옵니다.
Iterable<Holiday> holidays = holidaysRepository.findAll();
List<Holiday> holidayList = StreamSupport.stream(holidays.spliterator(), false)
.collect(Collectors.toList());
@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
}
ContactService에서 기존 saveContactMsg() 메서드는 제거되고, 대신 CrudRepository의 save() 메서드를 사용하여 데이터를 저장합니다.
Contact savedContact = contactRepository.save(contact);
if (savedContact != null && savedContact.getContactId() > 0) {
isSaved = true;
}
기존 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);
});
Spring Data JPA는 자동으로 SQL 쿼리를 생성합니다. 예를 들어, save() 메서드는 새 레코드를 삽입하거나, 기존 레코드를 업데이트하는 데 사용됩니다. findById() 메서드는 기본 키로 레코드를 검색합니다. 이를 통해 개발자는 직접 SQL을 작성하지 않고도 데이터베이스와 상호작용할 수 있습니다.
@Repository
public interface HolidaysRepository extends CrudRepository<Holiday, String> {
}
@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";
}
@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
}
@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;
}
}
이 과정에서 Spring Data JPA가 제공하는 기능을 통해 코드의 복잡성을 줄이고, 데이터베이스와의 상호작용을 더 간단하게 만들 수 있습니다.