From abdec09d7deb53147d5183c7e8cc3c999a104dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=B0=B1=ED=96=89?= Date: Fri, 11 Sep 2026 23:15:32 +0900 Subject: [PATCH] =?UTF-8?q?refactor(sample)!:=20CRUD=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20=EA=B3=84=EC=95=BD=EA=B3=BC=20=ED=8E=98=EC=9D=B4=EC=A7=95=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20MyBatis=20=EB=A7=A4=ED=95=91?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 등록·수정·삭제 시 매퍼의 처리 건수를 서비스에서 반환하고 컨트롤러에서 결과를 디버그 로그로 기록한다. 목록 조회 결과를 List로 통일하고 밑줄 컬럼명을 camelCase 속성에 자동 매핑한다. pageUnit과 pageSize를 nullable Integer로 변경하여 요청값이 없을 때만 설정의 기본값을 적용한다. 목록·건수 조회의 검색 SQL을 공통화하고 불필요한 ID 갱신을 제거한다. SQL 기본 제한 시간을 3초, 목록 조회 제한 시간을 30초로 설정한다. 서비스 빈의 명시적 이름을 제거하고 관련 테스트를 변경된 계약에 맞춘다. BREAKING CHANGE: CRUD 반환 타입을 void에서 int로, 목록 요소를 EgovMap에서 SampleVO로 변경한다. pageUnit과 pageSize는 int 기본값 10에서 Integer 기본값 null로 변경되며 서비스 빈 이름은 sampleService에서 egovSampleServiceImpl로 변경된다. --- .../sample/service/EgovSampleService.java | 24 ++--- .../sample/service/SampleDefaultVO.java | 4 +- .../service/impl/EgovSampleServiceImpl.java | 46 +++++----- .../sample/service/impl/SampleMapper.java | 24 ++--- .../sample/web/EgovSampleController.java | 24 +++-- .../example/mappers/EgovSample_Sample_SQL.xml | 88 +++++++++---------- .../sqlmap/example/sql-mapper-config.xml | 6 ++ .../sample/service/SampleDefaultVOTest.java | 4 +- .../impl/EgovSampleServiceImplTest.java | 9 +- .../web/EgovSampleControllerTestAddTest.java | 13 ++- .../EgovSampleControllerTestDeleteTest.java | 7 +- .../EgovSampleControllerTestUpdateTest.java | 7 +- 12 files changed, 131 insertions(+), 125 deletions(-) diff --git a/src/main/java/egovframework/example/sample/service/EgovSampleService.java b/src/main/java/egovframework/example/sample/service/EgovSampleService.java index 1c8ce06..474e025 100644 --- a/src/main/java/egovframework/example/sample/service/EgovSampleService.java +++ b/src/main/java/egovframework/example/sample/service/EgovSampleService.java @@ -36,44 +36,44 @@ public interface EgovSampleService { /** * 글을 등록한다. - * @param vo - 등록할 정보가 담긴 SampleVO + * @param sampleVO - 등록할 정보가 담긴 SampleVO * @return 등록 결과 */ - void insertSample(SampleVO vo); + int insertSample(SampleVO sampleVO); /** * 글을 수정한다. - * @param vo - 수정할 정보가 담긴 SampleVO + * @param sampleVO - 수정할 정보가 담긴 SampleVO * @return void형 */ - void updateSample(SampleVO vo); + int updateSample(SampleVO sampleVO); /** * 글을 삭제한다. - * @param vo - 삭제할 정보가 담긴 SampleVO + * @param sampleVO - 삭제할 정보가 담긴 SampleVO * @return void형 */ - void deleteSample(SampleVO vo); + int deleteSample(SampleVO sampleVO); /** * 글을 조회한다. - * @param vo - 조회할 정보가 담긴 SampleVO + * @param sampleVO - 조회할 정보가 담긴 SampleVO * @return 조회한 글 */ - SampleVO selectSample(SampleVO vo); + SampleVO selectSample(SampleVO sampleVO); /** * 글 목록을 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 목록 */ - List selectSampleList(SampleVO vo); + List selectSampleList(SampleVO sampleVO); /** * 글 총 개수를 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 총 개수 */ - int selectSampleListTotCnt(SampleVO vo); + int selectSampleListTotCnt(SampleVO sampleVO); } diff --git a/src/main/java/egovframework/example/sample/service/SampleDefaultVO.java b/src/main/java/egovframework/example/sample/service/SampleDefaultVO.java index 2f171f0..ceac3d6 100644 --- a/src/main/java/egovframework/example/sample/service/SampleDefaultVO.java +++ b/src/main/java/egovframework/example/sample/service/SampleDefaultVO.java @@ -58,10 +58,10 @@ public class SampleDefaultVO implements Serializable { private int pageIndex = 1; /** 페이지개수 */ - private int pageUnit = 10; + private Integer pageUnit; /** 페이지사이즈 */ - private int pageSize = 10; + private Integer pageSize; /** firstIndex */ private int firstIndex = 1; 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 8bdf06d..9d29647 100644 --- a/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java +++ b/src/main/java/egovframework/example/sample/service/impl/EgovSampleServiceImpl.java @@ -46,7 +46,7 @@ * @version 1.0 * @see */ -@Service("sampleService") +@Service @RequiredArgsConstructor @Slf4j public class EgovSampleServiceImpl extends EgovAbstractServiceImpl implements EgovSampleService { @@ -57,54 +57,52 @@ public class EgovSampleServiceImpl extends EgovAbstractServiceImpl implements Eg /** * 글을 등록한다. - * @param vo - 등록할 정보가 담긴 SampleVO + * @param sampleVO - 등록할 정보가 담긴 SampleVO * @return 등록 결과 */ @Override - public void insertSample(SampleVO vo) { - log.debug(vo.toString()); + public int insertSample(SampleVO sampleVO) { + log.debug("id={}", sampleVO.getId()); /** ID Generation Service */ - String id; try { - id = egovIdGnrService.getNextStringId(); + sampleVO.setId(egovIdGnrService.getNextStringId()); } catch (FdlException e) { throw new BaseRuntimeException(e); } - vo.setId(id); - log.debug(vo.toString()); + log.debug("id={}", sampleVO.getId()); - sampleMapper.insertSample(vo); + return sampleMapper.insertSample(sampleVO); } /** * 글을 수정한다. - * @param vo - 수정할 정보가 담긴 SampleVO + * @param sampleVO - 수정할 정보가 담긴 SampleVO * @return void형 */ @Override - public void updateSample(SampleVO vo) { - sampleMapper.updateSample(vo); + public int updateSample(SampleVO sampleVO) { + return sampleMapper.updateSample(sampleVO); } /** * 글을 삭제한다. - * @param vo - 삭제할 정보가 담긴 SampleVO + * @param sampleVO - 삭제할 정보가 담긴 SampleVO * @return void형 */ @Override - public void deleteSample(SampleVO vo) { - sampleMapper.deleteSample(vo); + public int deleteSample(SampleVO sampleVO) { + return sampleMapper.deleteSample(sampleVO); } /** * 글을 조회한다. - * @param vo - 조회할 정보가 담긴 SampleVO + * @param sampleVO - 조회할 정보가 담긴 SampleVO * @return 조회한 글 */ @Override - public SampleVO selectSample(SampleVO vo) { - SampleVO resultVO = sampleMapper.selectSample(vo); + public SampleVO selectSample(SampleVO sampleVO) { + SampleVO resultVO = sampleMapper.selectSample(sampleVO); if (resultVO == null) { throw new BaseRuntimeException(processException("info.nodata.msg")); } @@ -113,22 +111,22 @@ public SampleVO selectSample(SampleVO vo) { /** * 글 목록을 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 목록 */ @Override - public List selectSampleList(SampleVO vo) { - return sampleMapper.selectSampleList(vo); + public List selectSampleList(SampleVO sampleVO) { + return sampleMapper.selectSampleList(sampleVO); } /** * 글 총 개수를 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 총 개수 */ @Override - public int selectSampleListTotCnt(SampleVO vo) { - return sampleMapper.selectSampleListTotCnt(vo); + public int selectSampleListTotCnt(SampleVO sampleVO) { + return sampleMapper.selectSampleListTotCnt(sampleVO); } } 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 e55c87b..56fa849 100644 --- a/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java +++ b/src/main/java/egovframework/example/sample/service/impl/SampleMapper.java @@ -43,44 +43,44 @@ public interface SampleMapper { /** * 글을 등록한다. - * @param vo - 등록할 정보가 담긴 SampleVO + * @param sampleVO - 등록할 정보가 담긴 SampleVO * @return 등록 결과 */ - void insertSample(SampleVO vo); + int insertSample(SampleVO sampleVO); /** * 글을 수정한다. - * @param vo - 수정할 정보가 담긴 SampleVO + * @param sampleVO - 수정할 정보가 담긴 SampleVO * @return void형 */ - void updateSample(SampleVO vo); + int updateSample(SampleVO sampleVO); /** * 글을 삭제한다. - * @param vo - 삭제할 정보가 담긴 SampleVO + * @param sampleVO - 삭제할 정보가 담긴 SampleVO * @return void형 */ - void deleteSample(SampleVO vo); + int deleteSample(SampleVO sampleVO); /** * 글을 조회한다. - * @param vo - 조회할 정보가 담긴 SampleVO + * @param sampleVO - 조회할 정보가 담긴 SampleVO * @return 조회한 글 */ - SampleVO selectSample(SampleVO vo); + SampleVO selectSample(SampleVO sampleVO); /** * 글 목록을 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 목록 */ - List selectSampleList(SampleVO vo); + List selectSampleList(SampleVO sampleVO); /** * 글 총 개수를 조회한다. - * @param vo - 조회할 정보가 담긴 VO + * @param sampleVO - 조회할 정보가 담긴 VO * @return 글 총 개수 */ - int selectSampleListTotCnt(SampleVO vo); + int selectSampleListTotCnt(SampleVO sampleVO); } diff --git a/src/main/java/egovframework/example/sample/web/EgovSampleController.java b/src/main/java/egovframework/example/sample/web/EgovSampleController.java index 8e438ba..2d6e071 100644 --- a/src/main/java/egovframework/example/sample/web/EgovSampleController.java +++ b/src/main/java/egovframework/example/sample/web/EgovSampleController.java @@ -21,7 +21,6 @@ import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; @@ -63,7 +62,7 @@ public class EgovSampleController { private final EgovPropertyService propertiesService; @GetMapping("/") - public String index(@ModelAttribute SampleVO sampleVO, ModelMap model) { + public String index(@ModelAttribute SampleVO sampleVO, Model model) { return this.selectSampleList(sampleVO, model); } @@ -74,11 +73,15 @@ public String index(@ModelAttribute SampleVO sampleVO, ModelMap model) { * @return "egovSampleList" */ @GetMapping("/egovSampleList.do") - public String selectSampleList(@ModelAttribute SampleVO sampleVO, ModelMap model) { + public String selectSampleList(@ModelAttribute SampleVO sampleVO, Model model) { /** EgovPropertyService.sample */ - sampleVO.setPageUnit(propertiesService.getInt("pageUnit")); - sampleVO.setPageSize(propertiesService.getInt("pageSize")); + if (sampleVO.getPageUnit() == null) { + sampleVO.setPageUnit(propertiesService.getInt("pageUnit")); + } + if (sampleVO.getPageSize() == null) { + sampleVO.setPageSize(propertiesService.getInt("pageSize")); + } /** pageing setting */ PaginationInfo paginationInfo = new PaginationInfo(); @@ -91,7 +94,7 @@ public String selectSampleList(@ModelAttribute SampleVO sampleVO, ModelMap model sampleVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); /** List */ - List sampleList = sampleService.selectSampleList(sampleVO); + List sampleList = sampleService.selectSampleList(sampleVO); model.addAttribute("resultList", sampleList); /** Count */ @@ -132,7 +135,8 @@ public String addSample(@Valid @ModelAttribute SampleVO sampleVO, BindingResult return "sample/egovSampleRegister"; } - sampleService.insertSample(sampleVO); + int result = sampleService.insertSample(sampleVO); + log.debug("result={}", result); status.setComplete(); return "redirect:/egovSampleList.do"; @@ -172,7 +176,8 @@ public String updateSample(@Valid @ModelAttribute SampleVO sampleVO, BindingResu return "sample/egovSampleRegister"; } - sampleService.updateSample(sampleVO); + int result = sampleService.updateSample(sampleVO); + log.debug("result={}", result); status.setComplete(); redirectAttributes.addAttribute("searchCondition", sampleVO.getSearchCondition()); @@ -191,7 +196,8 @@ public String updateSample(@Valid @ModelAttribute SampleVO sampleVO, BindingResu @PostMapping("/deleteSample.do") public String deleteSample(@ModelAttribute SampleVO sampleVO, RedirectAttributes redirectAttributes, SessionStatus status) { - sampleService.deleteSample(sampleVO); + int result = sampleService.deleteSample(sampleVO); + log.debug("result={}", result); status.setComplete(); redirectAttributes.addAttribute("searchCondition", sampleVO.getSearchCondition()); diff --git a/src/main/resources/egovframework/sqlmap/example/mappers/EgovSample_Sample_SQL.xml b/src/main/resources/egovframework/sqlmap/example/mappers/EgovSample_Sample_SQL.xml index d881b2d..d335670 100644 --- a/src/main/resources/egovframework/sqlmap/example/mappers/EgovSample_Sample_SQL.xml +++ b/src/main/resources/egovframework/sqlmap/example/mappers/EgovSample_Sample_SQL.xml @@ -1,17 +1,9 @@ - - - - - - - - - - + + - - + + - - + + - + - - + + + + + - + - - - AND ID LIKE '%' || #{searchKeyword} || '%' - - - AND NAME LIKE '%' || #{searchKeyword} || '%' - - - +]]> + + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/example/sql-mapper-config.xml b/src/main/resources/egovframework/sqlmap/example/sql-mapper-config.xml index 1b57ffd..7f8bc49 100644 --- a/src/main/resources/egovframework/sqlmap/example/sql-mapper-config.xml +++ b/src/main/resources/egovframework/sqlmap/example/sql-mapper-config.xml @@ -2,6 +2,12 @@ + + + + + + diff --git a/src/test/java/egovframework/example/sample/service/SampleDefaultVOTest.java b/src/test/java/egovframework/example/sample/service/SampleDefaultVOTest.java index ecdbc2c..93cafad 100644 --- a/src/test/java/egovframework/example/sample/service/SampleDefaultVOTest.java +++ b/src/test/java/egovframework/example/sample/service/SampleDefaultVOTest.java @@ -33,8 +33,8 @@ void defaultValues_searchFields() { @DisplayName("기본값 확인 - 페이지 관련 필드는 1 또는 10") void defaultValues_pageFields() { assertThat(vo.getPageIndex()).isEqualTo(1); - assertThat(vo.getPageUnit()).isEqualTo(10); - assertThat(vo.getPageSize()).isEqualTo(10); + assertThat(vo.getPageUnit()).isEqualTo(null); + assertThat(vo.getPageSize()).isEqualTo(null); assertThat(vo.getFirstIndex()).isEqualTo(1); assertThat(vo.getLastIndex()).isEqualTo(1); assertThat(vo.getRecordCountPerPage()).isEqualTo(10); diff --git a/src/test/java/egovframework/example/sample/service/impl/EgovSampleServiceImplTest.java b/src/test/java/egovframework/example/sample/service/impl/EgovSampleServiceImplTest.java index d6852db..e5eb978 100644 --- a/src/test/java/egovframework/example/sample/service/impl/EgovSampleServiceImplTest.java +++ b/src/test/java/egovframework/example/sample/service/impl/EgovSampleServiceImplTest.java @@ -74,7 +74,8 @@ void setUp() { @DisplayName("글 수정 - 정상적으로 updateSample을 호출한다") void updateSample_정상() { // given - doNothing().when(sampleMapper).updateSample(sampleVO); +// doNothing().when(sampleMapper).updateSample(sampleVO); + when(sampleMapper.updateSample(sampleVO)).thenReturn(1); // when sut.updateSample(sampleVO); @@ -87,7 +88,8 @@ void setUp() { @DisplayName("글 삭제 - 정상적으로 deleteSample을 호출한다") void deleteSample_정상() { // given - doNothing().when(sampleMapper).deleteSample(sampleVO); +// doNothing().when(sampleMapper).deleteSample(sampleVO); + when(sampleMapper.deleteSample(sampleVO)).thenReturn(1); // when sut.deleteSample(sampleVO); @@ -126,7 +128,6 @@ void setUp() { @Test @DisplayName("글 목록 조회 - 목록을 정상적으로 반환한다") - @SuppressWarnings("unchecked") void selectSampleList_정상() { // given SampleVO item1 = new SampleVO(); @@ -137,7 +138,7 @@ void setUp() { when((List) sampleMapper.selectSampleList(sampleVO)).thenReturn(expected); // when - List result = sut.selectSampleList(sampleVO); + List result = sut.selectSampleList(sampleVO); // then assertNotNull(result); diff --git a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestAddTest.java b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestAddTest.java index b26a697..bcfd952 100644 --- a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestAddTest.java +++ b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestAddTest.java @@ -8,7 +8,6 @@ import java.util.List; import org.egovframe.rte.fdl.cmmn.exception.BaseRuntimeException; -import org.egovframe.rte.psl.dataaccess.util.EgovMap; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -89,13 +88,13 @@ void test() throws BaseRuntimeException, Exception { sampleVO.setFirstIndex(0); sampleVO.setSearchCondition("1"); sampleVO.setSearchKeyword(insertVO.getName()); - final List resultList = egovSampleService.selectSampleList(sampleVO); - EgovMap result = (EgovMap) resultList.get(0); + final List resultList = egovSampleService.selectSampleList(sampleVO); + SampleVO result = resultList.get(0); final SampleVO resultSampleVO = new SampleVO(); - resultSampleVO.setName((String) result.get("name")); - resultSampleVO.setDescription((String) result.get("description")); - resultSampleVO.setUseYn((String) result.get("useYn")); - resultSampleVO.setRegUser((String) result.get("regUser")); + resultSampleVO.setName(result.getName()); + resultSampleVO.setDescription(result.getDescription()); + resultSampleVO.setUseYn(result.getUseYn()); + resultSampleVO.setRegUser(result.getRegUser()); if (log.isDebugEnabled()) { log.debug("sampleVO={}", sampleVO); diff --git a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestDeleteTest.java b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestDeleteTest.java index 3abab2f..aef6ed1 100644 --- a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestDeleteTest.java +++ b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestDeleteTest.java @@ -25,7 +25,6 @@ import java.util.List; import org.egovframe.rte.fdl.cmmn.exception.BaseRuntimeException; -import org.egovframe.rte.psl.dataaccess.util.EgovMap; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -70,9 +69,9 @@ void test() throws BaseRuntimeException, Exception { insertVO.setFirstIndex(0); insertVO.setSearchCondition("1"); insertVO.setSearchKeyword(insertVO.getName()); - final List insertedList = egovSampleService.selectSampleList(insertVO); - final EgovMap insertedRow = (EgovMap) insertedList.get(0); - final String insertedId = (String) insertedRow.get("id"); + final List insertedList = egovSampleService.selectSampleList(insertVO); + final SampleVO insertedRow = insertedList.get(0); + final String insertedId = insertedRow.getId(); // when mockMvc.perform( diff --git a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestUpdateTest.java b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestUpdateTest.java index 32d4f11..19c87ab 100644 --- a/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestUpdateTest.java +++ b/src/test/java/egovframework/example/sample/web/EgovSampleControllerTestUpdateTest.java @@ -25,7 +25,6 @@ import java.util.List; import org.egovframe.rte.fdl.cmmn.exception.BaseRuntimeException; -import org.egovframe.rte.psl.dataaccess.util.EgovMap; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -70,9 +69,9 @@ void test() throws BaseRuntimeException, Exception { insertVO.setFirstIndex(0); insertVO.setSearchCondition("1"); insertVO.setSearchKeyword(insertVO.getName()); - final List insertedList = egovSampleService.selectSampleList(insertVO); - final EgovMap insertedRow = (EgovMap) insertedList.get(0); - final String insertedId = (String) insertedRow.get("id"); + final List insertedList = egovSampleService.selectSampleList(insertVO); + final SampleVO insertedRow = insertedList.get(0); + final String insertedId = insertedRow.getId(); final String updatedName = "test 수정후 카테고리명 " + now; final String updatedDescription = "test 수정후 설명 " + now;