ORM(Object-Relational Mapping)은 객체와 데이터베이스 간의 관계를 매핑하여, 데이터베이스 작업을 객체 지향적인 방식으로 다룰 수 있게 해주는 기술입니다. JPA와 같은 ORM 프레임워크는 SQL을 자동으로 생성하고, 직접 SQL을 작성하지 않아도 데이터를 쉽게 저장, 조회, 업데이트, 삭제할 수 있게 해줍니다. 이를 MyBatis와 비교하여 설명하겠습니다.
1. ORM의 SQL 자동 생성 예시 (JPA)
JPA와 같은 ORM 프레임워크는 엔티티 클래스와 데이터베이스 테이블 간의 매핑을 설정하고, 이를 통해 SQL을 자동으로 생성합니다. 예를 들어, User라는 엔티티가 있다고 가정해보겠습니다.
예시: JPA를 사용한 코드
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity // 이 클래스는 데이터베이스 테이블과 매핑됨
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
JPA를 사용한 데이터 저장, 조회 코드
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void saveUser(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
userRepository.save(user); // SQL 없이 저장 가능
}
public User findUser(Long id) {
return userRepository.findById(id).orElse(null); // SQL 없이 조회 가능
}
}
JPA에서 자동 생성되는 SQL
JPA는 userRepository.save(user)를 호출하면 내부적으로 다음과 같은 INSERT SQL을 자동으로 생성하여 실행합니다:
INSERT INTO User (name, email) VALUES ('Alice', 'alice@example.com');
userRepository.findById(id)를 호출할 경우, 다음과 같은 SELECT SQL을 자동으로 생성하여 실행합니다:
SELECT * FROM User WHERE id = 1;
이처럼 JPA에서는 엔티티 객체와 매핑 정보만 설정해주면 데이터베이스와의 통신을 위한 SQL을 자동으로 생성해주므로, 개발자는 SQL을 직접 작성할 필요가 줄어듭니다.
2. MyBatis의 SQL 작성 방식
MyBatis는 ORM과 달리 SQL을 자동으로 생성하지 않으며, SQL을 XML이나 어노테이션을 통해 수동으로 작성해야 합니다. 그러나 SQL을 커스터마이징하기 쉽고, 데이터베이스 스키마에 의존적인 작업에 적합합니다.
예시: MyBatis를 사용한 SQL 매핑
먼저, User 클래스와 매핑되는 SQL 쿼리를 XML 파일에 작성합니다.
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<insert id="saveUser">
INSERT INTO User (name, email) VALUES (#{name}, #{email})
</insert>
<select id="findUser" parameterType="Long" resultType="User">
SELECT * FROM User WHERE id = #{id}
</select>
</mapper>
MyBatis를 사용한 데이터 저장, 조회 코드
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void saveUser(String name, String email) {
userMapper.saveUser(name, email); // SQL을 직접 작성
}
public User findUser(Long id) {
return userMapper.findUser(id); // SQL을 직접 작성
}
}
설명
- MyBatis는 UserMapper.xml 파일에 SQL을 직접 작성하여 사용합니다. #{} 구문을 사용해 파라미터를 바인딩하며, SQL이 고정적이기 때문에, 복잡한 쿼리에서도 제어하기가 용이합니다.
- saveUser와 findUser 메서드를 호출할 때 수동으로 작성한 SQL을 실행합니다. 따라서 SQL 최적화를 세밀하게 할 수 있지만, SQL 작성에 많은 노력이 필요할 수 있습니다.
3. ORM (JPA)와 MyBatis 비교 요약
특성JPA (ORM)MyBatis
SQL 작성 여부 | SQL 자동 생성 | SQL을 직접 작성 |
객체 매핑 방식 | 엔티티 클래스와 테이블 간 매핑 설정 | XML 또는 어노테이션으로 SQL 매핑 |
개발 속도 | 간단한 CRUD의 경우 빠름 | SQL 작성에 시간이 걸릴 수 있음 |
유연성 | 복잡한 쿼리 작성에 불리 | 복잡한 SQL 작성에 유리 |
성능 최적화 | 기본 설정으로도 사용 가능, 필요시 커스터마이징 가능 | 쿼리 튜닝이 자유로움 |
- JPA는 간단한 CRUD 작업에서 SQL을 자동으로 생성해 주기 때문에, 데이터베이스와의 통신 작업을 단순화할 수 있습니다. 하지만 복잡한 쿼리나 데이터베이스에 의존적인 작업에서는 불편할 수 있습니다.
- MyBatis는 SQL 작성이 필수이므로 데이터베이스와의 세부적인 커스터마이징과 튜닝이 가능하며, 데이터베이스 종속적 작업에 더 적합합니다.
결론
JPA는 SQL 자동 생성을 통해 빠른 개발을 도와주며, 객체와 관계형 데이터베이스 간의 매핑을 간소화하는 데 유리합니다. 반면, MyBatis는 SQL을 수동 작성하여 보다 세밀하게 데이터베이스 작업을 제어할 수 있는 유연성을 제공합니다.
'JAVA Spring FRAMEWORK' 카테고리의 다른 글
[JAVA]RESTful API 서버란 (6) | 2024.11.13 |
---|---|
[JAVA]JDBC란? (0) | 2024.11.13 |
[SQL]Inner Join vs Outer Join (1) | 2024.08.31 |
디자인 패턴이란? (0) | 2024.06.24 |
[Spring Boot ] Spring Initializr 로 시작하기 (0) | 2023.03.14 |