쉽게 쉽게

SQL Mapper와 ORM이란? 본문

CS/CS

SQL Mapper와 ORM이란?

곱마2 2023. 5. 14. 21:23
반응형

자바 JDBC

1. JDBC란?

프로젝트에서 객체 지향 프로그래밍과 DB를 연결하는 방법은 여러 가지가 있으며 이를 제공하는 프레임워크가 Persistence Framework(영속성 프레임워크)이다.

 

영속성이란?

더보기

영속성(persistence)은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.

데이터가 영속적이지 않으면 데이터가 휘발되어 CRUD가 의도대로 되지 않을 것이다.

 

Persistence Framework는 객체를 데이터베이스에 저장, 조회, 수정, 삭제하는 등의 데이터베이스 작업을 쉽게 할 수 있게 도와주며, 데이터베이스와 객체 간의 매핑을 담당하는 것이 특징이다.

 

이런 Persistence Framework에서 DB와의 연동을 다루는 기술을 JDBC(Java Database Connectivity)라고 한다.

JDBC는 Persistence Framework 중 하나이며, ORM과 SQL Mapper와 같은 다른 Persistence Framework도 있다

구체적으로 말하면 JDBC는 자바 언어에서 DB에 접속할 수 있도록 하는 자바 API(데이터베이스 관련 클래스와 인터페이스 집합)이며, JDBC를 사용하면, 자바 언어로 작성된 애플리케이션에서 관계형 데이터베이스와 연동할 수 있다.

 

자바에서 자주 사용하는 JDBC 종류는 아래와 같다.

  •  JDBC API (Java Database Connectivity API): 자바에서 제공하는 공식 JDBC API로, DBMS와의 통신을 위한 기본 인터페이스와 클래스를 제공한다.
  •  Spring JDBC: Spring Framework에서 제공하는 JDBC 라이브러리로, JDBC API를 보다 쉽게 사용할 수 있도록 지원한다.
  • MyBatis: SQL Mapper 프레임워크로, XML이나 애노테이션 등을 사용하여 SQL문을 작성하고, JDBC API를 이용하여 데이터베이스와 통신한다.
  • Hibernate: ORM 프레임워크로, 객체와 관계형 데이터베이스를 매핑하여 데이터베이스에 접근하고 조작할 수 있다.

이 중 SQL Mapper과 ORM의 차이가 무엇인지 설명하고자 한다. 

2. SQL Mapper란?

SQL Mapper는 데이터베이스의 SQL문을 실행하기 위한 객체를 생성하고, SQL문의 결과를 객체로 변환하는 기능을 제공하는 라이브러리이다. 

SQL Mapper는 SQL문을 작성하고 실행하는 과정에서 JDBC API를 사용하지만, JDBC API를 직접 사용할 때 발생할 수 있는 반복적이고 번거로운 작업들을 감춰주고, SQL과 객체 사이의 매핑을 처리하기 위한 코드를 쉽게 작성할 수 있도록 도와준다. 
SQL Mapper의 대표적인 예시로는 iBatis, MyBatis가 있으며, MyBatis는 XML 파일에 SQL문을 작성하고, Java 객체와 SQL문의 매핑 관계를 정의한 Mapper 파일을 사용하여 SQL문의 실행 결과를 객체로 변환하는 기능을 제공한다. 

 

즉  요약하면 개발자가 SQL을 직접 작성하고, SQL문을 실행하고 나온 데이터를 객체로 매핑시켜 주는 과정을 거친다.

 

장점

  1. SQL에 대한 전문성이 있다면 사용에 있어 편리하다.

  2. 세부적인 SQL 변경이 용이하다.

 

단점

  1. DBMS에 따라 SQL 문법이 다르기에 DBMS에 종속적이다.

  2. 개발시 SQL를 직접 작성해야 한다.

  3. 1번의 이유로 SQL문의 재사용이 어렵다.

  4. 2개 이상의 DBMS 지원 시 유지 보수가 어렵다.

3. ORM(Object-Relational Mapping)이란?

ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 기술이다. 

대표적인 ORM 프레임워크로는 Hibernate, JPA 등이 있다.

SQL Mapper가 SQL 쿼리와 매핑을 담당한다면, ORM은 객체와 테이블 간의 매핑을 담당한다. 

한다.

또한, ORM은 SQL Mapper와 달리 SQL 쿼리를 작성하지 않아도 되므로, 생산성이 좋다.

 

즉 요약하면 ORM은 설정된 객체 간의 관계를 바탕으로 자동으로 SQL를 생성하여 관계형 데이터베이스의 데이터를 자동으로 매핑시켜 주는 프레임워크이다.

 

장점

  1. 객체 지향적인 코드로 직관적인 비지니스 로직을 작성할 수 있다.

  2. DBMS 종속성이 줄어들고 종류에 관계 없이 빠르게 적용 가능하다.

  3. 쿼리에 집중할 필요 없이 빠르게 개발이 가능하다.

  4. 재사용 유지 보수 편리성이 증가한다.

 

단점

  1. 초기 적용에 난이도가 어느 정도 있다.

  2. 프로젝트의 복잡성이 커질 경우 난이도가 올라간다.

  3. 잘못 적용할 경우 속도 저하가 발생할 수 있다.  

  4. 복잡한 SQL의 사용이 어렵다.

 

4의 단점을 극복하기 위한 방법은 아래와 같이 있다.

  • JPA에서는 SQL과 유사한 기술인 JPQL을 지원
  • SQL 자체 쿼리를 작성할 수 있도록 지원
  • SQL Mapper와 혼용해서 사용도 가능

4. 차이점

SQL Mapper와 ORM은 둘 다 데이터베이스와 객체 간의 매핑을 수행하지만, 그 구현 방식에서 차이가 있다.
SQL Mapper는 SQL 쿼리와 매핑되는 메서드를 직접 작성하여 사용자가 쿼리를 직접 정의하는 방식으로 데이터베이스와 연동한다. 

이 방식은 쿼리에 대한 제어권이 사용자에게 있어 더욱 유연하게 쿼리를 작성할 수 있다는 장점이 있다.

반면에 ORM은 객체와 테이블 간의 매핑을 기반으로 쿼리를 생성한다.

객체 지향 프로그래밍의 개념을 활용하여 데이터베이스를 다루기 때문에 객체 중심적인 코드 작성이 가능해진다는 장점이 있다.

ORM은 일반적인 CRUD 쿼리문이 이미 정의되어 있으므로, 개발자는 객체 간의 관계에 집중할 수 있다.

따라서, SQL Mapper는 개발자가 쿼리를 직접 작성해야 하기 때문에 쿼리 작성 능력이 필요하며, ORM은 객체 지향적인 설계를 하기 위해 객체 중심적인 코드 작성이 가능하다는 장점이 있다.

 

간단한 예시로, 아래와 같은 테이블이 있다고 가정

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "age")
    private int age;

    // getters and setters
}

 

SQL Mapper에서는 개발자가 SQL 문장을 작성하여 데이터베이스에 직접 접근한다.

보면 메서드에 해당하는 SQL문을 직접 작성하고 있다.

(여기서는 mybatis 예시)

public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(@Param("id") Long id);

    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void save(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteById(@Param("id") Long id);

    @Select("SELECT * FROM users")
    List<User> findAll();
}

@Repository
public class UserMapperImpl implements UserMapper {

    private final SqlSession sqlSession;

    public UserMapperImpl(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public User findById(Long id) {
        return sqlSession.selectOne("findById", id);
    }

    @Override
    public void save(User user) {
        sqlSession.insert("save", user);
    }

    @Override
    public void deleteById(Long id) {
        sqlSession.delete("deleteById", id);
    }

    @Override
    public List<User> findAll() {
        return sqlSession.selectList("findAll");
    }
}


반면에 ORM에서는 개발자가 객체를 조작하면 ORM 프레임워크가 이를 기반으로 SQL 쿼리를 자동으로 생성하여 데이터베이스에 접근한다.

보면 기본적인 CRUD에 해당하는 메서드의 SQL문은 자동으로 생성되어 있다.

(여기서는 JPA 예시)

@Repository
public class UserRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public User findById(Long id) {
        return entityManager.find(User.class, id);
    }

    public void save(User user) {
        entityManager.persist(user);
    }

    public void delete(User user) {
        entityManager.remove(user);
    }

    public List<User> findAll() {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root);
        return entityManager.createQuery(query).getResultList();
    }
}


이렇게 객체를 직접 다루는 ORM은 생산성 측면에서 유리하지만, 복잡한 쿼리나 대량의 데이터 처리에서는 SQL Mapper가 더 적합할 수 있다.

 

https://firework-ham.tistory.com/110

 

[DB] ORM, SQL Mapper 이란?

ORM과 SQL Mapper의 개념을 정리하기전 영속성(Persistence)에 대해 먼저 정리해보겠습니다. 영속성(Persistence) 영속성이란 프로그램이 종료되어도 데이터가 사라지지 않는 특성을 말한다. 영속성을 갖

firework-ham.tistory.com

https://antstudy.tistory.com/447

 

[테코톡] ORM, SQL Mapper, JDBC의 개념과 비교

📚 참고자료 유튜브 채널 [우아한 Tect] - 10분 테코톡 아마찌의 ORM vs SQL Mapper vs JDBC https://www.youtube.com/watch?v=VTqqZSuSdOk&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=66 🤔 영속성(Persistence)이란? 데이터를 생성

antstudy.tistory.com

잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

 

 

 

반응형

'CS > CS' 카테고리의 다른 글

멀티태스킹, 멀티프로세싱, 멀티스레딩  (1) 2023.05.07
컴퓨터 구성요소  (0) 2023.05.07
XML, JSON  (0) 2023.04.05
API, REST, REST API  (0) 2023.04.01
쿠키, 세션, 토큰, 캐시  (0) 2023.03.26