Skip to content

feat: 페이징 라벨을 MessageSource 로 가져오는 MessageSourcePaginationRenderer 추가 - #427

Merged
jei007 merged 1 commit into
eGovFramework:mainfrom
comghost:feat/ptl-mvc-pagination-message-source
Sep 14, 2026
Merged

jei007 merged 1 commit into
eGovFramework:mainfrom
comghost:feat/ptl-mvc-pagination-message-source

Conversation

@comghost

Copy link
Copy Markdown
Contributor

수정 사유 Reason for modification

  • 버그수정 Bug fixes
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

배경

페이징 렌더러의 [처음]/[이전]/[다음]/[마지막] 라벨은 DefaultPaginationRenderer 생성자에 한국어로 고정되어 있어
다국어 화면에서 로케일(Locale)에 맞게 바꿀 수 없습니다. 라벨 템플릿을 바꾸려면 렌더러를 상속해 protected 필드를 덮어써야
하고, 렌더러는 싱글톤 빈이라 요청마다 라벨을 바꾸는 방식은 스레드 안전하지 않습니다.

변경한 것

1. pagination/MessageSourcePaginationRenderer 신규AbstractPaginationRenderer + MessageSourceAware

항목 내용
라벨 조회 요청 로케일(LocaleContextHolder) 기준으로 MessageSource 에서 pagination.link.first / .previous / .next / .last 를 가져온다
폴백 메시지가 없거나 MessageSource 가 주입되지 않으면 기존 한국어 라벨과 같은 결과
안전 라벨 문구의 작은따옴표·중괄호는 MessageFormat 에 안전하게 이스케이프. 라벨은 렌더링 시점의 지역 변수로만 다룬다
<bean id="imageRenderer" class="org.egovframe.rte.ptl.mvc.tags.ui.pagination.MessageSourcePaginationRenderer"/>
# messages_en.properties
pagination.link.first=First
pagination.link.previous=Prev
pagination.link.next=Next
pagination.link.last=Last

2. AbstractPaginationRenderer — 라벨 setter 6종 + protected doRender(...)

renderPagination() 은 이제 필드 6개를 넘겨 doRender() 를 호출합니다. 출력은 그대로이며, 로케일마다 라벨이 달라지는
렌더러가 공유 필드를 바꾸지 않고 렌더링할 수 있는 지점입니다. setter 는 XML 설정으로 기존 렌더러의 라벨 템플릿을 바꿀 수
있게 합니다(상속 불필요).

호환성

  • 기존 렌더러의 출력은 동일합니다. 한국어 로케일에서 새 렌더러의 출력이 DefaultPaginationRenderer 와 완전히 같음을
    테스트로 확인했습니다.
  • renderPagination() 을 오버라이드한 하위 클래스가 있어도 그 오버라이드가 그대로 적용됩니다.
  • AbstractKrdsPaginationRenderer 는 별개 계층(PaginationRenderer 직접 구현)이라 건드리지 않았습니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

MessageSourcePaginationRendererTest 6건 신규, ptl.mvc 모듈 전건 통과.

환경 기본 로케일 모듈 실행 건수 결과
Windows ko_KR 48 Tests run: 48, Failures: 0, Errors: 0, Skipped: 0
Linux (Ubuntu 22.04 / OpenJDK 17) C.UTF-8 48 Tests run: 48, Failures: 0, Errors: 0, Skipped: 0
구분 건수 내용
로케일 조회 1 영어 로케일에서 First/Prev/Next/Last 로 렌더링, 한국어 라벨 없음, 페이지 이동 호출·현재 페이지 표시 유지
동일성 1 한국어 로케일 출력이 DefaultPaginationRenderer 와 완전히 같다
폴백 2 메시지 없는 로케일은 한국어 라벨 · MessageSource 없이도 동작
이스케이프 1 Suivant {1} d'accord 같은 라벨이 그대로 렌더링된다
setter 1 DefaultPaginationRenderer 의 라벨 템플릿을 setter 로 교체

수동 확인: 현재 main(cc2b332) 위에서 ptl.mvc 모듈 빌드·테스트가 통과함을 Windows 와 Linux 에서 확인했습니다.

테스트 브라우저 Test Browser

  • Chrome
  • Firefox
  • Edge
  • Safari
  • Opera
  • Internet Explorer
  • 기타 Others

해당 없음 — 렌더링 결과 문자열은 JUnit 으로 검증했습니다.

테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video

해당 없음 — 위 JUnit 테스트 결과로 갈음합니다.


base: eGovFramework:main @ cc2b332 (2026-09-10 fetch 기준, #366~#379 머지 후) · 단일 커밋

페이징 렌더러의 [처음]/[이전]/[다음]/[마지막] 라벨은 렌더러 생성자에 한국어로
고정되어 있어 다국어 화면에서 로케일에 맞게 바꿀 수 없고, 라벨 템플릿을 바꾸려면
렌더러를 상속해 protected 필드를 덮어써야 한다.

- MessageSourcePaginationRenderer(MessageSourceAware): 요청 로케일 기준으로
  MessageSource 에서 pagination.link.first/previous/next/last 를 가져와 렌더링한다.
  메시지가 없거나 MessageSource 가 없으면 기존 한국어 라벨과 같은 결과를 낸다.
  라벨 문구의 작은따옴표·중괄호는 MessageFormat 에 안전하게 이스케이프한다
- AbstractPaginationRenderer: 라벨 6종 setter 와 라벨을 파라미터로 받는
  protected doRender() 를 추가했다. renderPagination() 은 필드로 doRender() 를
  호출하므로 기존 렌더러의 출력은 그대로다. 로케일마다 라벨이 달라지는 렌더러가
  공유 필드를 바꾸지 않고(스레드 안전) 렌더링할 수 있다

MessageSourcePaginationRendererTest 6건 추가 — 영어 로케일 라벨 조회, 한국어
로케일 출력이 DefaultPaginationRenderer 와 동일, 메시지 없을 때 폴백,
MessageSource 없이 동작, 특수문자 라벨의 리터럴 렌더링, setter 로 라벨 교체.

@jei007 jei007 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

표준프레임워크에 대한 지속적인 참여에
대단히 감사드립니다.

@jei007
jei007 merged commit 4df0c5c into eGovFramework:main Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants