Develop

[Error] mapper에서 getter, setter 메서드 호출 오류 본문

웹 개발/Error

[Error] mapper에서 getter, setter 메서드 호출 오류

개발 기록 2024. 3. 9. 23:19

 

spring legacy를 사용할 때는 mapper에서 sql을 작성할 때 #{변수명} 을 하면

해당 변수의 getter나 setter 함수를 불러온다고 배웠다.

 

그러나 spirng boot의 mapper에서 똑같이 sql을 작성했는데 

해당 값을 찾지 못하는 오류가 발생했다

= get 매서드 호출을 못함

 

결론부터 말하자면 spring boot에서는 변수가 없으면 불러오지 못하는것 같다.

 


 

mapper

<!-- 전체 글 목록 -->
<select id="noticeList" parameterType="CriVO" resultType="noticeVO">
    SELECT /* noticeList */
        NO_NUM,
        NO_TITLE
    FROM 
        NOTICE
    WHERE  
        NO_STATE = "upload"
    ORDER BY
        NO_NUM DESC
    LIMIT
        #{pageStart},#{pageSize} 
</select>

 

LIMIT 뒷부분에 적힌 #{pageStart} 값이 없어서 sql 실행시 오류가 나는 문제였다.

 

pageStart는  페이징처리를 위한 값으로 Criteria 라는 VO 파일에 정의해놓은 매서드이다.

 

Criteria

package com.example.demo.domain;

import org.apache.ibatis.type.Alias;

import lombok.Data;

/**
 * 페이징 처리를 계산하는 기준들
 */
@Data
@Alias("CriVO")
public class Criteria{
	
	private int page;
	private int pageSize; // 한페이지에 표시되는 리스트 개수
	private String keyword;
	
	// 기본 설정
	public Criteria() {
		this.page = 1;
		this.pageSize = 5;
	}
	
	// 
	public void setPage(int page) {
		if(page <= 0) {
			this.page = 1;
			return;
		}
		this.page = page;
	}
	
	// 
	public void setPageSize(int pageSize) {
		if(pageSize <= 0 || pageSize > 100) {
			this.pageSize = 10;
			return;
		}
		this.pageSize = pageSize;
	}
	
	// 변수를 저장하기위한 목적X
	// mapper에서 호출되는 메서드 #{pageStart }를 호출함
	public int getPageStart() {
		return this.page -1 * pageSize;
	}

}

 

 

코드를 보면 pageStart라는 변수는 존재하지 않고

아래와 같이 매서드만 존재한다.

public int getPageStart() {
    return this.page -1 * pageSize;
}

 

 


 

계속 오류가 나서 그냥 변수를 만들어주었다.

 

수정한 Criteria

package com.example.demo.domain;

import org.apache.ibatis.type.Alias;

import lombok.Data;

/**
 * 페이징 처리를 계산하는 기준들
 */
@Data
@Alias("CriVO")
public class Criteria{
	
	private int page;
	private int pageSize; // 한페이지에 표시되는 리스트 개수
	private String keyword;
	private int pageStart; // 현재 페이지에서 시작되는 페이지의 숫자 
	
	// 기본 설정
	public Criteria() {
		this.page = 1;
		this.pageSize = 5;
	}
	
	// 
	public void setPage(int page) {
		if(page <= 0) {
			this.page = 1;
			return;
		}
		this.page = page;
	}
	
	// 
	public void setPageSize(int pageSize) {
		if(pageSize <= 0 || pageSize > 100) {
			this.pageSize = 10;
			return;
		}
		this.pageSize = pageSize;
	}
	
	// mapper에서 호출되는 메서드 #{pageStart }를 호출함
	public int getPageStart() {
		this.pageStart = (this.page -1 ) * pageSize;
		return pageStart;
	}

}

 

코드를 보면 변수를 정의하는 위쪽에

private int pageStart; // 현재 페이지에서 시작되는 페이지의 숫자

 

pageStart를 정의해 주었고

getPageStart() 메서드도 조금 수정해주었다

// mapper에서 호출되는 메서드 #{pageStart }를 호출함
public int getPageStart() {
    this.pageStart = (this.page -1 ) * pageSize;
    return pageStart;
}

 

그냥 pageStart의 값을 불러오는 것이 아니기 때문에 변수를 추가했다고 매서드를 지워버리면 안된다.

 


 

상사의 조언으로 디컴파일도 해보았는데 왜 불러오지 않는지 이유는 알 수 없었다.....

 

 

 

디컴파일을 위해 JdGUI라는 프로그램을 사용하였다.

 

 target 에 있는 class 파일을 열기만 하면 된다.

JdGUI.zip
1.98MB