본문으로 건너뛰기
개발 머꼬
개발 노트Java
hohyeon.dev19

SQL과 JSON을 문자열로 이어 붙이다가 텍스트 블록으로 바꾼 뒤 달라진 것

  • #Engineering Note
  • #Java

문제 발생

쿼리 문자열이 이어 붙이기와 이스케이프로 뒤덮여 있어서, 실제 SQL이 무엇인지 읽으려면 머릿속에서 다시 조립해야 했습니다.

String sql = "SELECT id, title\n" +
             "  FROM dev_notes\n" +
             " WHERE status = 'published'\n" +
             " ORDER BY published_at DESC";

원인 분석

여러 줄 문자열을 표현할 방법이 없어서 매 줄을 따옴표로 감싸고 \n을 직접 넣어야 했습니다. 줄을 추가하거나 순서를 바꿀 때마다 따옴표와 +를 다시 맞춰야 하고, 붙여넣은 SQL을 그대로 쓸 수도 없었습니다.

텍스트 블록"""로 여는 여러 줄 문자열 리터럴이고, Java SE 15에서 정식 기능이 됐습니다(JEP 378).

핵심은 부수적 공백(incidental whitespace) 제거입니다. 코드 정렬을 위해 넣은 들여쓰기는 컴파일러가 알아서 걷어내고, 내용상 의미 있는 들여쓰기만 남깁니다. 판정 기준은 각 줄의 들여쓰기 중 가장 작은 값이며, 닫는 """의 위치도 그 계산에 참여합니다.

해결 방안

  1. 원문 그대로 씁니다.
String sql = """
        SELECT id, title
          FROM dev_notes
         WHERE status = 'published'
         ORDER BY published_at DESC
        """;

닫는 """가 내용과 같은 열에 있으므로 그 들여쓰기가 전부 제거되고, SELECT가 0열에서 시작합니다.

  1. 여는 """ 뒤에는 반드시 줄바꿈이 와야 합니다. 같은 줄에 내용을 쓰면 컴파일 에러입니다.
String name = """Pat Q. Smith""";   // 컴파일 에러
  1. 들여쓰기를 남기고 싶으면 닫는 구분자를 왼쪽 끝으로 내립니다. 닫는 """가 0열이면 제거할 부수 공백이 없어져 각 줄의 앞 공백이 그대로 남습니다.
  2. 후행 공백은 잘립니다. 편집기가 자동으로 지우는 공백 때문에 문자열이 눈에 안 보이게 바뀌는 것을 막기 위한 규칙입니다. 후행 공백을 꼭 남겨야 하면 \s(공백 하나)를 마지막에 두어 울타리로 씁니다.
  3. 긴 한 줄을 나눠 쓰려면 줄 끝에 \를 붙입니다. 그 줄의 개행이 사라져 한 줄로 이어집니다.
String text = """
        Lorem ipsum dolor sit amet, consectetur \
        adipiscing elit, sed do eiusmod.\
        """;
  1. 값을 끼워 넣는 문법은 따로 없습니다. 텍스트 블록도 그냥 String이라 formatted()나 파라미터 바인딩을 씁니다. SQL이라면 문자열에 값을 끼워 넣지 말고 반드시 파라미터 바인딩을 써야 한다는 점은 그대로입니다.
String sql = """
        SELECT id FROM dev_notes WHERE technology_id = ?
        """;

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.