본문 바로가기
GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~

[마이바티스(MyBatis)] 마이바티스(MyBatis) 소개

by GDNGY 2023. 5. 16.

Chapter 1. 마이바티스(MyBatis) 소개

마이바티스는 자바 개발자가 데이터베이스와 손쉽게 연동할 수 있도록 도와주는 퍼시스턴스 프레임워크입니다. SQL을 직접 작성하면서 객체와 SQL 사이의 매핑을 처리해 주는 기능이 특징입니다. 이를 통해 개발자는 SQL 작성에 집중하면서 동시에 객체 지향적인 프로그래밍을 유지할 수 있습니다.

 


 

반응형

 


 

[Chapter 1. 마이바티스 소개]

 

1.1. 마이바티스 개요

1.1.1. 마이바티스의 탄생 배경

1.1.2. 마이바티스와 ORM 비교

 

1.2. 주요 기능

1.2.1. 객체 매핑

1.2.1.1. 기본 매핑

1.2.1.2. 고급 매핑

1.2.2. 프로시저 호출

1.2.2.1. 프로시저 호출 방법

1.2.2.2. 프로시저 결과 처리

 

1.3. 사용 사례

1.3.1. 마이바티스를 사용하는 이유

1.3.2. 실제 업무에서의 활용 예시

 


1.1 마이바티스 개요

마이바티스(MyBatis)는 자바 객체와 SQL 사이의 관계를 쉽게 다룰 수 있게 도와주는 프레임워크입니다. 특히, SQL 쿼리를 직접 작성하면서 동시에 객체 지향 프로그래밍을 유지할 수 있다는 점이 큰 특징이죠. 이를 통해 개발자는 SQL 작성에 집중하면서 동시에 코드의 품질을 유지할 수 있습니다. 

 


 

1.1.1 마이바티스의 탄생 배경

마이바티스의 탄생 배경을 이해하기 위해서는 ORM(Object-Relational Mapping)에 대한 이해가 필요합니다. ORM은 객체 지향 프로그래밍과 관계형 데이터베이스의 패러다임 불일치 문제를 해결하기 위해 나온 기술입니다. 이 기술을 사용하면 데이터베이스와 자바 객체 사이의 관계를 ORM 프레임워크가 자동으로 매핑해 주기 때문에, 개발자는 SQL 쿼리를 직접 작성할 필요 없이 데이터를 다룰 수 있게 됩니다. 

 

 [예제]

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // getter, setter 생략
}

 

위의 코드는 JPA(Java Persistence API, ORM 프레임워크 중 하나)를 사용한 예시입니다. User 클래스는 @Entity 어노테이션을 사용하여 데이터베이스의 테이블과 매핑되고, 각 필드는 테이블의 칼럼에 매핑됩니다. 이렇게 하면 JPA가 알아서 SQL 쿼리를 생성하고 실행해 주기 때문에 개발자는 복잡한 SQL을 작성할 필요 없이 객체 지향적으로 코드를 작성할 수 있습니다. 

 

그런데 ORM이 모든 상황에 적합한 것은 아닙니다. ORM은 객체와 테이블 간의 매핑을 추상화하여 제공하기 때문에, 복잡한 쿼리나 세밀한 조정이 필요한 경우에는 제한적일 수 있습니다. 또한, SQL을 직접 다루지 않기 때문에 발생하는 성능 이슈도 있습니다. 이러한 문제점들을 해결하기 위해 탄생한 것이 마이바티스입니다.

 

1.1.2 마이바티스와 ORM 비교

마이바티스는 ORM과는 다르게 SQL을 직접 작성하면서 동시에 코드와 SQL 사이의 매핑을 관리해주는 프레임워크입니다. 이런 특성 덕분에 개발자는 복잡한 쿼리를 작성하거나 세밀한 조정이 필요한 경우에도 유연하게 대응할 수 있습니다.

 

 [예제]

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

 

위의 코드는 마이바티스를 사용하여 SQL 쿼리를 작성한 예시입니다. 이렇게 XML 파일에 SQL을 직접 작성하면 마이바티스가 해당 SQL을 실행하고 결과를 자바 객체에 매핑해 줍니다. 

 

마이바티스와 ORM의 가장 큰 차이점은 "SQL을 얼마나 직접 다룰 수 있느냐"에 있습니다. ORM은 객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치 문제를 해결하기 위해 SQL을 추상화하고 자동화하지만, 이는 동시에 세밀한 조정이 필요한 경우나 복잡한 쿼리를 다루는 데에 한계를 가져옵니다. 반면 마이바티스는 SQL을 직접 작성하므로, 이러한 한계 없이 데이터베이스를 다룰 수 있습니다. 

 

하지만 이는 반대로 ORM이 제공하는 편리함을 포기한다는 것을 의미합니다. SQL을 직접 작성하므로 SQL에 대한 이해가 필요하며, SQL 작성에 드는 시간과 노력도 고려해야 합니다. 또한, ORM이 제공하는 다양한 기능들(예: 캐시, 지연 로딩 등)을 직접 구현해야 하는 경우도 있습니다.

 

따라서 마이바티스와 ORM 중 어떤 것을 선택할지는 프로젝트의 요구사항과 상황에 따라 달라집니다. 복잡한 쿼리와 세밀한 조정이 필요하다면 마이바티스를, 객체 지향적인 코드 작성과 편리한 데이터 관리가 필요하다면 ORM을 선택하면 좋습니다. 

 


 

1.2. 주요 기능

마이바티스(MyBatis)는 데이터베이스와 자바 애플리케이션 간의 데이터 매핑과 SQL 쿼리 실행을 처리하는데 뛰어난 기능을 제공합니다. 이번 섹션에서는 그중 객체 매핑과 프로시저 호출에 대해 알아보겠습니다. 

 


 

1.2.1. 객체 매핑

객체 매핑은 SQL 쿼리의 실행 결과를 자바 객체로 변환하는 과정을 말합니다. 이를 통해 개발자는 쿼리 결과를 직접 처리하지 않고, 자바 객체를 통해 데이터를 조작할 수 있습니다. 

 

1.2.1.1. 기본 매핑

기본 매핑은 SQL 쿼리의 결과를 자바의 기본 데이터 타입이나 단순한 객체로 변환하는 과정입니다. 예를 들어, 아래와 같은 SELECT 쿼리가 있다고 가정해 봅시다. 

 

[예제]

SELECT id, name, email FROM user WHERE id = #{id}

 

이 쿼리의 결과는 'id', 'name', 'email' 세 개의 칼럼으로 이루어진 레코드입니다. 마이바티스는 이 결과를 자동으로 User 클래스의 객체로 매핑해 줍니다. 

 

 [예제]

public class User {
  private int id;
  private String name;
  private String email;
  
  // getters and setters...
}

 

1.2.1.2. 고급 매핑

고급 매핑은 보다 복잡한 객체 매핑을 가능하게 합니다. 예를 들어, 하나의 쿼리 결과를 여러 객체로 분할하거나, 다른 객체를 포함하는 복합 객체로 매핑할 수 있습니다. 이를 통해 개발자는 복잡한 데이터 구조를 쉽게 표현할 수 있습니다.

 

 [예제]

SELECT u.id, u.name, u.email, a.street, a.city 
FROM user u JOIN address a ON u.id = a.user_id WHERE u.id = #{id}

 

이 쿼리의 결과는 'id', 'name', 'email', 'street', 'city' 다섯 개의 칼럼으로 이루어진 레코드입니다. 이 결과를 User와 Address 두 개의 객체로 분할하여 매핑할 수 있습니다. 

 

 [예제]

public class User {
  private int id;
  private String name;
  private String email;
  private Address address;
  
  // getters and setters...
}

public class Address {
  private String street;
  private String city;
  
  // getters and setters...
}

 

1.2.2. 프로시저 호출

마이바티스는 데이터베이스 내부의 저장 프로시저를 호출하는 기능도 제공합니다. 저장 프로시저는 특정 작업을 수행하는데 필요한 SQL 구문을 하나의 단위로 묶어 데이터베이스 내부에 저장한 것을 말합니다. 이를 통해 코드의 재사용성을 높이고 성능을 향상할 수 있습니다.

 

1.2.2.1. 프로시저 호출 방법

마이바티스에서는 {call 프로시저이름(#{파라미터}, #{결과,mode=OUT,jdbcType=CURSOR,resultMap=결과맵})} 형태로 저장 프로시저를 호출할 수 있습니다. 여기서 OUT 파라미터는 프로시저가 실행된 후 결과를 반환받는 변수를 의미합니다.

 

예를 들어, 아래와 같은 저장 프로시저가 있다고 가정해봅시다.

 

 [예제]

CREATE PROCEDURE GetUserEmail(IN userId INT, OUT userEmail VARCHAR(255))
BEGIN
  SELECT email INTO userEmail FROM user WHERE id = userId;
END

 

이 프로시저는 사용자의 ID를 입력으로 받아 해당 사용자의 이메일을 반환하는 간단한 기능을 수행합니다. 이 프로시저를 마이바티스에서 호출하려면 다음과 같이 작성할 수 있습니다. 

 

 [예제]

<select id="getUserEmail" parameterType="map" statementType="CALLABLE">
  {call GetUserEmail(#{userId,mode=IN,jdbcType=INTEGER}, #{userEmail,mode=OUT,jdbcType=VARCHAR})}
</select>

 

1.2.2.2. 프로시저 결과 처리

위 예제에서는 OUT 파라미터를 통해 프로시저의 결과를 받았습니다. 이 결과는 마이바티스가 자동으로 매핑하여 자바 코드에서 사용할 수 있습니다. 다음은 이를 사용하는 방법의 예시입니다.

 

 [예제]

Map<String, Object> params = new HashMap<>();
params.put("userId", 1);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.getUserEmail(params);
String userEmail = (String) params.get("userEmail");

 

여기서는 먼저 사용자 ID를 파라미터로 넘기기 위해 Map 객체를 생성하였습니다. 그리고 getUserEmail 메서드를 호출하여 프로시저를 실행하였습니다. 마지막으로 OUT 파라미터의 이름을 키로 사용하여 Map에서 이메일 주소를 가져왔습니다.

 

이렇게 마이바티스는 복잡한 SQL 처리를 자바 코드에서 간단하게 처리할 수 있도록 돕는 다양한 기능을 제공합니다. 이를 잘 활용하면 데이터베이스와의 연동을 보다 효과적으로 수행할 수 있습니다. 

 


 

1.3. 사용 사례

마이바티스는 SQL 쿼리를 작성하고 그 결과를 자바 객체에 매핑하는 과정을 단순화해 주는 프레임워크입니다. 이는 데이터베이스 작업의 복잡성을 줄여주고, 개발 시간을 단축시키는데 큰 역할을 합니다. 특히, 마이바티스는 개발자가 SQL을 직접 작성하므로, 데이터베이스의 세세한 조작이 가능합니다. 

 


 

1.3.1. 마이바티스를 사용하는 이유

특정 비즈니스 로직을 구현하기 위해 복잡한 쿼리가 필요한 경우에 유용합니다. 또한, 마이바티스는 SQL과 자바 사이의 간격을 줄여, 객체 지향 프로그래밍의 장점과 SQL의 풍부한 표현력을 동시에 누릴 수 있게 해 줍니다.

 

1.3.1.1. 복잡한 쿼리의 유연성

전통적인 ORM 프레임워크는 쿼리를 자동으로 생성해 주는 대신, 복잡한 쿼리를 작성하는데 제한적일 수 있습니다. 반면, 마이바티스는 SQL 쿼리를 직접 작성하므로, 복잡한 쿼리나 특수한 데이터베이스 기능을 필요로 하는 경우에도 유연하게 대응할 수 있습니다.

 

1.3.1.2. 객체 지향 프로그래밍과 SQL의 조화

마이바티스는 SQL 쿼리의 결과를 자바 객체에 매핑해 주는 기능을 제공합니다. 이를 통해, 개발자는 SQL 쿼리를 통해 얻은 데이터를 자바의 객체 지향적인 형태로 다룰 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상하는데 도움이 됩니다.

 

1.3.2. 실제 업무에서의 활용 예시

마이바티스는 다양한 실제 업무 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 복잡한 비즈니스 로직을 구현하기 위해 복잡한 쿼리를 작성해야 하는 경우, 마이바티스를 이용하면 개발자는 SQL 쿼리를 직접 작성하고 그 결과를 객체에 매핑하여 사용할 수 있게 해 줍니다.

 

1.3.2.1. 복잡한 비즈니스 로직 구현

마이바티스는 복잡한 비즈니스 로직을 구현하는데 필요한 복잡한 SQL 쿼리를 직접 작성할 수 있게 해 줍니다. 이는 개발자가 필요한 데이터를 정확하게 추출하고, 효율적인 성능으로 처리할 수 있도록 해 줍니다. 예를 들어, 복잡한 조인 쿼리나 서브 쿼리를 이용해야 하는 경우, 마이바티스를 이용하면 더욱 쉽게 이를 구현할 수 있습니다.

 

[예제]

<select id="selectOrderDetail" resultType="OrderDetail">
  SELECT O.order_id, O.order_date, C.customer_name, P.product_name
  FROM Orders O
  INNER JOIN Customers C ON O.customer_id = C.customer_id
  INNER JOIN Products P ON O.product_id = P.product_id
  WHERE O.order_id = #{orderId}
</select>

 

1.3.2.2. 대용량 데이터 처리

마이바티스는 대용량 데이터를 처리하는데도 유용합니다. 페이징 쿼리를 직접 작성함으로써, 서버 메모리에 과부하를 주지 않고도 대량의 데이터를 효율적으로 처리할 수 있습니다. 이는 대규모 웹 애플리케이션에서 특히 중요한 요소입니다.

 

[예제]

<select id="selectPagedOrders" resultType="Order">
  SELECT *
  FROM Orders
  LIMIT #{offset}, #{rows}
</select>

 

여기서 offset과 rows는 페이지 번호와 페이지당 행 수를 나타냅니다.

 

1.3.2.3. 다양한 데이터베이스 호환

마이바티스는 다양한 데이터베이스에 호환됩니다. 개발자는 동일한 코드를 이용해 여러 데이터베이스에서 작동하는 애플리케이션을 만들 수 있습니다. 이는 애플리케이션의 범용성을 높이고, 다양한 환경에서의 배포를 가능하게 해 줍니다.

 

[예제]

public interface OrderMapper {
  Order selectOrder(int orderId);
}

 

이 인터페이스를 MySQL, PostgreSQL, Oracle 등 다양한 데이터베이스에서 사용할 수 있습니다.

 

이러한 예시들을 통해 볼 때, 마이바티스는 다양한 상황에서 유연하게 사용될 수 있는 강력한 툴임을 알 수 있습니다. 다음에는 이러한 마이바티스의 기능을 실제로 어떻게 활용하는지에 대해 자세히 알아보겠습니다.

 


 

2023.05.15 - [GD's IT Lectures : 기초부터 시리즈/마이바티스(MyBatis) 기초부터 ~] - [마이바티스(MyBatis)] 마이바티스(MyBatis) 란?

 

[마이바티스(MyBatis)] 마이바티스(MyBatis) 란?

마이바티스(MyBatis) 란? MyBatis는 Java 언어를 위한 오픈 소스 SQL 매퍼 프레임워크입니다. SQL 매퍼는 개발자가 SQL 쿼리문을 작성하면서 동시에 해당 쿼리문의 결과를 자바 객체와 매핑하게 해주는

gdngy.tistory.com

 

반응형

댓글