728x90
반응형
SMALL

### 에러 노트: XML 파서 구문 오류

#### 문제 설명

- **문제 발생 코드**:

SELECT SUM(tpcr.confirm_price) AS accumulatedAmount FROM
tb_payment_cancel_repay tpcr
WHERE tpcr.chargebox_id = 'MDTQ0012'
AND tpcr.timestamp >= CURDATE() - INTERVAL 1 DAY  -- 전일 00:00:00
AND tpcr.timestamp < CURDATE();                    -- 오늘 00:00:00



- **에러 메시지**:

Tag name expected = expected



- **원인**: `AND tpcr.timestamp < CURDATE();` 구문에서 `<`와 `>` 기호가 XML 파서에 의해 해석되어 구문 오류가 발생하고 있습니다.

#### 발생 상황

XML에서 SQL 쿼리를 작성할 때, `<`, `>`와 같은 기호는 XML 태그로 해석되기 때문에, SQL 구문이 정상적으로 파싱되지 않습니다. 이로 인해 쿼리 실행 시 오류가 발생합니다.

#### 해결 방안

- SQL 구문을 CDATA 섹션으로 감싸서 XML 파서가 해당 구문을 태그로 해석하지 않도록 해야 합니다.

#### 수정된 코드 예시

<![CDATA[
AND tpcr.timestamp < CURDATE()
]]>



### 주의사항

- XML 문서 내에서 SQL 구문을 작성할 때는 항상 CDATA 섹션을 사용하여 파서 오류를 방지해야 합니다.
- CDATA 섹션을 사용하지 않으면 XML 파서가 SQL 구문의 기호를 잘못 해석하여 오류를 발생시킬 수 있으므로 주의가 필요합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

### 에러 노트: MyBatis 매퍼 오류

#### 문제 설명

- **에러 메시지**:
    

    `ERROR 24-10-29 08:29:14[http-nio-8089-exec-2] 
    [[dispatcherServlet]:175] - Servlet.service() for servlet 
    [dispatcherServlet] in context with path [] threw exception 
    [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException:
    Mapper method 'mdt.restapi.cohttp://m.mobile.mapper.PaymentMapper.updateAccumlatedCharges' 
    has an unsupported return type: class mdt.restapi.cohttp://m.mobile.model.PaymentModel] 
    with root cause`


    
- **원인**: MyBatis에서 정의한 `updateAccumlatedCharges` 메소드의 반환 타입이 `PaymentModel`로 설정되어 있지만, 이는 지원되지 않는 타입이라는 오류입니다.
    

#### 발생 상황

업데이트 쿼리를 수행하는 메소드에서 일반적으로 반환값이 필요 없거나, 업데이트된 행의 수를 반환하는 경우가 많습니다. 현재 메소드의 반환 타입이 `PaymentModel`로 설정되어 있어 MyBatis에서 처리할 수 없습니다.

#### 해결 방안

- 반환 타입을 `int`로 변경하여 업데이트된 행의 수를 반환하도록 수정해야 합니다.

int updateAccumlatedCharges(PaymentModel paymentModel);


<update id="updateAccumlatedCharges" parameterType="mdt.restapi.cohttp://m.mobile.model.PaymentModel">  
    UPDATE tb_accumulated_charges ch  
    SET ch.accumulated_amount = #{remainPrice} + ch.accumulated_amount  
    WHERE token_id = #{tokenId};  
</update>




728x90
반응형
LIST
728x90
반응형
SMALL

### JOIN (INNER JOIN)

- **정의**: 두 테이블 간의 공통된 값이 있는 행만 반환합니다.
- **작동 방식**: 두 테이블에서 조인 조건을 만족하는 행이 존재하는 경우에만 결과에 포함됩니다.
- **예시**:
    
    sql
        
    `SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.table1_id;`
    
    - 이 쿼리는 `table1`과 `table2`에서 `id`와 `table1_id`가 일치하는 행만 반환합니다.

### LEFT JOIN (LEFT OUTER JOIN)

- **정의**: 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환하며, 오른쪽 테이블에 일치하는 행이 없으면 NULL로 채워진 결과를 반환합니다.
- **작동 방식**: 왼쪽 테이블의 모든 행이 결과에 포함되며, 오른쪽 테이블에서 조인 조건을 만족하는 행이 없는 경우 NULL이 반환됩니다.
- **예시**:
    
    sql
        
    `SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.table1_id;`
    
    - 이 쿼리는 `table1`의 모든 행을 반환하고, `table2`에서 일치하는 행이 없으면 해당 컬럼에 NULL이 들어갑니다.

### 요약

- `JOIN`(INNER JOIN)은 두 테이블에서 일치하는 행만 반환하며, `LEFT JOIN`은 왼쪽 테이블의 모든 행을 반환하고 오른쪽 테이블에서 일치하는 행이 없을 경우 NULL을 반환합니다.

728x90
반응형
LIST

'개발 > Datebase' 카테고리의 다른 글

XML 파서 구문 오류  (0) 2024.11.05
MyBatis 매퍼 오류  (0) 2024.11.03
SQL 오류 노트: 오류 코드 1064  (0) 2024.10.29
JPA를 nativeQuery로 변경! (UNION 사용!)  (0) 2024.01.01
낙관적 락과 비관적 락  (0) 2023.05.18

+ Recent posts