ORM (Object Relational Mapping)
ORM(Object Relational Mapping) 이란?
객체와 관계형 데이터베이스의 데이터를 매핑해주는 기술이다. 객체 지향 프로그래밍 언어에서 사용되는 객체와 관계형 데이터베이스에서 사용되는 테이블 간의 불일치를 해결하기 위한 방법 중 하나이다.
이전에 MyBatis를 사용하는 경우 java 클래스 코드와 직접 작성한 SQL을 매팽 시켜주어야 했다. JPA(Java Persistent API)와 같은 ORM은 객체가 DB에 연결되기 때문에, SQL을 직접 작성하지 않고 표준 인터페이스 기반으로 처리한다.
전세계적으로 많이 사용하는 Hibernate가 대표적이다.
JPA를 사용하면 통계나 동적 쿼리 같은 복잡한 쿼리를 처리하는 것이 어려우므로 QueryDSL을 함께 이용한다.
🔗 jdbc 활용한 코드
public void insertUser(User user){
String query = " INSERT INTO user (email, name, pw) VALUES (?, ?, ?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString (1, user.getEmail());
preparedStmt.setString (2, user.getName());
preparedStmt.setString (3, user.getPW());
preparedStmt.execute();
}
🔗 MyBatis 활용한 코드
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.blog.user.userMapper">
<insert id="insertUser" parameterType = "user">
INSERT USER
(
email, name, pw,
) VALUES(
#{email}, #{name}, #{pw}
)
</insert>
</mapper>
JPA 활용한 코드
@Entity
@Table(name = "user")
@Getter
@Builder
@NoArgsConstructor(force = true)
@AllArgsConstructor
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String name;
private String pw;
}
DB와 매핑 시키기 위한 객체를 생성한다. @Entity
어노테이션을 사용하여 해당 클래스가 데이터베이스의 특정 테이블과 매핑되는 클래스를 의미한다.
@Table
어노테이션은 특정 테이블을 지정한다.
public interface UserRepository extends JpaRepository <User, Long> {
}
ORM의 인터페이스를 사용하기 위해 위와 같이 Repository를 구현한다. JPA에서 기본적인 CRUD를 제공하고 있어 데이터를 저장하는 경우 save()를 호출하기만 하면 된다.
@Service
@RequiredArgsConstructor
@Transactional(readonly = true)
public class UserService {
private final UserRepository userRepository;
@Transactional
public User findUserAndUpdateName(Long id) {
User user = userRepository.findById(id);
user.setName("변경된 이름");
}
}
위의 코드에서 update하는 코드가 보이지 않지만 테이블의 데이터는 변경이 된다.
@Transactional
어노테이션은 메서드가 실행될 때 트랜잭션을 시작하고, 메서드가 정상적으로 종료될 때 해당 트랜잭션을 커밋한다. 이 때문에 메서드가 실행되는 동안의 모든 데이터베이스 작업은 트랜잭션 내에서 수행된다.
이러한 상황에서 변경된 엔티티는 영속성 컨텍스트에 관리되며, 트랜잭션이 커밋되는 시점에 데이터베이스에 변경 사항이 반영된다. 따라서 조회 후 수정을 따로 하지 않아도 데이터베이스의 데이터가 변경되는 것은 영속성
때문이다.
영속성(Persistence)
데이터의 상태가 지속되는 것을 의미한다. 주로 객체 지향 프로그래밍에서 사용되며, 객체의 상태가 메모리에서 유지되는 동안 그 객체를 영속적으로 저장하고 관리하는 것을 말한다.