ORM vs MyBatis: 자바 데이터베이스 접근 기술 비교

2024. 7. 29. 11:41·자바

데이터베이스와 상호 작용하는 자바 애플리케이션을 개발할 때, 개발자들은 주로 ORM(Object-Relational Mapping)이나 MyBatis와 같은 기술을 사용합니다. 이 글에서는 두 기술을 비교하고 각각의 장단점을 살펴보겠습니다.

ORM (Object-Relational Mapping)

ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 사이의 불일치를 해결하기 위한 기술입니다. Java에서 가장 널리 사용되는 ORM 프레임워크는 Hibernate입니다.

ORM 예시 코드 (Hibernate 사용)

// Entity 클래스 정의
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "email")
    private String email;

    // Getters and setters
}

// DAO (Data Access Object) 클래스
public class UserDAO {
    private SessionFactory sessionFactory;

    public void saveUser(User user) {
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(user); // ORM이 자동으로 SQL 쿼리를 생성
            tx.commit();
        } catch (Exception e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    public User getUser(Long id) {
        Session session = sessionFactory.openSession();
        User user = session.get(User.class, id); // ORM이 자동으로 SQL 쿼리를 생성
        session.close();
        return user;
    }
}

ORM의 장점

  1. 객체 지향적인 코드 작성 가능
  2. 데이터베이스 벤더에 독립적
  3. SQL 쿼리 자동 생성으로 생산성 향상

ORM의 단점

  1. 복잡한 쿼리의 경우 성능 저하 가능성
  2. 학습 곡선이 높음

MyBatis

MyBatis는 SQL 매퍼 프레임워크로, 자바 객체와 SQL 문 사이의 자동 매핑을 지원합니다. XML 파일을 사용하여 SQL을 관리하고, 인터페이스와 연결하여 사용하는 방식이 일반적입니다.

MyBatis 예시 코드

// User 클래스 (POJO)
public class User {
    private Long id;
    private String username;
    private String email;

    // Getters and setters
}

// Mapper 인터페이스
public interface UserMapper {
    void insertUser(User user);
    User selectUser(Long id);
}

// DAO 클래스
public class UserDAO {
    private SqlSessionFactory sqlSessionFactory;

    public void saveUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            mapper.insertUser(user);
            session.commit();
        }
    }

    public User getUser(Long id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectUser(id);
        }
    }
}

XML 매핑 파일 (UserMapper.xml)

<?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="com.example.UserMapper">
  <insert id="insertUser" parameterType="com.example.User">
    INSERT INTO users (username, email) VALUES (#{username}, #{email})
  </insert>

  <select id="selectUser" parameterType="long" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
  </select>
</mapper>

이 예제에서는:

  1. UserMapper 인터페이스에서 메서드 이름만 정의합니다.
  2. 실제 SQL 쿼리는 XML 파일 (UserMapper.xml)에 정의됩니다.
  3. XML 파일의 각 SQL 문에는 고유한 id가 할당되며, 이 id는 인터페이스의 메서드 이름과 일치해야 합니다.
  4. DAO 클래스에서는 SqlSession을 통해 매퍼 인터페이스를 가져와 사용합니다.

이 방식의 장점은:

  1. SQL을 Java 코드와 분리하여 관리할 수 있습니다.
  2. 복잡한 쿼리를 작성하기 쉽습니다.
  3. SQL 변경 시 Java 코드를 수정할 필요가 없습니다.
  4. 동적 SQL 작성이 용이합니다.

MyBatis의 장점

  1. SQL에 대한 완전한 제어 가능
  2. 복잡한 쿼리와 저장 프로시저 지원
  3. XML을 통한 SQL 관리로 유지보수성 향상
  4. 동적 SQL 작성 용이

MyBatis의 단점

  1. SQL 문을 직접 작성해야 함
  2. 데이터베이스 벤더 종속적일 수 있음
  3. ORM에 비해 객체-관계 불일치 문제를 직접 처리해야 함

결론

ORM과 MyBatis는 각각 장단점이 있으며, 프로젝트의 요구사항에 따라 선택할 수 있습니다.
ORM은 객체 지향적인 설계와 생산성을 중시하는 프로젝트에 적합하며,
MyBatis는 SQL에 대한 세밀한 제어가 필요하거나 성능 최적화가 중요한 프로젝트에 적합합니다.

MyBatis는 특히 레거시 데이터베이스와의 통합이나 복잡한 쿼리가 많은 프로젝트에서 유용합니다.
XML을 통한 SQL 관리는 데이터베이스 전문가와 자바 개발자 간의 협업을 용이하게 합니다.

두 기술 모두 자바 생태계에서 널리 사용되고 있으므로, 개발자는 두 기술을 모두 이해하고
상황에 맞게 선택할 수 있어야 합니다.

'자바' 카테고리의 다른 글

[JAVA] 이메일 전송 라이브러리 구현  (4) 2024.10.07
[JAVA] 자바 메서드 심화: 오버로딩과 오버라이딩  (0) 2024.07.19
[JAVA] 자바 함수(메서드)의 기초: 선언부터 사용까지  (1) 2024.07.19
[API] Python API와 Java 클라이언트를 이용한 CPK 분석 및 히스토그램 생성  (1) 2024.07.19
[JAVA] 소켓 프로그래밍 3번  (1) 2024.07.08
'자바' 카테고리의 다른 글
  • [JAVA] 이메일 전송 라이브러리 구현
  • [JAVA] 자바 메서드 심화: 오버로딩과 오버라이딩
  • [JAVA] 자바 함수(메서드)의 기초: 선언부터 사용까지
  • [API] Python API와 Java 클라이언트를 이용한 CPK 분석 및 히스토그램 생성
뚤떡이
뚤떡이
프로그래밍을 알아가며 저와 함께 성장하는 블로그 입니다
  • 뚤떡이
    뚤떡이의 발개벗긴개발
    뚤떡이
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • Docker (2)
      • 자바 (29)
        • start (10)
        • calcu (4)
        • process (7)
      • 플러터 (1)
      • 알고리즘 (12)
        • 개념 (2)
        • 구현 (5)
        • 백준 (0)
        • 프로그래머스 (5)
      • 이클립스 (4)
        • 초기설정 (4)
      • SQL (5)
      • IT 잡동사니 (10)
      • 개발 관련 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    크롬 원격 데스크톱
    시놀로지
    #python #개발일지 #번역 #메모리최적화 #websocket #redis #비동기프로그래밍
    #자동화
    #프로젝트
    #개발일지
    크롬 원격
    #apachesuperset #시놀로지 #db2 #데이터시각화 #기술블로그
    스팸메일 #메일보안 #gophish #it보안 #오픈소스
    #번역
    GLPI
    synology
    IT자산관리
    #python
    개발일지 #프로젝트후기 #gpt4 #번역 #자동화 #python #electron
    MAC 크롬 원격
    윈도우 크롬 원격
    요구사항 정의서
    #electron
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
뚤떡이
ORM vs MyBatis: 자바 데이터베이스 접근 기술 비교
상단으로

티스토리툴바