MINU Framework v3 - Developer Guide Help

실전 개발 가이드

MINU 코딩 가이드

  • 로컬환경 설정

  1. config-lib.gradle 수정

    minu-webapp모듈, minu-api-client모듈, 개발대상모듈에서 arms 관련 라이브러리를 project implementation으로 변경한다.

    ex)

    /* minu-commons */ // implementation 'kr.co.rmsoft:minu-commons:2.0.1.RELEASE' implementation project(path: ':minu-commons', configuration: 'runtimeElements') /* minu-domain-data */ // implementation 'kr.co.rmsoft:minu-domain-data:2.0.0.RELEASE' implementation project(path: ':minu-domain-data', configuration: 'runtimeElements') /* minu-msa-api-client */ // implementation 'kr.co.rmsoft:minu-api-client:2.2.0.RELEASE' implementation project(path: ':minu-api-client', configuration: 'runtimeElements')
    1. minu-webapp 의 application-routes.yml 수정

      local profile api-gateway 정보를 local 환경으로 변경

      ex)

      Minu 01
  • WebApp

    1. html 생성

      ex) sym99.html

    2. js 생성

      ex) sym99.js

    3. WebappConfig.java 에서 기능에 해당하는 Category 추가.

      ex) Category enum에 SYM_99 추가

      Minu 02
    4. viewRouter 생성

      ex) Sym99ViewRouter.java

      message source, message data(SYM_MESSAGE), common code를 가져올수 있다.

    5. top-menu.html 메뉴 추가.

    6. ApiController 추가.

      ex) Sym99ApiController.java

    7. 기타

    • validation :

    javax.validation 에서 커버가능한 유효성 검사는 annotation으로 처리하고 메세지는 validation.properties에 정의하여 사용한다.

    ex) SymSampleSP.java

    Minu 03

    annotation validate에 대한 처리는 @Validated (org.springframework.validation.annotation)로 처리하고

    annotation으로 처리가 불가한 경우 개별 Validator를 생성하여 처리한다.

    ex) Sym99ApiController.java, Sym99Validator.java

    Minu 04
  • Minu domain data

    1. SP 생성(검색창의 검색 필드) : 검색창이 없는 화면의 경우 NoOpSP.java로 대체할 수 있다.

      ex) SymSampleSP.java

    2. VO 생성(화면에 표시할 필드) : 화면에 표시할 내용이 없는 경우 NoOpVO.java로 대체할 수 있다.

      ex) SymSampleVO.java

  • Minu api client

    Client 생성

    ex) SymSampleClient.java

  • 각 모듈

    1. ApiController 생성

      ex) SymSampleApiController.java

    2. Entity Class 생성

      ex) SymSample.java

      상속가능한 부모 클래스 :

      BaseAuditModel.java (createdBy, createdAt, updateBY, updatedAt)

      CreatedAuditModel.java (createdBy, createdAt)

      DatetimeAuditModel.java (createdAt, updateAt)

      SimpleModel.java : 테이블의 등록자또는 변경자 컬럼이 포함되어 있지 않는 모델

    3. Service 생성

      ex) SymSampleService.java

      상속가능한 부모 Service :

      BaseService.java

      CreatedAuditService.java

      DatetimeAuditService.java

      SimpleService.java

    4. ServiceImpl 생성

      ex) SymSampleServiceImpl.java

      상속가능한 부모 ServiceImpl

      BaseServiceImpl.java

      CreatedAuditServiceImpl.java

      DatetimeAuditServiceImpl.java

      SimpleServiceImpl.java

    5. Repo 생성

      ex) SymSampleRepo.java

      상속가능한 부모 Repo :

      BaseJPAQueryDSLRepo.java

      BaseJPADataTablesRepo.java (datatables 지원)

    6. Query 생성

      ex) SymSampleQuery.java

    7. RepoImpl 생성

      ex) SymSampleRepoImpl.java

      상속가능한 부모 Class :

      QuerydslRepoSupport.java

  • 기타

    • 자주쓰는 js 라이브러리

      lodash : https://lodash.com/docs/4.17.15

    • Grid 제품:

      ParamQuery (6.2.3)

      : https://paramquery.com/pro/api62

      : https://paramquery.com/pro/demos62

    • BootStrap 테마 : https://themeon.net/nifty/v2.9.1/index.html

    • 자주쓰는 gradle 명령어

      • compileQuerydsl : Q클래스 생성

      ex) 모듈명:clean 모듈명:compileQuerydsl

      minu-system-mng:clean minu-system-mng:compileQuerydsl
      • bootJar : jar파일 생성

      ex) 모듈명:clean 모듈명:bootJar

      gradle minu-system-mng:clean minu-system-mng:bootJar
      • 권한관리 신규 기능추가 -> 권한생성

      • 각 Controller에서 Secured annotation 적용

REST API 개발

  • Controller 작성

    @RestController @RequestMapping("/api/v1") public class SampleController { // API 메서드 구현 }
  • Service 계층

    • 비즈니스 로직 구현

    • 트랜잭션 관리

  • Repository 활용

    • 데이터 접근 계층

    • 쿼리 메서드 활용

화면 개발

  • Thymeleaf 템플릿

    • 기본 문법

    • 레이아웃 구성

  • 프론트엔드 개발

    • JavaScript 모듈화

    • CSS 스타일링

    • jstree

jsTree 개발 가이드

1. 개요

jsTree는 jQuery 기반의 트리 구조를 구현하는 JavaScript 라이브러리입니다. 폴더 구조, 메뉴 구조 등 계층적 데이터를 시각화하는데 사용됩니다.

2. 설치 및 설정

2.1 필수 파일

<!-- jQuery 의존성 --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- jsTree 핵심 파일 --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/themes/default/style.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/jstree.min.js"></script>

3. 기본 사용법

3.1 HTML 구조

<div id="tree"> </div>

3.2 기본 초기화

$('#tree').jstree();

4. 주요 기능

4.1 이벤트 처리

$('#tree') .on('select_node.jstree', function (e, data) { // 노드 선택 시 const nodeId = data.node.id; const nodeText = data.node.text; console.log('선택된 노드:', nodeId, nodeText); }) .on('changed.jstree', function (e, data) { // 선택 상태 변경 시 console.log('변경된 노드들:', data.selected); }) .on('open_node.jstree', function (e, data) { // 노드 열기 시 console.log('열린 노드:', data.node); });

4.2 노드 조작

// 노드 생성 $('#tree').jstree('create_node', '#', { 'text': '새 노드' }, 'last'); // 노드 삭제 $('#tree').jstree('delete_node', '#node_id'); // 노드 이동 $('#tree').jstree('move_node', '#node_id', '#parent_id'); // 노드 복사 $('#tree').jstree('copy_node', '#node_id', '#target_id');

4.3 검색 기능

$('#tree').jstree({ 'plugins': ['search'], 'search': { 'show_only_matches': true, 'show_only_matches_children': true } });

5. 고급 기능

5.1 체크박스 사용

$('#tree').jstree({ 'plugins': ['checkbox'], 'checkbox': { 'three_state': true, // 부모-자식 간 연동 'whole_node': false, // 노드 전체 클릭 시 체크 'tie_selection': false // 선택과 체크 분리 } }); // 체크된 노드 가져오기 const checkedNodes = $('#tree').jstree('get_checked');

5.2 드래그 앤 드롭

$('#tree').jstree({ 'plugins': ['dnd'], 'dnd': { 'is_draggable': true, 'copy': false, 'check_while_dragging': true } });

5.3 컨텍스트 메뉴

$('#tree').jstree({ 'plugins': ['contextmenu'], 'contextmenu': { 'items': function(node) { return { 'create': { 'label': '새로 만들기', 'action': function(data) { const inst = $.jstree.reference(data.reference); const obj = inst.get_node(data.reference); inst.create_node(obj, {}, 'last'); } }, 'remove': { 'label': '삭제', 'action': function(data) { const inst = $.jstree.reference(data.reference); const obj = inst.get_node(data.reference); inst.delete_node(obj); } } }; } } });

테스트 코드 작성

  • 단위 테스트

    • JUnit 5 활용

    • Mockito를 이용한 목킹

  • 통합 테스트

    • Spring Boot Test

    • TestContainers 활용

Last modified: 17 March 2025