백엔드 파트 수업으로 넘어가면서 따로 프론트엔드 공부를 이어갈지, 아니면 수업을 계속 들을지 고민했다. 문법 수업이 으레 그러하듯 '이걸 그래서 어떨 때 쓴다는 거지?'라는 물음만 이어졌는데 배움의 이점이 있었다. 강한 언어라서 그런지 타입을 필수적으로 지정한다는 게 타입스크립트와 맞닿은 면이 많아 은근 도움이 될 것 같았다.
게다가 백에서 어떻게 데이터를 가공하고 동작하는지 그 원리를 알면 데이터를 요청하고 받아와서 처리할 때 이해를 바탕으로 작업할 수 있지 않을까 한다.
수업은 스프링 부트의 설치부터 시작했지만, 나는 타임리프 템플릿 엔진 위주로 그 내용을 정리해보려 한다.
정적 파일 확인 해보기
-static 안에 image 패키지 생성 후 이미지 삽입 -> URL로 접근
-index 같은 기본 파일은 쓰지 않아도 기본적으로 접근 가능
ex.http://localhost:8080/hello
Tomcat started on port 8080 (http) with context path ''
타임리프는 html 태그에 속성을 추가해 동적으로 값을 처리할 수 있게 해주는 템플릿이다. 이 템플릿 문법을 살펴보면서 폴더 구조를 MVC로 작성해보려 한다.
앞서 언급한 대로 코드는 java 디렉터리 안에서 작성한다.
'controllers' 디렉터리를 만들어, 스프링 프레임워크를 사용하고 있으므로 필요한 것들을 불러와준다.
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
tip : 인텔리제이에서 작성하면 자동으로 import 되지만, 그렇지 않을 때
Ctrl + Space
로 사용.
@Controller
public class HelloController {
@GetMapping("/hello")
public String getHello(Model model){
model.addAttribute("name", "가나다");
model.addAttribute("name2", "<strong>라마바</strong>");
// 객체를 전달
String[] items = {"a", "b", "c", "d", "e"};
model.addAttribute("items", items);
return "hello";
}
}
/hello
라는 경로로 GET 접근 시 아래 메서드를 실행한다. 그런데 메서드가 String을 반환 중이다. 이는 src/main/resouces/templates에서 동일한 파일명을 반환하기에 해당 URL 접근 시 hello.html을 화면에 보여줄 것이다.만약 해당 템플릿이 존재하지 않는다면 아래와 같은 에러메시지가 나온다 :
Error resolving template [hello], template might not exist or might not be accessible
addAttribute
는 순서대로 속성의 이름과 값을 넘겨주면 된다.타임리프를 html에서 사용할 땐 html 태그에 설정을 넣어주어야 한다.
<html lang="en" xmlns:th="http://www.thymeleaf.org">
앞서 언급한 대로 태그의 속성에 추가해 줄 것이고, th:
로 시작한다. 서버에서 보낸 데이터를 받을 땐 "${}
를 사용한다.
<p th:text="${name}">인사</p>
이미 속성에서 문자열이 정의되어있기 때문에 태그 사이에 작성한 것이 아닌 'name'에 담긴 값을 보여준다. 이 경우 '가나다'가 나타남.
<p th:utext="${name2}"></p>
text와 거의 동일하지만 html 태그를 인식한다.
th:value
요소에 value 값 설정
th:with
템플릿 내에서 변수를 지정해서 사용
조건문도 사용할 수 있다. switch case 문은 차이가 없지만, if else 문은 조금 다르다.
<div th:switch="${name}">
<p th:case="'hi'">안녕하세요</p>
<p th:case="'bye'">잘가세요</p>
<p th:case="*">인삿말이 아닙니다</p>
</div>
""
는 문자열을 뜻하는 게 아니고 타임리프의 문법이다. 그래서 문자열임을 표시하고자 작은 따옴표를 넣었고, 와일드카드는 문자열이 아니라서 작은 따옴표를 붙이지 않는다.
<p th:if="${name}=='가나다'" th:text="${name}"></p>
<p th:unless="${name}=='가나다'" th:text="'다른 이름'"></p>
<ul>
<li th:each="item:${items}">
<span th:text="${item}"></span>
</li>
</ul>
String 배열이 담긴 items을 하나씩 순회한다.
필드 개수가 많을 때 하나씩 getter/setter를 만든다면 코드가 너무 길어질 것이다. 이때 사용할 수 있는 게 lombok의 @Getter, @Setter 어노테이션이다.
getter/setter를 만들 필드 혹은 클래스 위에 어노테이션을 작성해준다.
@Getter
@Setter
class Person {
private String name;
// 필드 명에 작성 시 특정 필드만
// @Getter
// @Setter
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
인텔리제이 플러그인 : lombok
인텔리제이가 lombok을 인식하지 못하기 때문에 플러그인을 설치해준다.