DB/Database

[MyBatis] getter 메소드 자동 사용(?)

Nellie Kim 2024. 1. 16. 16:24
728x90

 

Dto의 getter 메소드는 sql 문에서 사용될 수 있을까???

 

<!--  커뮤니티 목록 조회-->
    <select id="getList" parameterType="kr.co.example.project.memberApi.community.dto.CommunityDto"
            resultType="kr.co.example.project.memberApi.community.dto.CommunityDto">
        SELECT
        c.idx,
        c.member_idx,
        c.title,
        c.contents,
        c.crte_dt,
        c.del_yn
        FROM tb_community c
        <where>
            c.del_yn = 'N'
            <if test="keyword != null and keyword != ''">
                AND c.title LIKE '%${keyword}%'
            </if>
        </where>
        ORDER BY crte_dt DESC
        <if test="pSize != null and pSize != 0">
            LIMIT #{pSize} OFFSET #{pIndex}
        </if>
    </select>

 

이전 쿼리를 보며 새로운 쿼리를 작성하던 중 궁금증이 생겼다.

 

LIMIT #{pSize} OFFSET #{pIndex}

 

이 부분이다. 

 

 

포스트맨 요청은 이렇게 pSize, pNum 이렇게 넣어서 조회를 한다. 그런데, 쿼리에서는 ${pNum}이 아닌 ${pIndex}로 조회하고 있었다. 

 

Dto 는 아래와 같다. 

@Data
public class CommunityDto  extends BaseDto {
    private Integer idx;
    private Integer memberIdx;
    private String title;
    private String contents;
    private LocalDate crteDt;
    private String delYN;
}

 

@JsonInclude(JsonInclude.Include.NON_NULL)
public class BaseDto {

    // 페이지번호
    @JsonProperty("pNum")
    public Integer pNum;

    // 페이지크기
    @JsonProperty("pSize")
    public Integer pSize;

    // 페이지인덱스
    @JsonProperty("pIndex")
    public Integer pIndex;

    @JsonProperty("keyword")
    public String keyword;

    /**
     * ==== Getter / Setter ====
     */
    public Integer getpNum() {

        return pNum;
    }

    public void setpNum(Integer pNum) {
        this.pNum = pNum;
    }

    public Integer getpSize() {

        return pSize;
    }

    public void setpSize(Integer pSize) {
        this.pSize = pSize;
    }

 // 이 메서드는 쓰지를 않는데 ????
    public Integer getpIndex() {
        if (this.pNum != null && this.pSize != null) {
            return (this.pNum - 1) * this.pSize;
        }
        else
            return this.pIndex;
    }

    public void setpIndex(Integer pIndex) {
        this.pIndex = pIndex;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }
}

 

 

어떻게 pNum을 쿼리스트링으로 넣어주는데 pIndex로 자동 변환이 되어 조회를 해주는 걸까?

 

 

심지어 Dto에서는 getpIndex() 메서드는 사용하지를 않아서 아래와 같이 떴다. 뭐지? 얘 왜 필요한거지?

 


 

마이바티스는 ${pIndex} 이렇게 들어오면, Dto의 getter를 자동으로 찾아서 대입해준다고 한다.

 

실제로 getter 메서드를 주석처리하고 실행시켜보았다.

BadSqlGrammarException, SQLSyntaxErrorException 에러가 났다. 

 

 

이렇게 게터를 사용해서 대입이 되는 것은 몰랐는데 신기하다. 

마이바티스 공부를 제대로 해야겠다 .. ㅠ

 

추후에 이렇게 동작하는 원리를 자세히 알아보도록 해야겠다.