본문 바로가기

SpringBoot

SpringBoot(11) - Thymeleaf 예제(반복문), DBeaver(SQL 예제), 추가 정리 사항

728x90
반응형

1) SpringBoot

   1-1) Thymeleaf 예제(반복문)

   1-2) DBeaver(SQL 예제)

   1-3) 추가 정리 사항

 

 

 

 

 

1) SpringBoot

1-1) Thymeleaf 예제(반복문)

(1) [src/main/java] - [net.datasa.web2.controller] 안에 Thymeleaf Controller.java 파일 생성 후 아래와 같이 작성

package net.datasa.web2.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;
import net.datasa.web2.domain.Person;

@Controller
@RequestMapping("th")
@Slf4j
public class ThymeleafController {
	@GetMapping("thymeleaf1")
	public String thymeleaf1(Model model) {
		String str = "문자열";
		int num = 2;
		Person p = new Person("홍길동", 20, "010-1111-2222");
		String tag = "<marquee>HTML 태그가 포함된 문자열</marquee>";
		String url = "https://google.com";
		
		model.addAttribute("str", str);
		model.addAttribute("num", num);
		model.addAttribute("person", p);
		model.addAttribute("tag", tag);
		model.addAttribute("url", url);
		
		int n1 = 1000000;
		double n2 = 123.45678;
		double n3 = 0.5;
		Date today = new Date();
		
		model.addAttribute("n1", n1);
		model.addAttribute("n2", n2);
		model.addAttribute("n3", n3);
		model.addAttribute("today", today);
		
		String values = "Java,HTML,CSS";
		model.addAttribute("values", values);
		
		return "thView/thymeleaf1";
	}
	
	@GetMapping("thymeleaf2")
	public String thymeleaf2(Model model) {
		ArrayList<String> list = new ArrayList<>();
		list.add("aaaa");
		list.add("가나다라");
		list.add("12345");
		
		HashMap<String, Object> map = new HashMap<>();
		map.put("product", "키보드");
		map.put("price", 10000);
		
		ArrayList<Person> personlist = new ArrayList<>();
		personlist.add(new Person("김", 10, "010-1111-2222"));
		personlist.add(new Person("이", 20, "010-3333-2222"));
		personlist.add(new Person("박", 30, "010-4444-5555"));
		
		model.addAttribute("list", list);
		model.addAttribute("map", map);
		model.addAttribute("personlist", personlist);
		
		return "thView/thymeleaf2";
	}
}

 

 

(2) [src/main/resources] - [templates.thView] 안에 thymeleaf2.html 파일 생성 후 아래와 같이 작성

<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org"
	xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="UTF-8">
<title>thymeleaf2</title>
<style>
	table, td {
		border: 1px solid black;
		border-collapse: collapse;
	}
	td {
		width: 150px;
	}
</style>
</head>
<body>
	<h1>[ Thymeleaf 문법2 ]</h1>
	
	<h3>리스트와 맵</h3>
	<div>[[${list}]]</div>
	<div>[[${map}]]</div>
	<div>[[${personlist}]]</div>
	
	<p th:text="${#lists.size(list)}"></p>
	<p th:text="${#lists.contains(list, 'aaaa')}"></p>
	<p th:text="${#maps.size(map)}"></p>
	<p th:text="${#maps.containsKey(map, 'price')}"></p>
	
	<h3>반복문</h3>
	
	<p>반복문을 사용하지 않은 테이블</p>
	<table>
		<tr>
			<td style="width: 100px;">aaa</td>
		</tr>
		<tr>
			<td>가나</td>
		</tr>
		<tr>
			<td>123</td>
		</tr>
	</table>
	<br>
	<table>
		<tr>
			<td>a</td>
			<td>가</td>
			<td>12</td>
		</tr>
	</table>
	<br>
	
	<p>반복문을 사용한 테이블</p>
	<table>
		<tr th:each="s, i : ${list}">
			<td th:text="${s}"></td>
			<td th:text="${i.index}"></td>
		</tr>
	</table>
	<br>
	<!-- 
			index    현재 반복 인덱스(0부터 시작)
			count    현재 반복 인덱스(1부터 시작)
			size     총 요소 수
			current  현재 요소
			even     현재 반복이 짝수인지 여부(boolean)
			odd      현재 반복이 홀수인지 여부(boolean)
			first    현재 반복이 첫번째인지 여부(boolean)
			last     현재 반복이 마지막인지 여부(boolean)
	 -->
	
	<table>
		<tr>
			<td th:each="s : ${list}" th:text="${s}"></td>
		</tr>
	</table>
	<br>
	
	<p th:each="s : ${list}" th:text=${s}></p>
	
	<th:block th:each="s : ${list}" th:text=${s}></th:block>
	
	<p>객체 반복 출력</p>
	<div th:each="p : ${personlist}">
		<p>
			<span>이름</span>
			<span th:text="${p.name}">홍길동</span>
		</p>
		<p>
			<span>나이</span>
			<span th:text="${p.age}">11</span>
		</p>
		<p>
			<span>전화</span>
			<span th:text="${p.phone}">1111111111</span>
		</p>
	</div>
	
	<p>리스트와 상관없이 반복</p>
	<p th:each="n : ${#numbers.sequence(1, 10, 1)}">
		<span th:text="${n}"></span>
		<span>, </span>
	</p>
	<br>
	
	<!-- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 -->
	<p>
		<th:block th:each="n, i : ${#numbers.sequence(1, 10, 1)}">
			<span th:text="${n}"></span><span th:unless="${i.last}">, </span>
		</th:block>
	</p>
	<br>
	
	<p>맵의 모든 값을 출력</p>
	<table>
		<tr th:each="item : ${map}">
			<td>
				<span th:text="${item.key}"></span>
			</td>
			<td>
				<span th:text="${item.value}"></span>
			</td>
		</tr>
	</table>
	<br>
	
	<p>맵의 특정 값을 읽을 때</p>
	<p th:text="${map.product}"></p>
	
</body>
</html>

 

 

(3) 결과 화면

첫 접속 화면

 

 

"타임리프 연습2" 문구 클릭 시 화면

 

 

 

1-2) DBeaver(SQL 예제)

show tables;

-- 팀 과제 주제 : DB(SQL, 자료형, 제약조건, 함수)
-- SQL : DDL, DML, DQL
-- 자료형 (문자형 : char, varchar, text, mediumtext, longtext, ...)
-- 제약조건
-- 함수

-- 테이블 생성
-- 아이디: abc, 이름: 홍길동, 나이: 10
create table person (
	id     varchar(30)   primary key,
	name   varchar(100)  not null,
	age    integer       default 0
);

-- 저장
insert into person (id, name, age) values ('abc', '홍길동', 10);
insert into person values ('def', '김길동', 25);
insert into person (id, name) values ('xyz', '홍철수');

-- id 값이 이미 생성된 데이터와 중복되기에 실행 시 에러가 발생한다
insert into person (id, name) values ('abc', '이영희');

-- 조회
select * from person;
select * from person where id = 'abc';
select * from person where name = '홍길동';
select * from person where name like '%홍%';

-- 25세 이상
select * from person where age >= 25;

-- 20대
select * from person where age >= 20 and age <= 29;

-- 홍씨 중에 이름이 외자인 사람
select * from person where name like '홍_';

-- 정렬
-- 이름 순으로 정렬(내림차순 정렬) 후 동일한 이름에 대해서는 나이 순으로 정렬(내림차순 정렬)
select * from person order by name desc, age desc;

-- 특정 컬럼(name, age)만 조회
select name, age from person;

-- 특정 컬럼(name, age)만 조회(단, 나이에 1을 더한 결과 조회)
select name, age + 1 as age from person;

-- 삭제
delete from person;
drop table person;

-- 수정
update person set age = 99 where id = 'abc';
update person set age = age + 1 where id = 'abc';

-- 커밋과 롤백
commit;

 

 

 

1-3) 추가 정리 사항

배열은 크기가 고정되어 있는 반면, ArrayList는 크기를 자유롭게 늘리거나 줄일 수 있다!

ArrayList 안에 실제 데이터가 몇 개 있는지는 size() 메서드를 통해 확인 가능하다!

 

<th:block th:each="s : ${list}" th:text=${s}></th:block>

>> 위의 태그 실행 결과 : aaaa가나다라12345

 

<th:block> : <div> 태그와 마찬가지로 영역을 지정해주는 태그

 

${#numbers.sequence(1, 10, 1)} : 1부터 10까지 1씩 증가하는 숫자 sequence를 만들어 준다!

 

char를 쓰면 속도가 빠르다!

varchar는 가변 길이 문자열이며, 범위 내에서 사용한 만큼만 자리를 차지한다.