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 |