무한루프/개발, 업무

마이바티스(MyBatis)에서 객체를 쓰지 않고 json으로 주고 받기

시원한생맥주 2025. 2. 25. 19:18

 

 

마이바티스(MyBatis)에서 객체를 쓰지 않고 json으로 주고 받기

 

객체를 사용하지 않고 JSON 형태로 데이터를 주고받는 방식으로 MyBatis를 사용할 수 있다.

Map을 사용하여 쿼리 결과를 받거나 JSONObject와 같은 라이브러리를 사용할 수 있다.

 

객체를 사용하는 것보다 훨씬 유연하게 개발할 수 있어서 편리한 장점이 있지만,

프로젝트가 복잡해지고 사람이 많아질수록 난장판이 될 단점도 있다-_-;

 

 

 

Map을 사용하여 JSON 형태로 데이터 받기

MyBatis에서 결과를 Map으로 받을 수 있으며, Map<String, Object>로 반환되는 데이터를 JSON처럼 다룰 수 있다.

 

1.1 ItemMapper.xml

XML 파일에서 resultType을 Map으로 설정. Map은 MyBatis에서 자동으로 컬럼 이름을 키(key)로, 값을 값(value)으로 매핑하여 반환해 준다.

<mapper namespace="com.nam.gallery.mapper.ItemMapper">
    <select id="findById" parameterType="int" resultType="java.util.Map">
        SELECT * FROM ITEMS WHERE ID = #{id}
    </select>
</mapper>

 

1.2 Java 코드에서 결과받기

Java에서는 Map<String, Object>로 반환되는 결과를 받아서 JSON처럼 사용할 수 있다.

package com.nam.gallery;

import org.apache.ibatis.session.SqlSession;
import java.util.Map;

public class ItemService {
    public Map<String, Object> getItemById(int id) {
        try (SqlSession session = MyBatisConfig.getSqlSessionFactory().openSession()) {
            // Mapper를 가져옵니다
            ItemMapper itemMapper = session.getMapper(ItemMapper.class);
            
            // findById 쿼리 실행 (결과는 Map으로 받음)
            return itemMapper.findById(id);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

이제 getItemById 메서드는 Map<String, Object>를 반환한다. 반환된 Map은 각 컬럼이 key, 컬럼 값이 value가 된다.

 

1.3 결과를 JSON으로 변환하기

만약 Map을 JSON 형태로 변환하려면, Jackson 라이브러리 등을 사용할 수 있다.

import com.fasterxml.jackson.databind.ObjectMapper;

public class ItemService {
    public String getItemByIdAsJson(int id) {
        try (SqlSession session = MyBatisConfig.getSqlSessionFactory().openSession()) {
            // Mapper를 가져옵니다
            ItemMapper itemMapper = session.getMapper(ItemMapper.class);
            
            // findById 쿼리 실행 (결과는 Map으로 받음)
            Map<String, Object> itemData = itemMapper.findById(id);
            
            // Map을 JSON 형태로 변환
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.writeValueAsString(itemData);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

이 코드에서는 Jackson 라이브러리를 사용하여 Map을 JSON 문자열로 변환한다.


 

 

JSONObject를 사용하여 JSON 형태로 결과받기

 

JSONObject를 사용해서도 결과를 JSON 형태로 받을 수 있다.

이 방법을 사용하려면 org.json 라이브러리Jackson 라이브러리 등을 사용할 수 있다.

 

2.1 ItemMapper.xml

<mapper namespace="com.nam.gallery.mapper.ItemMapper">
    <select id="findById" parameterType="int" resultType="org.json.JSONObject">
        SELECT * FROM ITEMS WHERE ID = #{id}
    </select>
</mapper>

 

2.2 Java 코드에서 JSONObject로 받기

import org.json.JSONObject;
import org.apache.ibatis.session.SqlSession;

public class ItemService {
    public JSONObject getItemByIdAsJson(int id) {
        try (SqlSession session = MyBatisConfig.getSqlSessionFactory().openSession()) {
            // Mapper를 가져옵니다
            ItemMapper itemMapper = session.getMapper(ItemMapper.class);
            
            // findById 쿼리 실행 (결과는 JSONObject로 받음)
            return itemMapper.findById(id);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

이 코드는 MyBatis가 반환하는 데이터를 **JSONObject**로 받아 바로 JSON 형식으로 사용할 수 있게 한다.


 

pom.xml에 필요한 의존성 추가

만약 Jackson이나 org.json을 사용하려면 pom.xml에 의존성을 추가해야 한다.

Jackson 의존성 추가

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>  <!-- 최신 버전 확인 후 적용 -->
</dependency>

org.json 의존성 추가

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20210307</version>
</dependency>

최종 정리

  1. Map<String, Object>로 결과받기
    • 결과를 Map 형태로 받아 JSON처럼 처리
    • ObjectMapper를 사용해 JSON 문자열로 변환 가능
  2. JSONObject로 결과받기
    • org.json.JSONObject로 결과를 직접 JSON 객체 형태로 받기

위 방법 중 하나를 선택하여 JSON 형태로 데이터를 주고받는 코드를 구현할 수 있다.