본문 바로가기
JavaScript

[JavaScript] Template literals 사용법

by 배잼 2022. 2. 2.

react를 사용하면서 axios로 서버에 request를 보낼 때, url에 user id 등을 담아야 하는 경우가 있었다. 처음에 문자열을 불러와 더하는 식으로 붙여 보냈는데, 상당히 번거로웠다. 이때 template literal를 쓰면 된다!

문법

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`

템플릿 리터럴은 작은따옴표(’’)나 큰따옴표(””) 대신 백틱(``)을 써서 표현한다. 런타임에 템플릿 리터럴은 일반 문자열로 변환되어 처리된다.

Multi-line strings

일반적으로 문자열 안에서 줄바꿈 등은 허용되지 않는다. 따라서 잘 알려진 이스케이프 문자를 사용해야 한다.

console.log("첫째줄
둘째줄"); //Error!

console.log("첫째줄" + "/n둘째줄"); 
//첫째줄
//둘째줄
//정상 실행된다.

그러나 템플릿 리터럴을 사용하면 이에 구애받지 않는다.

console.log(`첫째줄
둘째줄`); //가능하다!

Expression interpolation

만약 “나는 두부를 먹었습니다”, 라는 문장을 출력하고 싶다. 그러나 무얼 먹었는지는 매일 바뀔 수 있으므로, 두부는 변수에 넣어서 출력하고 싶다.

let food = "두부";

console.log("나는"+ food + "를 먹었습니다"); //나는 두부를 먹었습니다

그러나 템플릿 리터럴을 사용하면 더 직관적으로 할 수 있다.

let food = "두부";

console.log(`나는 ${food}를 먹었습니다`); //나는 두부를 먹었습니다

Tagged Tamplates

직접 쓰는 일은 드물겠지만, 알아두면 이해하기 좋을 것이므로 가져왔다. 함수에 값을 넣을 때 () 괄호를 쓰는 게 아니라, 템플릿 리터럴을 사용할 수 있다!

//MDN 예제
var person = 'Mike';
var age = 28;

function myTag(strings, personExp, ageExp) {
//꼭 이름 뒤에 Exp를 붙일 필요는 없다. 템플릿 리터럴에 들어간 변수 순서대로 함수에서 받아온다!
//strings를 함수에 찍어보면 변수가 아닌 부분들이 배열로 저장되어있음을 확인할 수 있다.
// ['that ', ' is a ', '', raw: Array(3)]로 나옴

  var str0 = strings[0]; // "that "
  var str1 = strings[1]; // " is a "

  var ageStr;
  if (ageExp > 99){
    ageStr = 'centenarian';
  } else {
    ageStr = 'youngster';
  }

  // 심지어 이 함수내에서도 template literal을 반환할 수 있습니다.
  return str0 + personExp + str1 + ageStr;
}

var output = myTag`that ${ person } is a ${ age }`;

console.log(output);
// that Mike is a youngster

한 가지 더, 만약 위 코드에서 three dots를 활용한다면

var person = 'Mike';
var age = 28;

function myTag(strings, ...Datas) {

    console.log(Datas); //['Mike', 28]
    console.log("Strings : ", strings); //['that ', ' is a ', '', raw: Array(3)]
}

var output = myTag`that ${ person } is a ${ age }`;

console.log(output);

age가 string이 아니라 number로 처리됐음을 알 수 있다! 따라서 함수 안에 타입에 상관없이 값을 그대로 전달할 수 있게 된다.


reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template\_literals

댓글