Programming/Spring Boot

[Mybatis] PostgreSQL ilike 구현하기(feat. Criteria 커스텀하기)

빈쿵바라기 2022. 8. 20. 01:00

Mybatis Generator를 이용하여 만든 Example에는 원하는 연산자가 없을 수 있습니다. Example클래스 내에 Criteria를 커스텀해서 원하는 연산자를 사용하는 방법을 알아보겠습니다.

사실 Generator를 사용하여 만들어지는 Mapperxml등은 mybatis-config.xml에 설정되어 있는대로 만들어지는데, 확실한 방법은 원하는 연산자를 사용할 수 있는 Criteria를 만들어주는 plugin을 구현하 것이 추후에 반복적으로 코딩하지 않아도 될 것입니다.(generator할 때 만든 plugin을 통해서 원하는 메소드를 자동으로 생성 할 수 있기 때문)

그러나 이 포스팅에서는 당장 plugin은 만들기 어렵고, 프로젝트 내에서 간단히 해결하고 싶을 때 어떻게 작업했는지 작성해보고자 합니다. 저는 PostgreSQL에 ilike 메소드를 사용하기 위해서 코드를 작성했습니다.

Example.java

public static class CustomCriteria extends Criteria {
    public Criteria andMemberNameILike(String value) {
        addCriterion("member_name ilike", value, "memberName");
        return (Criteria) this;
    }
}

public CustomCriteria createCustomCriteria() {
    CustomCriteria criteria = new CustomCriteria();
    if(oredCriteria.size() == 0) {
        oredCriteria.add(criteria);
    }
    return criteria;
}

Mybatis Generator를 실행하여 만들어진 파일들 중 커스텀하고자 하는 Example.java 안에 위의 코드를 작성합니다.

Criteria를 상속받은 CustomCriteria 는 우리가 구현하고자 하는 연산자를 호출해주는 메소드를 가지게 됩니다. 예제에서는 member_name 컬럼에 ilike 연산자를 호출할 수 있는 메소드를 구현했습니다. Criteria상속 받았기 때문에 기존에 Criteria에 있는 메소드도 당연히 호출 할 수 있습니다.

그리고, 만든 CustomCriteria를 생성하고, oredCriteria에 추가 해주는 메소드를 작성해줍니다.

 

조회 예제

@Autowired MemberMapper memberMapper;

public List<Member> getMemberList(){

    // Example
    MemberExample example = new MemberExample();
    example.createCustomCriteria() // CustomCriteria 생성
    	.andMemberNameILike("%길동%") // and조건 member_name에 ilike 검색
    	.andMemberAgeGreaterThan(20); // CustomCriteria는 Criteria를 상속 받았기 때문에 Criteria에 있는 메소드도 호출 가능
    // select
    return memberMapper.selectByExample(example);
}

 

OR 조건 구현

public Criteria orCustom() {
    CustomCriteria criteria = new CustomCriteria();
    oredCriteria.add(criteria);
    return criteria;
}

마찬가지로 Exmaple.java 클래스 안에 위의 코드를 작성합니다. 기존의 or() 대신 작성한 orCustom()을 호출하면 위에서 만든 CustomCriteria()로 OR조건 검색이 가능해집니다.

 

OR 조건 사용 예제

@Autowired MemberMapper memberMapper;

public List<Member> getMemberList(){

    // Example
    MemberExample example = new MemberExample();
    example.createCustomCriteria() // CustomCriteria 생성
    	.andMemberAgeGreaterThan(20); // AND 조건 
    // OR 조건
    example.orCustom().andMemberNameILike("%길동%");
    // select
    return memberMapper.selectByExample(example);
}

 

결론

  • Criteria를 상속해서 코드를 구현하면, 새로운 연산자를 자유롭게 사용할 수 있게 됩니다.
  • 기존 Example.java 코드를 수정하지 않고, Criteria를 상속받아서 새로운 CustomCriteria를 만들었기 때문에, 다시 Generator를 하더라도, 구현한 CustomCriteria 코드가 훼손되지 않는 장점이 있습니다.
  • Mybatis Plugin을 구현할 수 있다면, plugin을 구현하는 것이 미래지향적입니다.