본문 바로가기
Sql

BxM 프레임워크의 일반적인 계층 이해(1)

by 헬로제이콥 2025. 7. 2.

BxM 프레임워크의 일반적인 계층 및 파일 매핑을 실제 파일명과 함께 예를 들어 설명해 드릴게요. 가상의 "고객 정보 조회 및 수정" 기능을 중심으로 설명하겠습니다.


예시: 고객 정보 조회 및 수정 기능

1. WebSquare 화면 (클라이언트 계층)

  • 역할: 사용자가 고객 정보를 조회하고 수정할 수 있는 UI를 제공합니다. 서버에 조회/수정 요청을 보내고, 받은 결과를 화면에 표시합니다.
  • 주요 파일:
    • CM0101.xml: 고객 정보 조회/수정 화면의 UI(레이아웃, 입력 필드, 버튼, 그리드 등)를 정의합니다.
      • 예시 내용: 고객ID 입력란, 조회 버튼, 고객 목록을 표시할 그리드, 상세 정보 입력란, 저장 버튼 등
    • CM0101.js: CM0101.xml 화면의 클라이언트 측 로직을 정의합니다. (버튼 클릭 시 서버 호출, 조회 결과 받아서 그리드에 표시, 입력값 유효성 검사 등)
      • 예시 내용:
        • fn_searchCustomer() 함수: 조회 버튼 클릭 시 SC_CustomerService.getCustomerList 서비스 호출
        • fn_saveCustomer() 함수: 저장 버튼 클릭 시 SC_CustomerService.saveCustomer 서비스 호출

2. 서버 측 진입점 (SC: Service Controller / Service Component)

  • 역할: WebSquare 화면에서 넘어온 요청을 처음으로 받아서 처리할 자바 메서드를 찾아 매핑하고, 비즈니스 로직을 담당하는 BC 계층을 호출합니다. 트랜잭션의 시작과 종료를 관리합니다.
  • 주요 파일:
    • SC_CustomerService.java: 고객 서비스와 관련된 요청을 처리하는 컨트롤러 역할을 합니다.
      • 예시 메서드:
      • Java
         
        @BxMServiceOperation("getCustomerList") // WebSquare에서 "getCustomerList" 오퍼레이션 호출 시 이 메서드 실행
        public BxMServiceResponse getCustomerList(BxMServiceRequest request) {
            // BC_Customer.java의 getCustomerListBySearchCondition 메서드 호출
            // 검색 조건을 담은 DTO를 BC에 전달하고, BC로부터 결과 DTO를 받음
            CustomerSearchConditionInDto inDto = request.getParam(CustomerSearchConditionInDto.class);
            CustomerListOutDto outDto = bc_Customer.getCustomerListBySearchCondition(inDto);
            return BxMServiceResponse.create().addParam(outDto);
        }
        
        @BxMServiceOperation("saveCustomer") // WebSquare에서 "saveCustomer" 오퍼레이션 호출 시 이 메서드 실행
        public BxMServiceResponse saveCustomer(BxMServiceRequest request) {
            // BC_Customer.java의 saveCustomerInfo 메서드 호출
            CustomerSaveInDto inDto = request.getParam(CustomerSaveInDto.class);
            bc_Customer.saveCustomerInfo(inDto); // 저장 로직 수행
            return BxMServiceResponse.create().addResult("Success", true);
        }
        

3. 비즈니스 로직 계층 (BC: Business Component)

  • 역할: SC로부터 호출되어 실제 핵심 비즈니스 로직을 수행합니다. 데이터 가공, 복잡한 업무 규칙 적용, 여러 DBIO 호출 조합 등이 이루어집니다.
  • 주요 파일:
    • BC_Customer.java: 고객 정보와 관련된 구체적인 비즈니스 규칙을 구현합니다.
      • 예시 메서드:
      • Java
         
        // 고객 목록 조회 비즈니스 로직
        public CustomerListOutDto getCustomerListBySearchCondition(CustomerSearchConditionInDto inDto) {
            // 1. 입력값 유효성 검사 (예: 검색 조건 필수 여부)
            // 2. DBIO 호출하여 고객 목록 조회 (dbio_Customer.xml의 selectCustomerList 쿼리 호출)
            List<CustomerDto> customerList = dbio_Customer.selectCustomerList(inDto); // DBIO 호출 예시
            // 3. 조회된 데이터를 Business 규칙에 따라 가공 (예: 상태 코드 변환)
            // 4. 결과 DTO에 담아 반환
            CustomerListOutDto outDto = new CustomerListOutDto();
            outDto.setCustomerList(customerList);
            return outDto;
        }
        
        // 고객 정보 저장 비즈니스 로직
        public void saveCustomerInfo(CustomerSaveInDto inDto) {
            // 1. 입력값 유효성 검사 (예: 필수 필드 누락 여부)
            // 2. 기존 고객인지 신규 고객인지 판단
            if (inDto.isNewCustomer()) {
                dbio_Customer.insertCustomer(inDto); // 신규 고객 등록 (DBIO 호출)
            } else {
                dbio_Customer.updateCustomer(inDto); // 기존 고객 수정 (DBIO 호출)
            }
            // 3. 추가적인 관련 데이터 처리 (예: 이력 저장 등, 다른 DBIO 호출 가능)
        }
        

4. 데이터 접근 계층 (DBIO: Data Base Input/Output)

  • 역할: 데이터베이스와의 연동을 전담합니다. SQL 쿼리를 정의하고 실행하며, 데이터베이스 결과를 자바 객체로 매핑합니다. (DAO 역할)
  • 주요 파일:
    • dbio_Customer.dbio: 고객 테이블에 대한 데이터베이스 CRUD 쿼리를 정의합니다.
      • 예시 내용 (.dbio 파일은 XML 기반입니다):
      • XML
         
        <?xml version="1.0" encoding="UTF-8"?>
        <dbio namespace="dbio_Customer"> <select id="selectCustomerList" resultClass="com.example.dto.CustomerDto">
                SELECT
                    CUST_ID, CUST_NM, CUST_TEL_NO, CUST_ADDR
                FROM
                    TB_CUSTOMER
                WHERE
                    1=1
                <if test="searchCustNm != null and searchCustNm != ''">
                    AND CUST_NM LIKE '%' || #{searchCustNm} || '%'
                </if>
                ORDER BY CUST_ID
            </select>
        
            <insert id="insertCustomer" parameterClass="com.example.dto.CustomerSaveInDto">
                INSERT INTO TB_CUSTOMER (
                    CUST_ID, CUST_NM, CUST_TEL_NO, CUST_ADDR
                ) VALUES (
                    #{custId}, #{custNm}, #{custTelNo}, #{custAddr}
                )
            </insert>
        
            <update id="updateCustomer" parameterClass="com.example.dto.CustomerSaveInDto">
                UPDATE TB_CUSTOMER
                SET
                    CUST_NM = #{custNm},
                    CUST_TEL_NO = #{custTelNo},
                    CUST_ADDR = #{custAddr}
                WHERE
                    CUST_ID = #{custId}
            </update>
        
        </dbio>
        

5. 데이터 전송 객체 (DTO: Data Transfer Object / OMM: Object Meta Model)

  • 역할: 각 계층 간 데이터를 주고받을 때 사용되는 구조를 정의합니다. .omm 파일을 통해 DTO 자바 클래스가 자동으로 생성됩니다.
  • 주요 파일:
    • CustomerSearchConditionIn.omm: 고객 목록 조회 시 입력받는 검색 조건 DTO를 정의합니다.
      • 자동 생성: CustomerSearchConditionInDto.java
      • Java
         
        // 자동 생성된 DTO 예시
        public class CustomerSearchConditionInDto {
            private String searchCustNm;
            // Getter, Setter
        }
        
    • CustomerListOut.omm: 고객 목록 조회 결과로 반환되는 DTO를 정의합니다.
      • 자동 생성: CustomerListOutDto.java
      • Java
         
        // 자동 생성된 DTO 예시
        public class CustomerListOutDto {
            private List<CustomerDto> customerList; // CustomerDto는 별도 OMM 또는 DBIO resultClass로 정의됨
            // Getter, Setter
        }
        
    • CustomerSaveIn.omm: 고객 정보 저장 시 입력받는 DTO를 정의합니다.
      • 자동 생성: CustomerSaveInDto.java
      • Java
         
        // 자동 생성된 DTO 예시
        public class CustomerSaveInDto {
            private String custId;
            private String custNm;
            private String custTelNo;
            private String custAddr;
            // Getter, Setter, isNewCustomer() 등의 로직 추가 가능
        }
        
    • Customer.omm (또는 DBIO의 resultClass에서 직접 지정): 단일 고객 정보를 담는 DTO를 정의합니다. (DBIO에서 resultClass로 사용될 수 있음)
      • 자동 생성: CustomerDto.java
      • Java
         
        // 자동 생성된 DTO 예시
        public class CustomerDto {
            private String custId;
            private String custNm;
            private String custTelNo;
            private String custAddr;
            // Getter, Setter
        }
        

전체적인 호출 흐름:

  1. CM0101.js (WebSquare)에서 사용자가 조회 버튼 클릭 시, 서버의 SC_CustomerService의 getCustomerList 오퍼레이션 호출.
    • 이때 CustomerSearchConditionInDto에 검색 조건을 담아 전달.
  2. **SC_CustomerService.java**의 getCustomerList 메서드가 호출됨.
  3. SC_CustomerService는 BC_Customer.java의 getCustomerListBySearchCondition 메서드 호출.
  4. **BC_Customer.java**의 getCustomerListBySearchCondition 메서드에서 비즈니스 로직 수행 후, dbio_Customer.dbio 파일의 selectCustomerList 쿼리를 호출.
  5. dbio_Customer.dbio에서 데이터베이스로부터 고객 목록을 조회하여 CustomerDto 객체 리스트로 반환.
  6. BC_Customer는 이 리스트를 받아 CustomerListOutDto에 담아 SC_CustomerService로 반환.
  7. SC_CustomerService는 CustomerListOutDto를 최종 응답으로 WebSquare 화면에 반환.
  8. **CM0101.js**는 받은 CustomerListOutDto 데이터를 파싱하여 CM0101.xml 화면의 고객 목록 그리드에 표시.

이 예시를 통해 BxM 프레임워크의 각 계층이 어떤 파일로 구성되고 어떻게 상호작용하는지 이해하시는 데 도움이 되셨기를 바랍니다.