ORM은 객체와 데이터베이스의 관계를 자동으로 매핑해주는 기술로, JPA, Hibernate, MyBatis 등의 프레임워크가 대표적입니다.
최근 ORM이 널리 사용되는 이유는 다음과 같습니다.
✔ SQL 작성 최소화
✔ 자동 매핑 및 테이블 관리
@Entity, @Table, @Column 등의 어노테이션을 활용하면 테이블을 쉽게 설계할 수 있습니다. 📌 예제
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
@Column(unique = true)
private String email;
}
users 테이블이 생성됩니다.✔ 객체 지향적인 코드 유지 가능
✔ 데이터베이스 변경 시 수정 최소화
📌 예제 (필드 추가 후 마이그레이션)
@Column(nullable = false)
private String phoneNumber;
phoneNumber 컬럼이 없더라도, ORM 마이그레이션을 통해 자동 반영할 수 있습니다.✔ DB 벤더(Oracle, MySQL 등)에 독립적
📌 예제 (JPA 설정)
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
✔ Lazy Loading & Eager Loading
Lazy Loading을 지원하여 불필요한 쿼리 실행을 방지합니다. ✔ 캐싱(Caching) 활용
✔ JPQL (Java Persistence Query Language) 지원
📌 예제 (JPQL)
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findByName(@Param("name") String name);
✔ @Transactional을 통한 자동 롤백
@Transactional을 사용하면 예외 발생 시 자동으로 롤백됩니다. 📌 예제 (Spring JPA)
@Transactional
public void updateUserEmail(Long userId, String newEmail) {
User user = userRepository.findById(userId).orElseThrow();
user.setEmail(newEmail);
}
updateUserEmail() 메서드는 자동 롤백됩니다.✔ SQL 작성 부담 감소 → 객체 지향 코드로 DB 작업 가능
✔ 유지보수 용이 → 엔터티 클래스 수정만으로 테이블 변경 가능
✔ 다양한 DB 지원 → DBMS 변경 시 코드 수정 최소화
✔ 성능 최적화 가능 → Lazy Loading, Caching 지원
✔ 트랜잭션 관리 간편 → @Transactional로 자동 롤백
ORM을 사용하면 생산성을 높이고 유지보수를 쉽게 하며, 데이터베이스에 대한 종속성을 줄일 수 있습니다.
그러나 직접 SQL을 최적화하는 것이 더 유리한 경우도 있으므로, ORM과 SQL을 적절히 조합하여 사용하는 것이 중요합니다. 😊