개발노트/Spring

[Spring] 폼 처리와 다국어 정리

dev-mylee 2025. 1. 9. 11:24

1. Spring message 처리

<!-- ❌ 이렇게 하면 안됨 -->
alert("저장되었습니다.");  // 하드코딩된 메시지

<!-- ⭕ 이렇게 해야 다국어 처리됨 -->
alert('<spring:message code="message.save.success" />');

<!-- 🤔 변수 들어가는 메시지는 이렇게 -->
alert('<spring:message code="message.save.count" arguments="${count}" />');

 

실수한 것들:

jsp 파일에서 스크립트 분리할 때 message 처리

// 방법 1: 변수로 먼저 선언
<script>
const MSG_SAVE = '<spring:message code="message.save.success" />';
const MSG_DELETE = '<spring:message code="message.delete.success" />';

function save() {
    // ... 저장 로직
    alert(MSG_SAVE);
}
</script>

// 방법 2: 데이터 속성 활용
<button data-msg='<spring:message code="message.save.success" />'>
    저장
</button>

$('button').click(function() {
    alert($(this).data('msg'));
});

 

 

2. Form Submit 처리

처음에는 순수하게 했다가 실수함:

// ❌ 이러면 validation 무시됨
$("#searchFrm").submit();

// ⭕ 이렇게 하자
if($("#searchFrm")[0].checkValidity()) {
    // 1. action 설정
    $("#searchFrm").attr("action", "/api/search");
    
    // 2. 추가 파라미터 있으면 hidden으로
    $("<input>").attr({
        type: "hidden",
        name: "extraParam",
        value: "extraValue"
    }).appendTo("#searchFrm");
    
    // 3. submit
    $("#searchFrm").submit();
}

 

 

 

3. Ajax 통신

이것도 패턴화 시켜놨다:

function callAjax(url, param) {
    $.ajax({
        url: url,
        type: 'POST',
        data: JSON.stringify(param),
        contentType: 'application/json',
        beforeSend: function() {
            // 로딩 표시 (이거 깜빡하면 사용자가 불편...)
            showLoading();
        },
        success: function(result) {
            if(result.success) {
                // 성공 메시지는 다국어로!
                alert('<spring:message code="message.save.success" />');
            } else {
                // 서버 메시지 그대로 표시 (이미 다국어 처리되어 옴)
                alert(result.message);
            }
        },
        error: function(xhr) {
            // 서버 에러는 공통 메시지로
            alert('<spring:message code="message.server.error" />');
            console.error(xhr);
        },
        complete: function() {
            // 로딩 제거 (이것도 깜빡하지 말자...)
            hideLoading();
        }
    });
}

// 사용할 때
callAjax('/api/save', {
    id: '123',
    name: '홍길동'
});

 

 

 

4. 자주 까먹는 것들

1. form serialize 할 때

// ❌ 이러면 배열 데이터 못 받음
const param = $("#searchFrm").serialize();

// ⭕ 배열도 처리되게
const param = $("#searchFrm").serializeArray();

 

2. 다국어 동적 메시지

// messages.properties
message.confirm.delete="{0}을(를) 삭제하시겠습니까?"

// javascript
const msg = '<spring:message code="message.confirm.delete" arguments="${name}" />';
if(confirm(msg)) {
    // 삭제 처리
}

 

 

✅ 메모

  • 메시지는 무조건 다국어로 (나중에 고생...)
  • form submit 전에는 validation 체크
  • ajax 통신할 때 로딩 처리 필수
  • serialize 쓸 때 배열 데이터 주의