🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

Mybatis 사용해보기

서화 2026. 2. 9. 22:53

✔️ORM의 개념

객체 관계형 매핑 ? 객체와 DB의 테이블을 Mapping 시켜서 관계짓는 것으로, RDB(관계형 데이터 베이스)의 데이터를 다루는 하나의 기술로 데이터베이스 작업을 객체지향적인 방식으로 활용할 수 있다

객체지향적 방식을 활용한다는 것은 코드의 유지보수, 확장성 면에서 유리하다는 의미로 Java에서 사용하는 대표적인 ORM으로 JPA(Java Persistent API)와 구현체 Hiberante가 있다

✔️mybatis란 

자바에서 SQL Mapper를 지원해주는 프레임워크로 모델 파트에서 응집도를 높이고 결합도를 낮추는 방향이다

✔️mybatis 사용설정하기

마이바티스를 사용해볼 클래스를 하나 만든다 코드는 그 전에 사용했던 plusboardDAO를 가져온다

@Repository를 plusboardDAO에서 마이바티스DAO로 옮긴뒤 서비스에도 마이바티스DAO로 바꿔준다

public class MybatisBoardDAO {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	private static final String SELECT_ALL = "SELECT * FROM BOARD ORDER BY BID DESC";
	private static final String SELECT_ONE = "SELECT * FROM BOARD WHERE BID=?";

	private static final String INSERT = "INSERT INTO BOARD(TITLE,WRITER,CONTENT) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE BOARD SET CNT=CNT+1 WHERE BID=?";
	private static final String DELETE = "DELETE FROM BOARD WHERE BID=?";

	public boolean insertBoard(BoardDTO dto) {
		if(jdbcTemplate.update(INSERT, dto.getTitle(), dto.getWriter(), dto.getContent()) <= 0) {
			return false;
		}
		return true;
	}
	public boolean updateBoard(BoardDTO dto) {
		if(jdbcTemplate.update(UPDATE, dto.getBid()) <= 0) {
			return false;
		}
		return true;
	}

현재 구조의 문제점은 자바개발자가 SQL문을 반드시 알아야한다 즉 SQL문이 자바에 끼어있는 형태로 두가지 언어가 혼합되있다는 문제가 있다

따라서 마이바티스를 사용하기 위해 jdbc템플릿 대신 sqlSession을 사용해 의존성을 추가해준다

 jdbc템플릿에서 쓰던 매퍼도 마이바티스에서는 사용하지 않는다

@Repository
public class MybatisBoardDAO {
	@Autowired
	private SqlSession sqlSession; //마이바티스는 sqlsession을 사용한다

설정후 임포트를 실행하면

import org.apache.ibatis.session.SqlSession;

이렇게 아이바티스라는 이름으로 임포트 되는데 이 아이바티스는 마이바티스의 옛 회사 이름으로 크게 신경쓰지 않아도 된다

sqlSession은 인터페이스이고 폼.xml에 의존성을 추가해야 사용할수있다

      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>3.0.3</version>
      </dependency>

✔️mybatis 사용해보기

위사진은 마이바티스를 적용하기 위한 문법이다 sql세션에 crud중 해야할 행동을 적고 어떤 SQL문을 사용할지와 사용할 DTO를 적는다

셀렉트올은 파라미터가 없기때문에 sql세션 사용시 sql문에 파라미터가 없다면 인자를 적지 않아도 된다

위 사진은 멤버DAO가 어떤 SQL문을 실행할지 그리고 DTO를 설정해주었다

여기서 이 멤버를 제일 위로 올려 네임스페이스라는 이름으로 공유자원을 만들어준다

파일을 열었을때 제일 먼저보이는 곳으로 어떤 네임스페이스를 사용하는지 알수잇다는 장점이 있다

//네임스페이스 공유자원으로 지정
private static final String NAMESPACE = "BOARD.";


public boolean insertBoard(BoardDTO dto) {
		if(sqlSession.insert(NAMESPACE+"insert",dto) <= 0) {
        //실행할 SQL문과 해당DTO를 설정해준다
			return false;
		}
		return true;
	}

삭제한 SQL문을 사용할 설정을 해줘야한다 설정은 .xml에서 해줄수있다 리소스에 매퍼라는 폴더를 만들어서

xml파일을 만들어준다 스키마를 맞춰주고 루트태그,루트엘리먼트가 <mapper>이고 여기에 SQL문을 설정해준다

crud에 맞는 태그를 생성하면 기본적으로 id가 나오는데 이것을 필수속성이라고 한다

<mapper namespace="board">

<insert id = "insert" parameterType="boardDTO"> // 필수속성과 인자타입 지정
INSERT INTO BOARD // 사용할 SQL문 
VALUES(#{title},#{writer},#{content}) //? 로 받던 파라미터 자바의 값으로 변경
</insert>

</mapper>

기존 DAO에서 사용한 SQL문에서는 인자를 ? 를 사용하여 파라미터로 받았었는데 xml설정으로 가게되면 자바에서 사용할수 있는 값으로 바꿔주어야하는데 #{title} 처럼 값을 지정해줄수 있다 가독성을 위해 SQL 문은 대문자를 유지한다

<select id="getOne" parameterType="boardDTO" resultType="boardDTO">
//인자타입과 반환 타입을 설정한다
SELECT * FROM BOARD WHERE BID = #{bid} 
</select>

셀렉트의 경우 반환값이 있어서 반환값도 같이 설정해주어야한다

xml 설정을 마쳤으면 이제 사용을 위해 스프링에 설정해줘야한다

mybatis.mapper-locations=classpath:mappers/*.xml //mybatis매퍼의 위치를 알려줌
mybatis.type-aliases-package=com.example.biz // 사용할 DTO가 있는 위치에 별칭설정하기

마이바티스를 사용할 위치와 별칭을 설정한다

@Alias("boardDTO")// 마이바티스 사용을 위한 별칭설정
public class BoardDTO {

사용할 DTO에 어노테이션을 사용하여 별칭을 설정해준다

📌주의사항

마이바티스 sql세션 사용시 스프링부트의 버전이 3. 대여야 문제없이 사용가능하다

<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>3.2.2</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

3.대로 낮추면 스프링webmvc에 빨간줄이 생기는데 이때 mvc를 제거하면 빨간줄이 사라진다

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>