-
[Spring Boot] JPQL과 Thymeleaf네이버클라우드 캠프 | BE/Spring 2023. 6. 22. 11:38728x90
1. JPQL
SQL은 공급업체에 따라 문법이 조금씩 다른데, 이러한 문제를 해결하기 위해 JPA는 JPQL이라는 쿼리 언어를 제공합니다.
JPQL은 엔티티(자바 객체)를 대상으로 쿼리를 수행하며, 등장한 배경과 같이 SQL을 추상화하여 사용하기 때문에
특정 데이터베이스의 SQL에 의존하지 않는다는 특징을 가지고 있습니다.
1-1. JPA Querydsl
Querydsl은 JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API입니다.
Querydsl의 쿼리는 Java 코드로 작성되기 때문에, SQL의 문자열 쿼리가 아닌 코드 형태로 작성되어
컴파일 시점에서 오류 검사 및 자동 완성 등을 사용할 수 있습니다.
Querydsl은 아래와 같은 특징을 가지고 있습니다.
1. Type Safe: Java로 작성하기 때문에, 컴파일러가 타입 검사를 수행하여 문법 오류를 사전 방지합니다.
2. 코드 자동완성: 자동완성 기능을 통해 오타를 방지하고 편하게 쿼리를 작성합니다.
3. 재사용성과 모듈화: 쿼리 조각을 메서드로 분리하기 때문에 재사용 혹은 모듈화가 용이합니다.
2. Thymeleaf
Thymeleaf는 Java 기반의 *서버사이드 템플릿 엔진으로,
웹 어플리케이션에 사용되며 XML.XHTML/HTML5를 통한 웹 페이지 개발에 사용됩니다.
*서버사이드 템플릿 엔진:
웹 서버에서 실행되는 소프트웨어, 템플릿과 데이터를 결합해 HTML을 동적으로 생성하고 이를 클라이언트에 전달하는 역할
동적 웹 페이지를 생성하고 사용자별로 다른 내용을 제공하기 위해 사용한다.아래와 같은 특징으로 인해 Thymeleaf를 사용할 수 있습니다.
1. 자연스러운 템플릿: HTML 그대로 사용하기 때문에, 별도 플러그인 없이 웹 페이지를 확인하고 디자인할 수 있습니다.
2. Spring 통합: 스프링과 원활하게 통합되어, 스프링의 기능을 사용할 수 있습니다.
2-1. Thymeleaf 문법
Thymeleaf의 기본 문법은 HTML 태그 내에 속성으로 작성되어, ${...} 를 통해 표현식을 사용합니다.
<p th:text="${message}">This is a message</p>
위 코드의 th:text는 Thymeleaf에서 제공하는 속성으로, 실행 시 태그의 내용을 ${message}에 바인딩된 값으로 변경합니다.
기존(표준) HTML 속성 앞에 th:를 붙여 사용하며, 이를 통해 URL/조건부 렌더링/반복문 등의 다양한 작업 수행이 가능합니다.
아래의 Thymeleaf를 사용하는 예시를 통해, Thymeleaf를 사용하는 방법에 대해 자세히 알아보겠습니다.
2-1-1. 변수 전달
// ThymeleafController.java @GetMapping("/ex1") public String ex1(Model model) { model.addAttribute("message", "Hello, Thymeleaf!"); return "ex1"; }
<!-- ex1.html --> <body> <p th:text="${message}"></p> <!-- 결과: Hello, Thymeleaf! --> </body>
2-1-2. 객체 전달
// ThymeleafController.java @GetMapping("/ex2") public String ex2(Model model) { User user = new User(); user.setName("John"); user.setAge(25); model.addAttribute("user", user); return "ex2"; }
<!-- ex2.html --> <body> <p th:text="${user.name}"></p> <!-- 결과: John --> <p th:text="${user.age}"></p> <!-- 결과: 25 --> </body>
2-1-3. List 전달
// ThymeleafController.java @GetMapping("/ex3") public String ex3(Model model) { List<String> list = Arrays.asList("Apple", "Banana", "Cherry"); model.addAttribute("fruits", list); return "ex3"; }
<!-- ex3.html --> <body> <ul> <li th:each="fruit : ${fruits}" th:text="${fruit}"></li> </ul> <!-- 결과: <ul> <li>Apple</li> <li>Banana</li> <li>Cherry</li> </ul> --> </body>
2-1-4. 조건문 사용
// ThymeleafController.java @GetMapping("/ex4") public String ex4(Model model) { model.addAttribute("isLoggedIn", true); model.addAttribute("username", "John Doe"); return "ex4"; }
<!-- ex4.html --> <body> <p th:if="${isLoggedIn}" th:text="'Welcome, ' + ${username}"></p> <!-- 만약 isLoggedIn이 true라면 "Welcome, John Doe"라는 문장 출력 --> </body>
2-1-5. 연산을 이용한 값 출력
// ThymeleafController.java @GetMapping("/ex5") public String ex6(Model model) { model.addAttribute("x", 10); model.addAttribute("y", 20); return "ex5"; }
<!-- ex5.html --> <body> <p th:text="${x} + ${y} = " + (${x} + ${y})></p> <!-- "10 + 20 = 30"이라는 문장 출력 --> </body>
😳 마무리
이번 블로그 글에서는 Thymeleaf를 통한 유연한 웹 페이지 디자인에 대해 확인하였습니다.
다음 블로그 글에서는 로그인/로그아웃 기능을 구현하기 위한 Spring Security를 다룰 예정입니다.
감사합니다 :)
'네이버클라우드 캠프 | BE > Spring' 카테고리의 다른 글
[Spring Boot] 스프링 시큐리티 (0) 2023.06.26 [Spring Boot] 스프링 부트란? (어노테이션, 롬복, DAO-DTO, JPA, 쿼리 메서드 중심으로) (0) 2023.06.21 [Spring Framework] 설치와 서버 생성 (환경설정 미포함) (0) 2023.05.26