BE/Spring & Spring Boot

[Spring Boot] ORM, @Query

baek-dev 2024. 12. 14. 14:23

ORM은 객체와 데이터베이스의 관계를 매핑하여, 객체지향 프로그래밍 언어의 객체를 데이터베이스의 테이블에 대응시키는 기술이다. 개발자는 SQL을 직접 작성하지 않아도 객체지향 방식으로 데이터를 다룰 수 있다

 

장점

  • 생산성 향상: 데이터베이스 쿼리를 객체지향 방식으로 다룰 수 있어 코드 작성이 단순해짐
  • 가독성 증가: 객체와 테이블 간 매핑으로 인해 코드가 더 직관적이고 읽기 쉬움
  • 유지보수 용이: 데이터베이스가 변경되더라도 매핑 설정만 수정하면 애플리케이션 수정 최소화
  • 데이터베이스 독립성: 특정 데이터베이스에 종속되지 않고 다양한 데이터베이스에서 동작 가능

단점

  • 성능 오버헤드: ORM이 쿼리를 자동으로 생성하므로 직접 작성한 SQL보다 성능이 낮을 수 있음
  • 복잡한 쿼리 처리 어려움: 복잡한 비즈니스 로직이 필요한 경우 SQL이 더 유리함
  • 러닝 커브: ORM의 동작 원리와 매핑 설정을 이해해야 함

대표적인 ORM 프레임워크

  • Java: Hibernate, JPA (Java Persistence API)
  • Python: SQLAlchemy, Django ORM
  • Ruby: ActiveRecord
  • PHP: Doctrine

@Query

개념

`@Query`는 Spring Data JPA에서 제공하는 어노테이션으로, 개발자가 직접 JPQL(Java Persistence Query Language)나 네이티브 SQL쿼리를 정의할 수 있게 해준다. 주로 복잡한 쿼리를 작성하거나 동적 쿼리를 생성할 때 사용된다

사용법

  • `@Query` 어노테이션은 JPA 리포지터리 인터페이스의 메서드에 적용된다
  • 쿼리문 안에서는 메서드 매개변수를 바인딩하여 동적 쿼리를 작성할 수 있다
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    // 1. JPQL 사용 예시
    @Query("SELECT u FROM User u WHERE u.name = :name")
    List<User> findUsersByName(@Param("name") String name);

    // 2. 네이티브 쿼리 사용 예시
    @Query(value = "SELECT * FROM users WHERE email = :email", nativeQuery = true)
    User findByEmail(@Param("email") String email);
}

@Query 주요 속성

  • `value` : 쿼리문을 작성하는 속성이다. JPQL이나 SQL을 작성할 수 있다
  • `nativeQuery` : `true`일 경우 네이티브 SQL쿼리를 실행한다. 기본값을 `false`이며, JPQL로 인식된다

쿼리 파라미터 바인딩 방식

  • 이름 기반 바인딩 (`:paramName`)
@Query("SELECT u FROM User u WHERE u.age > :age")
List<User> findByAgeGreaterThan(@Param("age") int age);
  • 위치 기반 바인딩(`?1, ?2`)
@Query("SELECT u FROM User u WHERE u.id = ?1 AND u.status = ?2")
User findByIdAndStatus(Long id, String status);

@Modifying과 함께 사용

`@Modifying` 어노테이션을 함께 사용하면, `@Query`로 데이터 수정, 삭제와 같은 DML 작업도 수행할 수 있다

@Modifying
@Query("UPDATE User u SET u.status = :status WHERE u.id = :id")
void updateUserStatus(@Param("id") Long id, @Param("status") String status);

@Query 사용시 주의사항

1. JPQL과 SQL의 차이

  • JPQL은 엔티티 객체를 대상으로 한 객체지향 쿼리이다
  • 네이티브 SQL은 데이터베이스 테이블을 직접 다룬다

2. 쿼리 최적화

  • 복잡한 쿼리는 성능 문제를 야기할 수 있으므로 필요하면 네이티브 SQL을 고려한다

3. 보안

  • 동적 쿼리에서 사용자 입력을 직접 사용하지 말고, 반드시 파라미터 바인딩을 이용해 SQL인젝션을 방지해야 한다

ORM과 @Query의 적절한 사용은 성능과 유지보수성의 균형을 맞추는 데 핵심적


ORM - 너무 자주 쓰이는 쿼리문들은 JPA에서 만들어 놓은 API들 (findById, findAll, save...)

 

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] 빈이란  (1) 2024.12.15
[Spring Boot] ApplicationRunner  (0) 2024.12.14
[Spring] Spring 과 Spring Boot  (0) 2024.12.13
[Spring Boot] 어노테이션  (0) 2024.12.11
[Sping Boot] Spring Initializr, 프로젝트 구조  (0) 2024.12.10