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는 가변 길이 문자열이며, 범위 내에서 사용한 만큼만 자리를 차지한다.