ORM이란?
- Object Relational Mapping의 약자이다.
- 한국어로 객체-관계 매핑이라는 뜻으로 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
- OOP(Java,Python)는 클래스를 사용하고 RDBMS(MariaDB)는 테이블을 사용하기 때문에 모델간의 불일치가 존재한다.
ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동 생성해 불일치를 해결한다.
- OOP를 사용하는데 제약을 받지 않고 RDBMS를 이용하기 위한 프레임워크로 이해하면 된다.
ORM을 사용한 코드와 아닌 코드
사용 전 코드
public void insertUser(UserVO userVO){
String query = " INSERT INTO USER (EMAIL, NAME, PW)"
+ " VALUES (?, ?, ?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString (1, userVO.getEmail());
preparedStmt.setString (2, userVO.getName());
preparedStmt.setString (3, userVO.getPW());
preparedStmt.execute();
}
- 코드에 직접 SQL문을 작성해야해서 가독성이 떨어진다.
- SQL문과 클래스를 모두 작성하므로 생산성이 떨어진다.
사용 후 코드(Mybatis)
public class UserDAO {
@Autowired
private SqlSession sqlSession;
private final String namespace = "mang.blog.user.userMapper.";
public int insertUser(UserDto userDto) {
return sqlSession.insert(namespace+"insertUser", userDto);
}
}
<?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="mang.blog.user.userMapper">
<insert id="insertUser" parameterType = "userDto">
INSERT USER(
EMAIL, USER_NAME, USER_PW,
)VALUES(
#{userEmail}, #{userName}, #{userPw}
)
</insert>
</mapper>
- 미리 DTO 클래스를 만들어줘야한다.
- 내가 프로젝트에서 쓰던 sqlsessiondaosupport를 상속하던 법하고는 약간 다른 방법이다.
- 이전보다 가독성이 좋지만 SQL문을 직접 작성해줘야한다.
사용 후 코드(Hibernate)
@Service("userService")
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Override
public UserVO insertUser(UserVO userVO) {
return userRepository.save(userVO);
}
@Override
public UserVO findUser(UserVO userVO) {
return userRepository.save(userVO);
}
}
@Repository
public interface LoginRepository extends JpaRepository<UserVO, Long> {
UserVO findByUserEmailAndUserPw(String userEmail, String userPw);
}
- User Repository는 Jpa Repository를 상속받는다.
- Jpa Repository는 기본적인 CRUD 연산을 제공하는데 그것을 활용한 예제가 Service 클래스의 insertUser 메소드이다.
- Jpa Repository에서 insert 연산을 수행하도록 기본적으로 만들어놓은 save 메소드를 통해 UserVO를 DB에 넣고 있다.
- Hibernate는 MyBatis와 달리 쿼리를 직접 작성지 않음을 확인할 수 있다.
장점과 단점
장점
- 객체 지향 코드로 인해 더 직관적이고 비지니스 로직에 집중할 수 있게 해준다.
- SQL Query가 아닌 메소드로 데이터를 조작할 수 있어 객체 모델로 프로그래밍 하는데 집중할 수 있다.
- 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
- 재사용 및 유지보수의 편리성이 증가한다.
- ORM은 독립적으로 작성되어 해당 객체들을 재활용할 수 있다.
- RDBMS에 대한 종속성이 줄어든다.
단점
- 완벽한 서비스를 구현하기 어렵다.
- 복잡한 SQL문의 처리가 어렵다.