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);
}