ORM

이시우·2021년 2월 18일
0

컴퓨터 지식

목록 보기
8/17
post-thumbnail

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());
 
        // execute the preparedstatement
        preparedStmt.execute();
   }
  • 코드에 직접 SQL문을 작성해야해서 가독성이 떨어진다.
  • SQL문과 클래스를 모두 작성하므로 생산성이 떨어진다.

사용 후 코드(Mybatis)

  • DAO와 DTO 클래스
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);
    }
}
  • mapper 파일
<?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문의 처리가 어렵다.

0개의 댓글