Spring Data JPA 마이그레이션 데모

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

스프링 ORM 기초

목록 보기
8/12

이번 강의에서는 Spring JDBC에서 Spring Data JPA로 마이그레이션한 애플리케이션의 동작을 데모로 확인합니다. Spring Data JPA가 어떻게 SQL 쿼리를 자동으로 생성하고, CRUD 작업을 처리하는지, 그리고 이를 확인하기 위한 방법들을 설명합니다.


과정별 정리

1. 애플리케이션 설정: SQL 쿼리 출력

우리가 직접 SQL 문을 작성하지 않았지만, Spring Data JPA가 자동으로 SQL 쿼리를 생성해줍니다. 이를 확인하기 위해 application.properties 파일에 두 가지 설정을 추가합니다:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
  • spring.jpa.show-sql: SQL 쿼리를 콘솔에 출력.
  • spring.jpa.properties.hibernate.format_sql: 출력되는 SQL 쿼리를 읽기 쉽게 포맷팅.

2. 애플리케이션 실행 및 JPA 설정 확인

  • 애플리케이션을 실행하면 Spring Data JPA가 리포지토리와 엔티티 클래스를 스캔하고, Hibernate를 통해 SQL 쿼리 생성을 준비합니다.
  • Spring Boot가 실행되면서 약간의 시간이 소요될 수 있으며, 이는 Spring Data JPA가 애플리케이션의 리포지토리와 엔티티를 스캔하고 관련 설정을 처리하기 때문입니다.

3. Holidays 페이지 테스트

  • Holidays 페이지를 방문하여 데이터베이스에서 데이터를 성공적으로 가져옵니다.
  • Spring Data JPA가 자동으로 생성한 findAll() 메서드를 사용하여 모든 데이터를 조회합니다.
  • 콘솔에서 자동으로 생성된 SQL 쿼리를 확인할 수 있습니다:
select * from holidays;

4. Contact 페이지 테스트

Contact 페이지에서 새 메시지를 제출하는 경우를 테스트합니다.

  • 데이터를 제출하면, Spring Data JPAsave() 메서드를 사용하여 데이터를 데이터베이스에 저장합니다.
  • 자동으로 생성된 INSERT 쿼리:
insert into contact_msg (name, mobile_num, email, subject, message, status, created_at, created_by)
values (?, ?, ?, ?, ?, ?, ?, ?);

5. Admin 로그인 및 메시지 조회

  • Admin 계정으로 로그인하여 Open 상태의 메시지를 조회합니다.
  • findByStatus("OPEN") 메서드가 호출되며, 자동으로 WHERE 조건을 가진 SELECT 쿼리가 생성됩니다:
select * from contact_msg where status = ?;
  • 이 기능은 Derived Query Methods를 사용하여 커스텀 쿼리를 생성합니다.

6. 메시지 상태 업데이트

  • 메시지의 상태를 OPEN에서 CLOSE로 변경합니다.
  • Spring Data JPA는 먼저 SELECT 쿼리를 사용해 기존 데이터를 조회한 후, UPDATE 쿼리를 자동으로 생성하여 상태를 업데이트합니다:
select * from contact_msg where contact_id = ?;
update contact_msg set status = ?, updated_by = ?, updated_at = ? where contact_id = ?;

필요한 자료 및 소스코드

1. application.properties

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
  • SQL 쿼리를 콘솔에 출력하고, 읽기 쉽게 포맷팅.

2. ContactRepository.java

@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {
    List<Contact> findByStatus(String status);
}
  • findByStatus() 메서드를 사용해 status 값을 기반으로 데이터를 조회.

3. ContactService.java

@Service
public class ContactService {

    @Autowired
    private ContactRepository contactRepository;

    public List<Contact> findOpenMessages() {
        return contactRepository.findByStatus("OPEN");
    }

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

    public boolean updateMessageStatus(int contactId, String status) {
        Optional<Contact> contact = contactRepository.findById(contactId);
        contact.ifPresent(c -> {
            c.setStatus(status);
            c.setUpdatedBy("admin");
            c.setUpdatedAt(LocalDateTime.now());
            contactRepository.save(c);
        });
        return contact.isPresent();
    }
}
  • saveMessageDetails(): 새 메시지 데이터를 데이터베이스에 저장.
  • findOpenMessages(): Open 상태의 메시지를 조회.
  • updateMessageStatus(): 메시지 상태를 업데이트.

4. Hibernate와 Spring Data JPA의 상호 작용

  • Spring Data JPAHibernate를 사용해 SQL 쿼리를 자동 생성하고 실행합니다.
  • 이를 통해 개발자는 직접 SQL을 작성하지 않아도, 애플리케이션의 비즈니스 로직에만 집중할 수 있습니다.

결론

이번 강의에서는 Spring Data JPA로 마이그레이션한 애플리케이션을 테스트하고, SQL 쿼리 자동 생성CRUD 작업이 어떻게 수행되는지를 확인했습니다. Spring Data JPA는 SQL을 직접 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 하여 개발자의 생산성을 크게 향상시킵니다.

profile
무슨 생각하며 사니

0개의 댓글