From bf7e18ec33dbe7189be752b12bd118b7995887ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=B0=B1=ED=96=89?= Date: Tue, 23 Jun 2026 08:57:08 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20SampleMapper=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=98=88=EC=99=B8(throws=20Exception)=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/service/impl/SampleMapper.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java b/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java index dd16c9d..2f2fc4e 100644 --- a/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java +++ b/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java @@ -33,6 +33,7 @@ * 수정일 수정자 수정내용 * ---------------- ------------ --------------------------- * 2014.01.24 표준프레임워크센터 최초 생성 + * 2026.06.23 이백행 [2026년 컨트리뷰션] 불필요한 예외(throws Exception) 제거 * * */ @@ -43,47 +44,41 @@ public interface SampleMapper { * 글을 등록한다. * @param vo - 등록할 정보가 담긴 SampleVO * @return 등록 결과 - * @exception Exception */ - void insertSample(SampleVO vo) throws Exception; + void insertSample(SampleVO vo); /** * 글을 수정한다. * @param vo - 수정할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ - void updateSample(SampleVO vo) throws Exception; + void updateSample(SampleVO vo); /** * 글을 삭제한다. * @param vo - 삭제할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ - void deleteSample(SampleVO vo) throws Exception; + void deleteSample(SampleVO vo); /** * 글을 조회한다. * @param vo - 조회할 정보가 담긴 SampleVO * @return 조회한 글 - * @exception Exception */ - SampleVO selectSample(SampleVO vo) throws Exception; + SampleVO selectSample(SampleVO vo); /** * 글 목록을 조회한다. * @param vo - 조회할 정보가 담긴 VO * @return 글 목록 - * @exception Exception */ - List selectSampleList(SampleVO vo) throws Exception; + List selectSampleList(SampleVO vo); /** * 글 총 갯수를 조회한다. * @param vo - 조회할 정보가 담긴 VO * @return 글 총 갯수 - * @exception */ int selectSampleListTotCnt(SampleVO vo); From 7b5910c9f9d8954610a2a560cfa9fd0ce457defa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=B0=B1=ED=96=89?= Date: Tue, 23 Jun 2026 12:45:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=8C=20=EC=A0=9C=EB=AA=A9=20(Title)?= =?UTF-8?q?=20[Refactor]=20=EC=83=98=ED=94=8C=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EB=82=B4=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8(throws=20Exception)=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= =?UTF-8?q?=20(=EB=98=90=EB=8A=94=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8?= =?UTF-8?q?=20=EA=B7=9C=EC=B9=99=EC=97=90=20=EB=94=B0=EB=9D=BC)=20[2026=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A6=AC=EB=B7=B0=EC=85=98]=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=98=88=EC=99=B8(throws=20Excep?= =?UTF-8?q?tion)=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 📖 개요 (Description) 전자정부프레임워크 샘플 프로젝트 내에서 관습적으로 사용되던 모호하고 불필요한 throws Exception 선언을 제거하고, 런타임 예외(RuntimeException) 기반의 현대적인 예외 처리 구조로 리팩토링을 진행했습니다. 이 변경을 통해 메서드 시그니처가 간결해지고, 프레젠테이션 레이어와 비즈니스 레이어 간의 예외 전파 구조가 명확해졌습니다. 🛠️ 변경 사항 (Changes) EgovSampleService.java (Interface) 비즈니스 메서드(insertSample, updateSample, deleteSample, selectSample, selectSampleList) 시그니처에서 불필요한 throws Exception 제거 관련 JavaDoc 주석(@exception Exception) 정비 EgovSampleServiceImpl.java (ServiceImpl) 인터페이스 변경에 따른 throws Exception 제거 및 구현부 수정 체크 예외를 발생시키는 ID 생성 서비스(egovIdGnrService.getNextStringId()) 호출부를 try-catch로 감싸 프레임워크 표준 런타임 예외인 BaseRuntimeException으로 전환 데이터 미존재 시 예외 처리를 MessageSource와 LocaleContextHolder를 활용한 런타임 예외 구조로 변경 EgovSampleController.java (Controller) 하위 레이어의 예외 구조 변경에 따라 컨트롤러 메서드 시그니처의 throws Exception 일괄 제거 불필요해진 JavaDoc 주석 정리 및 코드 가독성 향상 🧪 테스트 결과 및 확인 (Test Results) [x] 컴파일 에러 없음 (인터페이스 - 구현체 - 컨트롤러 간 시그니처 일치 확인) [x] 샘플 CRUD 기능 정상 동작 확인 (글 등록, 수정, 조회, 삭제, 페이징 목록 조회) [x] 데이터 미존재 시 정상적으로 예외 메시지 호출 및 다국어(Locale) 처리 검증 💬 추가 사항 (Notes) 본 수정은 2026년 컨트리뷰션 활동의 일환으로 진행되었습니다. 가독성이 떨어지는 구식 예외 선언을 정비함으로써, 샘플 코드를 참고하는 개발자들이 보다 직관적이고 표준적인 Spring/eGovFrame 예외 처리 패턴을 학습하는 데 도움이 될 것으로 기대합니다. --- .../sample/service/EgovSampleService.java | 17 +++----- .../service/impl/EgovSampleServiceImpl.java | 39 ++++++++++++------- .../sample/web/EgovSampleController.java | 19 ++++----- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/main/java/egovframework/example/sample/service/EgovSampleService.java b/src/main/java/egovframework/example/sample/service/EgovSampleService.java index 079ea71..4d94be1 100644 --- a/src/main/java/egovframework/example/sample/service/EgovSampleService.java +++ b/src/main/java/egovframework/example/sample/service/EgovSampleService.java @@ -25,6 +25,7 @@ * @ 수정일 수정자 수정내용 * @ --------- --------- ------------------------------- * @ 2009.03.16 최초생성 + * @ 2026.06.23 이백행 [2026년 컨트리뷰션] 불필요한 예외(throws Exception) 제거 * * @author 개발프레임웍크 실행환경 개발팀 * @since 2009. 03.16 @@ -39,47 +40,41 @@ public interface EgovSampleService { * 글을 등록한다. * @param vo - 등록할 정보가 담긴 SampleVO * @return 등록 결과 - * @exception Exception */ - void insertSample(SampleVO vo) throws Exception; + void insertSample(SampleVO vo); /** * 글을 수정한다. * @param vo - 수정할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ - void updateSample(SampleVO vo) throws Exception; + void updateSample(SampleVO vo); /** * 글을 삭제한다. * @param vo - 삭제할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ - void deleteSample(SampleVO vo) throws Exception; + void deleteSample(SampleVO vo); /** * 글을 조회한다. * @param vo - 조회할 정보가 담긴 SampleVO * @return 조회한 글 - * @exception Exception */ - SampleVO selectSample(SampleVO vo) throws Exception; + SampleVO selectSample(SampleVO vo); /** * 글 목록을 조회한다. * @param searchVO - 조회할 정보가 담긴 VO * @return 글 목록 - * @exception Exception */ - List selectSampleList(SampleVO vo) throws Exception; + List selectSampleList(SampleVO vo); /** * 글 총 갯수를 조회한다. * @param searchVO - 조회할 정보가 담긴 VO * @return 글 총 갯수 - * @exception */ int selectSampleListTotCnt(SampleVO vo); diff --git a/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java b/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java index 996e783..d0cfb54 100644 --- a/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java +++ b/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java @@ -18,14 +18,20 @@ import java.util.List; import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.egovframe.rte.fdl.cmmn.exception.BaseRuntimeException; +import org.egovframe.rte.fdl.cmmn.exception.EgovBizException; +import org.egovframe.rte.fdl.cmmn.exception.FdlException; import org.egovframe.rte.fdl.idgnr.EgovIdGnrService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import egovframework.example.sample.service.EgovSampleService; import egovframework.example.sample.service.SampleVO; import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; /** * @Class Name : EgovSampleServiceImpl.java @@ -35,6 +41,7 @@ * @ 수정일 수정자 수정내용 * @ --------- --------- ------------------------------- * @ 2009.03.16 최초생성 + * @ 2026.06.23 이백행 [2026년 컨트리뷰션] 불필요한 예외(throws Exception) 제거 * * @author 개발프레임웍크 실행환경 개발팀 * @since 2009. 03.16 @@ -45,6 +52,7 @@ */ @Service("sampleService") +@RequiredArgsConstructor public class EgovSampleServiceImpl extends EgovAbstractServiceImpl implements EgovSampleService { private static final Logger LOGGER = LoggerFactory.getLogger(EgovSampleServiceImpl.class); @@ -57,18 +65,24 @@ public class EgovSampleServiceImpl extends EgovAbstractServiceImpl implements Eg @Resource(name = "egovIdGnrService") private EgovIdGnrService egovIdGnrService; + private final MessageSource messageSource; + /** * 글을 등록한다. * @param vo - 등록할 정보가 담긴 SampleVO * @return 등록 결과 - * @exception Exception */ @Override - public void insertSample(SampleVO vo) throws Exception { + public void insertSample(SampleVO vo) { LOGGER.debug(vo.toString()); /** ID Generation Service */ - String id = egovIdGnrService.getNextStringId(); + String id; + try { + id = egovIdGnrService.getNextStringId(); + } catch (FdlException e) { + throw new BaseRuntimeException(e); + } vo.setId(id); LOGGER.debug(vo.toString()); @@ -79,10 +93,9 @@ public void insertSample(SampleVO vo) throws Exception { * 글을 수정한다. * @param vo - 수정할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ @Override - public void updateSample(SampleVO vo) throws Exception { + public void updateSample(SampleVO vo) { sampleMapper.updateSample(vo); } @@ -90,10 +103,9 @@ public void updateSample(SampleVO vo) throws Exception { * 글을 삭제한다. * @param vo - 삭제할 정보가 담긴 SampleVO * @return void형 - * @exception Exception */ @Override - public void deleteSample(SampleVO vo) throws Exception { + public void deleteSample(SampleVO vo) { sampleMapper.deleteSample(vo); } @@ -101,13 +113,14 @@ public void deleteSample(SampleVO vo) throws Exception { * 글을 조회한다. * @param vo - 조회할 정보가 담긴 SampleVO * @return 조회한 글 - * @exception Exception + * @throws Exception */ @Override - public SampleVO selectSample(SampleVO vo) throws Exception { + public SampleVO selectSample(SampleVO vo) { SampleVO resultVO = sampleMapper.selectSample(vo); - if (resultVO == null) - throw processException("info.nodata.msg"); + if (resultVO == null) { + throw new BaseRuntimeException(messageSource.getMessage("info.nodata.msg", null, null, LocaleContextHolder.getLocale())); + } return resultVO; } @@ -115,10 +128,9 @@ public SampleVO selectSample(SampleVO vo) throws Exception { * 글 목록을 조회한다. * @param vo - 조회할 정보가 담긴 VO * @return 글 목록 - * @exception Exception */ @Override - public List selectSampleList(SampleVO vo) throws Exception { + public List selectSampleList(SampleVO vo) { return sampleMapper.selectSampleList(vo); } @@ -126,7 +138,6 @@ public List selectSampleList(SampleVO vo) throws Exception { * 글 총 갯수를 조회한다. * @param vo - 조회할 정보가 담긴 VO * @return 글 총 갯수 - * @exception */ @Override public int selectSampleListTotCnt(SampleVO vo) { diff --git a/src/main/java/egovframework/example/sample/web/EgovSampleController.java b/src/main/java/egovframework/example/sample/web/EgovSampleController.java index fb2d8cd..8f528b2 100644 --- a/src/main/java/egovframework/example/sample/web/EgovSampleController.java +++ b/src/main/java/egovframework/example/sample/web/EgovSampleController.java @@ -43,6 +43,7 @@ * @ 수정일 수정자 수정내용 * @ --------- --------- ------------------------------- * @ 2009.03.16 최초생성 + * @ 2026.06.23 이백행 [2026년 컨트리뷰션] 불필요한 예외(throws Exception) 제거 * * @author 개발프레임웍크 실행환경 개발팀 * @since 2009. 03.16 @@ -69,10 +70,9 @@ public class EgovSampleController { * @param sampleVO - 조회할 정보가 담긴 SampleDefaultVO * @param model * @return "egovSampleList" - * @exception Exception */ @GetMapping("/egovSampleList.do") - public String selectSampleList(@ModelAttribute("sampleVO") SampleVO sampleVO, ModelMap model) throws Exception { + public String selectSampleList(@ModelAttribute("sampleVO") SampleVO sampleVO, ModelMap model) { /** EgovPropertyService.sample */ sampleVO.setPageUnit(propertiesService.getInt("pageUnit")); @@ -107,10 +107,9 @@ public String selectSampleList(@ModelAttribute("sampleVO") SampleVO sampleVO, Mo * @param sampleVO - 목록 조회조건 정보가 담긴 VO * @param model * @return "egovSampleRegister" - * @exception Exception */ @PostMapping("/addSampleView.do") - public String addSampleView( @ModelAttribute("sampleVO") SampleVO sampleVO, Model model) throws Exception { + public String addSampleView( @ModelAttribute("sampleVO") SampleVO sampleVO, Model model) { model.addAttribute("sampleVO", sampleVO); @@ -122,10 +121,9 @@ public String addSampleView( @ModelAttribute("sampleVO") SampleVO sampleVO, Mode * @param sampleVO - 등록할 정보가 담긴 VO * @param status * @return "forward:/egovSampleList.do" - * @exception Exception */ @PostMapping("/addSample.do") - public String addSample(@Valid @ModelAttribute("sampleVO") SampleVO sampleVO, BindingResult bindingResult, Model model, SessionStatus status) throws Exception { + public String addSample(@Valid @ModelAttribute("sampleVO") SampleVO sampleVO, BindingResult bindingResult, Model model, SessionStatus status) { if (bindingResult.hasErrors()) { model.addAttribute("sampleVO", sampleVO); @@ -143,10 +141,9 @@ public String addSample(@Valid @ModelAttribute("sampleVO") SampleVO sampleVO, Bi * @param id - 수정할 글 id * @param model * @return "egovSampleRegister" - * @exception Exception */ @PostMapping("/updateSampleView.do") - public String updateSampleView(@ModelAttribute("sampleVO") SampleVO sampleVO, Model model) throws Exception { + public String updateSampleView(@ModelAttribute("sampleVO") SampleVO sampleVO, Model model) { SampleVO detail = sampleService.selectSample(sampleVO); detail.setSearchCondition(sampleVO.getSearchCondition()); @@ -163,11 +160,10 @@ public String updateSampleView(@ModelAttribute("sampleVO") SampleVO sampleVO, Mo * @param sampleVO - 수정할 정보가 담긴 VO * @param status * @return "forward:/egovSampleList.do" - * @exception Exception */ @PostMapping("/updateSample.do") public String updateSample(@Valid @ModelAttribute("sampleVO") SampleVO sampleVO, BindingResult bindingResult, - Model model, RedirectAttributes redirectAttributes, SessionStatus status) throws Exception { + Model model, RedirectAttributes redirectAttributes, SessionStatus status) { if (bindingResult.hasErrors()) { model.addAttribute("sampleVO", sampleVO); @@ -189,10 +185,9 @@ public String updateSample(@Valid @ModelAttribute("sampleVO") SampleVO sampleVO, * @param sampleVO - 삭제할 정보가 담긴 VO * @param status * @return "forward:/egovSampleList.do" - * @exception Exception */ @PostMapping("/deleteSample.do") - public String deleteSample(@ModelAttribute("sampleVO") SampleVO sampleVO, RedirectAttributes redirectAttributes, SessionStatus status) throws Exception { + public String deleteSample(@ModelAttribute("sampleVO") SampleVO sampleVO, RedirectAttributes redirectAttributes, SessionStatus status) { sampleService.deleteSample(sampleVO); status.setComplete();