JSON 인코딩 → \\n ?! (미정리)

김동헌·2024년 1월 29일
0

SpringBoot

목록 보기
12/19
post-thumbnail

행복한 나날들을 보내며 Tairot 프로젝트를 진행 중에 Slack으로 아래처럼 왔다..!

DB에 \n의 처리가 \\n으로 처리되는 현상이 발생..!


어떤 이유 ?

  • Database → 데이터베이스에는 content 필드에 \n (ASCII-10, LF(Line Feed))이 포함된 문자열을 저장하고 있습니다.

  • 서버에서의 처리 → 서버가 이 데이터를 조회할 때, \n은 문자열 내에서 그대로 \n으로 유지됩니다.

  • JSON 변환 과정 → 서버에서 클라이언트로 데이터를 JSON 형식으로 반활할 때, JSON스펙에 따라 특수 문자가 이스케이프 처리가 됩니다. 이때 \n(Line Feed) \\n으로 변환됩니다.
    이는 JSON에서 한 개의 백슬래시 (\)가 이스케이프 문자로 취급되기 때문에, 실제 문자로서의 백슬래시를 나타내기 위해 두 개의 백슬래시(\\)로 표현됩니다.

  • Client → JSON 응답을 받으면, JSON 파싱 과정에서 \\n은 다시 \n으로 해석되어 적절한 개행 처리가 이루어진다.

JSON 데이터를 안전하게 전송하고, 특수 문자를 올바르게 처리하기 위한 표준적인 방법이다. 따라서 서버 측에서 \\n\n으로 변환하여 반환하는 것은 일반적으로 필요하지 않기 때문에 클라이언트 측에서 이를 적절히 처리하는 것이 일반적인 방법입니다.


첫번째 해결

public class StringProcessingUtil {
    public static String processNewLines(String input) {
        return input.replace("\\n", "\n");
    }
}

다른 방법

// 첫번째 방법. System.lineSeparator 사용
return input.replaceAll("\\n", System.lineSeparator());

// 두번째 방법. StringEscapeUtil 사용
return StringEscapeUtils.unescapeJava(input);

String.replace()

  • 이 메소드는 문자열 내의 모든 발생을 찾아 교체합니다.
  • 교체 대상이 일반 텍스트인 경우 사용됩니다.
  • 정규 표현식을 사용하지 않기 때문에 String.replaceAll()에 비해 성능상 이점이 있을 수 있습니다.

String.replaceAll()

  • 이 메소드는 정규 표현식을 기반으로 문자열 내의 모든 발생을 찾아 교체합니다.
  • 보다 복잡한 패턴 매칭이 필요한 경우 사용됩니다.
  • 정규 표현식을 사용하기 때문에 단순한 문자열 교체 작업에는 String.replace()보다 느릴 수 있습니다.

처리 속도 차이

  • 단순한 문자열 교체의 경우, String.replace()String.replaceAll()보다 더 효율적이며 빠릅니다. String.replace()는 정규 표현식을 컴파일하고 매칭하는 오버헤드가 없기 때문입니다.

  • \nSystem.lineSeparator()로 교체하는 것은 플랫폼 독립적인 개행 처리를 위한 좋은 방법이 될 수 있지만, JSON 문자열과 같이 특정 포맷을 준수해야 하는 경우에는 불필요할 수 있습니다.


간결성과 명확성

  • 간결성과 명확성 측면에서는 String.replace()가 일반적으로 더 직관적입니다. 특히 정규 표현식 없이 단순 문자열 교체를 원하는 경우에는 적합합니다

결론

  • 문자열에서 \n\\n으로 변환하는 경우와 같이 단순한 문자열 교체 작업에는 String.replace()를 사용하는 것이 더 적합할 수 있습니다.

  • 플랫폼에 따라 다른 개행 문자를 사용해야 하는 경우 System.lineSeparator()를 사용할 수 있지만, JSON 문자열 처리와 같이 특정 포맷을 요구하는 상황에서는 필요하지 않을 수 있습니다.

  • 성능과 간결성을 고려할 때, String.replace()가 일반적으로 더 좋은 선택일 수 있습니다.

profile
백엔드 기록 공간😁

0개의 댓글