MyBatis-Plus 핵심 기능 및 실무 활용 가이드

1. 주요 어노테이션

MyBatis-Plus(이하 MP)는 개발 생산성 향상을 위해 다양한 매핑 어노테이션을 지원합니다.

  • @TableName: 자바 객체와 실제 데이터베이스 테이블 간의 이름을 매핑합니다.
  • @TableId: 테이블의 기본 키(PK)를 지정하며, 자동 증가 등 생성 전략을 설정할 수 있습니다.
  • @TableField: 객체의 필드와 DB 컬럼명이 다를 경우 매핑 정보를 정의합니다.
  • @Version: 낙관적 락(Optimistic Lock)을 구현하여 데이터 충돌을 방지합니다.
  • @TableLogic: 물리 삭제 대신 논리 삭제(Soft Delete)를 수행할 필드를 지정합니다.

2. 조건 빌더(Wrapper) 활용

SQL 쿼리를 코드 수준에서 동적으로 생성하는 Wrapper 클래스를 활용하면 복잡한 쿼리를 간결하게 작성할 수 있습니다.

// 람다 식을 사용하여 타입 안전하게 쿼리 작성
LambdaQueryWrapper<Member> wrapper = new LambdaQueryWrapper<Member>();
wrapper.eq(Member::getStatus, 1)
       .like(Member::getName, "김철수")
       .ge(Member::getJoinDate, LocalDate.of(2023, 1, 1));
List<Member> list = memberMapper.selectList(wrapper);

3. IService 인터페이스 구조

비즈니스 로직 계층에서 IService<T>를 상속받으면 기본적인 CRUD 기능을 별도의 구현 없이 바로 사용할 수 있습니다.

public interface MemberService extends IService<Member> {
    // 필요 시 비즈니스 로직 확장
    void processRegistration(Member member);
}

@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
    @Override
    public void processRegistration(Member member) {
        save(member); // IService에서 제공하는 기본 메서드 사용
    }
}

4. 커스텀 SQL 작성

복잡한 집계 쿼리나 특정 요구사항은 XML이나 어노테이션을 통해 직접 SQL을 정의할 수 있습니다.

@Mapper
public interface MemberMapper extends BaseMapper<Member> {
    @Select("SELECT * FROM member WHERE grade = #{grade}")
    List<Member> findByGrade(@Param("grade") String grade);
}

5. 논리 삭제 처리

데이터를 실제로 삭제하지 않고 특정 플래그 값만 변경하여 비활성화하는 방식입니다.

// 엔티티 필드에 적용
@TableLogic
private Integer isDeleted;

// 설정 파일(yml)에 상태값 명시
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

6. 페이징 처리

MyBatis-Plus는 별도의 복잡한 계산 없이 페이징 객체를 통해 쿼리 결과를 자동 페이징합니다.

// 서비스 레이어
public IPage<Member> getPageList(int page, int size) {
    Page<Member> pageParams = new Page<>(page, size);
    return memberMapper.selectPage(pageParams, null);
}

태그: MyBatis-Plus java spring-boot ORM SQL

6월 25일 22:46에 게시됨