Archive: 2021

0

백준 - 14499 주사위 굴리기

https://www.acmicpc.net/problem/14499 체점 현황 문제 해설문제를 입력받는 곳에서 함정이 있다. 평소에 세로를 y, 가로를 x로 놓고 문제를 해결하는 사람들에게는 틀리기 너무 좋은 문제주사위의 현재 위치를 계속 추적하면서 주사위 상태도 계속해서 관리해야 한다. 위치를 쉽게 관리하기 위해서 전역변수를 통해 전역적으로 관리했다. #include <iostream>#include <vector>using namespace std;int n, m, x, y, k;int map[22][22];int cube[4][3];vector<int> command;void moveUp() { if (x - 1 >= 0) { x -= 1; int temp01, temp11, temp21, temp31; temp01 = cube[0][1]; temp11 = cube[1][1]; temp21 = cube[2][1]; temp31 = cube[3][1]; cube[0][1] = temp11; cube[1][1] = temp21; cube[2][1] = temp31; cube[3][1] = temp01; int next = map[x][y]; if (next == 0) { map[x][y] = cube[3][1]; } else { cube[3][1] = map[x][y]; map[x][y] = 0; } cout << cube[1][1] << '\n'; } else { return; }}void moveDown() { if (x + 1 < n) { x += 1; int temp01, temp11, temp21, temp31; temp01 = cube[0][1]; temp11 = cube[1][1]; temp21 = cube[2][1]; temp31 = cube[3][1]; cube[1][1] = temp01; cube[2][1] = temp11; cube[3][1] = temp21; cube[0][1] = temp31; int next = map[x][y]; if (next == 0) { map[x][y] = cube[3][1]; } else { cube[3][1] = map[x][y]; map[x][y] = 0; } cout << cube[1][1] << '\n'; } else { return; }}void moveRight() { if (y + 1 < m) { y += 1; int temp11, temp12, temp31, temp10; temp11 = cube[1][1]; temp12 = cube[1][2]; temp31 = cube[3][1]; temp10 = cube[1][0]; cube[1][1] = temp10; cube[1][2] = temp11; cube[3][1] = temp12; cube[1][0] = temp31; int next = map[x][y]; if (next == 0) { map[x][y] = cube[3][1]; } else { cube[3][1] = map[x][y]; map[x][y] = 0; } cout << cube[1][1] << '\n'; } else { return; }}void moveLeft() { if (y - 1 >= 0) { y -= 1; int temp11, temp12, temp31, temp10; temp11 = cube[1][1]; temp12 = cube[1][2]; temp31 = cube[3][1]; temp10 = cube[1][0]; cube[1][0] = temp11; cube[1][1] = temp12; cube[1][2] = temp31; cube[3][1] = temp10; int next = map[x][y]; if (next == 0) { map[x][y] = cube[3][1]; } else { cube[3][1] = map[x][y]; map[x][y] = 0; } cout << cube[1][1] << '\n'; } else { return; }}void moveCube() { int commandNum = command.size(); for (int i = 0; i < commandNum; i++) { int cntCommand = command[i]; if (cntCommand == 1) { moveRight(); } if (cntCommand == 2) { moveLeft(); } if (cntCommand == 3) { moveUp(); } if (cntCommand == 4) { moveDown(); } }}int main(void) { cin >> n >> m >> x >> y >> k; for (int i = 0; i < n; i++) { { for (int j = 0; j < m; j++) { cin >> map[i][j]; } } } map[x][y] = 0; for (int i = 0; i < k; i++) { int temp = 0; cin >> temp; command.push_back(temp); } moveCube(); return 0;}

0

백준 3190 - 뱀

https://www.acmicpc.net/problem/3190 체점 현황 전체 소스 코드#include <bits/stdc++.h>using namespace std;int board[110][110];int board_size;int num_of_apple;int num_of_command;map<int, char> command;// 동, 남, 서, 북int dx[4] = {1, 0, -1, 0};int dy[4] = {0, 1, 0, -1};int direction[4] = {0, 1, 2, 3};struct snake { int y; int x; int dir;};int main(void) { cin >> board_size >> num_of_apple; for (int i = 0; i < num_of_apple; i++) { int y, x; cin >> y >> x; board[y][x] = 1; } cin >> num_of_command; for (int i = 0; i < num_of_command; i++) { int time; char dir; cin >> time >> dir; command[time] = dir; } queue<pair<int, int>> snake_tail; int snake_head_y = 1; int snake_haed_x = 1; int snake_dir = 0; snake_tail.push({1, 1}); board[1][1] = 2; int time = 0; while (true) { time++; snake_head_y += dy[snake_dir]; snake_haed_x += dx[snake_dir]; snake_tail.push({snake_head_y, snake_haed_x}); if (board[snake_head_y][snake_haed_x] == 2) { cout << time << '\n'; return 0; } if (0 >= snake_head_y || snake_head_y > board_size || 0 >= snake_haed_x || snake_haed_x > board_size) { cout << time << '\n'; return 0; } if (board[snake_head_y][snake_haed_x] == 1) { board[snake_head_y][snake_haed_x] = 2; } else { board[snake_head_y][snake_haed_x] = 2; board[snake_tail.front().first][snake_tail.front().second] = 0; snake_tail.pop(); } if (command.find(time) != command.end()) { char com = command[time]; command.erase(time); if (com == 'L') { snake_dir = (snake_dir + 3) % 4; } else { snake_dir = (snake_dir + 1) % 4; } } } return 0;}

0

JPA - Entity의 생명주기

목차 JPA - Entity의 생명주기 JPA - Persist Context (영속성 컨텍스트) 엔티티 생명주기비영속 (new/transient) Entity 객체가 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Entity 객체가 생성돼 아직 영속성 컨텍스트에 저장되기 전 상태다. // 비영속 상태Member member = new Member();member.setId(101L);member.setName("HelloJPA"); 영속 (managed) Entity 객체가 현재 영속성 컨텍스트에 관리되는 상태

0

백준 1753 - 최단 경로

https://www.acmicpc.net/problem/1753 문제 해설가장 기본적이고 정형화된 다익스트라 문제이다! 다익스트라 알고리즘에서는 우선순위 큐를 사용하는데 기본적으로 우선순위 큐는 값이 큰 것부터 우선적으로 나가게 된다. #include <bits/stdc++.h>using namespace std;#define INF 987654321int V, E;int startPoint;int dist[20002]; // dist[x] : 시작점으로부터 점 x까지의 최단 거리를 저장한다.vector<vector<pair<int, int>>> graph;void dijkstra(int start) { // 초기값은 무한대로 설정해 놓는다. for (int i = 1; i < V + 1; i++) { dist[i] = INF; } priority_queue<pair<int, int>> pq; pq.push({0, start}); dist[start] = 0; while (!pq.empty()) { int cntDist = -pq.top().first; int cntVertex = pq.top().second; pq.pop(); // 현재 점까지의 거리와 저장된 최단거리를 비교한다. // 현재 점까지의 거리가 더 큰 경우는 나중에 최단거리가 갱신된 것이다. // 우리는 각 점에 최단거리로 간 상태에 대해서만 갱신을 진행하므로 밑의 연산은 진행하지 않는다. if (cntDist > dist[cntVertex]) { continue; } // 아래 로직을 대신 사용해도 결과는 똑같이 나온다. // 즉 현재 점까지의 거리가 최단거리까지와 일치하는지 확인하는 단계이다. // if (cntDist != dist[cntVertex]) { // continue; // } for (int i = 0; i < graph[cntVertex].size(); i++) { int nextVertex = graph[cntVertex][i].first; int weight = graph[cntVertex][i].second; // cntDist 대신 dist[cntVertex]를 사용해도 결과는 동일하다 // int nextDist = dist[cntVertex] + weight; int nextDist = cntDist + weight; if (dist[nextVertex] > nextDist) { dist[nextVertex] = nextDist; // 값을 음수로 저장해 우선순위가 반대가 되도록 한다. pq.push({-nextDist, nextVertex}); } } }}int main(void) { cin >> V >> E; cin >> startPoint; graph = vector<vector<pair<int, int>>>(V + 1); for (int i = 0; i < E; i++) { int a, b, weight; cin >> a >> b >> weight; graph[a].push_back({b, weight}); } dijkstra(startPoint); for (int i = 1; i <= V; i++) { if (dist[i] == INF) { cout << "INF" << '\n'; } else { cout << dist[i] << '\n'; } } return 0;} priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; 우선순위 큐에 greater<pair<int, int>>> pq 정렬 방식을 통해 값이 작은 것부터 우선적으로 나가게 된다. #include <iostream>#include <vector>#include <queue>using namespace std;#define INF 2000000000// 정점의 개수 : v, 간선의 개수 : eint v, e;vector<vector<pair<int, int>>> graph;vector<int> dist;vector<bool> check;int start_node;void dijkstra(){ for (int i = 1; i <= v; i++) dist[i] = INF; dist[start_node] = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push({0, start_node}); while (!pq.empty()) { int weight = pq.top().first; int cnt_node = pq.top().second; pq.pop(); if (check[cnt_node] == true) continue; check[cnt_node] = true; // 점 cnt_node에 연결된 간선의 개수 int edge_num = graph[cnt_node].size(); for (int j = 0; j < edge_num; j++) { // from : 현재 위치, to : 다음 위치, from_to_weight : 현재위치에서 다음위치 까지의 가중치 int from = cnt_node, to = graph[cnt_node][j].first, from_to_weight = graph[cnt_node][j].second; if (dist[to] > dist[from] + from_to_weight) { dist[to] = dist[from] + from_to_weight; pq.push({dist[to], to}); } } }}int main(void){ scanf("%d %d %d", &v, &e, &start_node); dist = vector<int>(v + 1, INF); check = vector<bool>(v + 1, false); graph = vector<vector<pair<int, int>>>(v + 1); for (int i = 0; i < e; i++) { int from, to, weight; scanf("%d %d %d", &from, &to, &weight); graph[from].push_back({to, weight}); } dijkstra(); for (int i = 1; i <= v; i++) { if (dist[i] == INF) printf("INF\n"); else { printf("%d\n", dist[i]); } } return 0;}

0

Spring Boot 게시판 만들기 15 - Github와 jenkins 연동하기

15. Github와 jenkins 연동하기Github webhookngrok을 이용해 외부접근이 가능하도록 네트워크 열기Push 이벤트가 일어났을 때 로컬 Jenkins가 해당 훅을 받기 위해서는 해당 네트워크(포트)를 외부접근이 가능하게 열어놔야 한다.ngrok 프로그램을 사용해 Github로부터 hook을 받을 수 있도록 Jenkins 포트를 열어준다. ngrok은 local PC를 외부에서 접근이 가능하도록 열어주는 프로그램이다. Webhook 추가하기Project Repository > settings > Webhooks > add webhook 로 이동해 Payload URL에 http://[서버 IP주소]:[Port번호]/github-webhook/ 형식으로 날릴 주소를 기입하도록한다. 반드시 주소 뒤에 /github-webhook/ 를 추가해야 한다. Push가 일어났을 때 Payload URL(Jenkins)로 Hook을 날린다.

0

Spring Boot 게시판 만들기 16 - Github와 jenkins 연동하기

16. Github와 jenkins 연동하기Github webhookngrok을 이용해 외부접근이 가능하도록 네트워크 열기Push 이벤트가 일어났을 때 로컬 Jenkins가 해당 훅을 받기 위해서는 해당 네트워크(포트)를 외부접근이 가능하게 열어놔야 한다.ngrok 프로그램을 사용해 Github로부터 hook을 받을 수 있도록 Jenkins 포트를 열어준다. ngrok은 local PC를 외부에서 접근이 가능하도록 열어주는 프로그램이다. Webhook 추가하기Project Repository > settings > Webhooks > add webhook 로 이동해 Payload URL에 http://[서버 IP주소]:[Port번호]/github-webhook/ 형식으로 날릴 주소를 기입하도록한다. 반드시 주소 뒤에 /github-webhook/ 를 추가해야 한다. Push가 일어났을 때 Payload URL(Jenkins)로 Hook을 날린다.

0

Spring Boot 게시판 만들기 14 - Jenkins 프로젝트 만들기

14. Jenkins 프로젝트 만들기 새 프로젝트 만들기 소스 코드 관리 소스 코드를 가져오기 위한 계정 추가하기 빌드 유발 선택 Build 선택하기 프로젝트 확인 프로젝트 build하기 프로젝트 결과 확인 새 프로젝트 만들기create a Job > FreeStyle project 를 선택해 새 프로젝트를 만든다. 소스 코드 관리git을 선택한 후 Build할 Repository URL을 넣어준다. 계정 추가하기

0

Spring Boot 게시판 만들기 13 - jenkins를 이용해 build 하기

13. jenkins를 이용해 build하기jenkins를 로컬에 바로 설치해 사용해도 되지만 해당 프로젝트에서는 docker를 이용해 jenkins이미지를 불러와 빌드를 진행할 것이다. docker 설치하기도커는 https://docs.docker.com/get-docker/ 에서 본인 운영체제에 맞는 것을 선택해 다운로드 한다. 본인이 사용하는 프로젝트의 jdk 버전에 맞는 jenkins 파일 가져와야 build시에 jdk 버전 오류가 안생긴다. JDK11버전의 jenkins 이미지를 불러오도록 한다. docker images 명령어를 통해 이미지들을 확인할 수 있다. # lts버전의 jenkins 이미지docker pull jenkins/jenkins:lts# jdk11버전의 jenkins 이미지docker pull jenkins/jenkins:jdk11# 설치된 이미지들 확인docker images jenkins 이미지 실행하기

0

Spring Boot 게시판 만들기 12 - 타임리프 오류 해결하기

12. 타임리프 오류 해결하기null 오류게시물이 하나도 없을 때 Thymeleaf에서 null인 객체를 참조하여 오류가 발생하는 것을 확인할 수 있었다. 객체를 반환할 때 데이터가 null인 경우 비어있는 객체를 생성해 반환하도록 한다. @GetMapping("/")public String board(@PageableDefault Pageable pageable, Model model) { Page<Post> posts = postService.getPosts(pageable); if(posts == null){ posts = new PageImpl<Post>(new ArrayList<>()); } model.addAttribute("PostList", posts); return "board";} paging 오류데이터가 하나도 없는데 pagination 목록에서 1과 0이 떠있는 오류를 발견했다.

0

Spring Boot 게시판 만들기 11 - 페이징 처리하기

11. 페이징 처리하기메인 게시판을 접근하게 되면 한번에 너무 많은 게시글들이 쏟아져 나오게 돼 보기가 좋지 않고 서버도 많은 양의 데이터를 한번에 보내야 하기 때문에 성능에서도 좋지 않다.사용자에게 전체 데이터에서 적당한 양의 데이터만 보여줘 사용자 입장에서도 서버 입장에서도 부담이 없게 한다. Control 로직 수정하기Spring에서 제공하는 Pageable 인터페이스를 사용하면 쉽게 페이징 기능을 사용할 수 있다. BoardController.java @Controller@RequiredArgsConstructorpublic class BoardController { private final PostService postService;// @GetMapping("/")// public String board(Model model){// List<Post> posts = postService.getAllPosts();// model.addAttribute("PostList", posts);// return "board";// } @GetMapping("/") public String board(@PageableDefault Pageable pageable, Model model) { Page<Post> posts = postService.getPosts(pageable); model.addAttribute("PostList", posts); return "board"; }} 테스트 코드 로직 변경@Test@DisplayName("모든 Post를 가져온다.")public void board() throws Exception { List<Post> posts = new ArrayList<>(); posts.add(Post.builder() .id(1L) .title("test") .name("tester") .content("test") .writeTime(LocalDateTime.now()) .build() ); Page<Post> pagePosts = new PageImpl<>(posts); PageRequest pageRequest = PageRequest.of(1, 10); given(postService.getPosts(pageRequest)).willReturn(pagePosts); ResultActions resultActions = mockMvc.perform(get("/") .param("page", "1")// .flashAttr("PostList", new ArrayList<>()) ); resultActions .andExpect(status().isOk()) .andDo(print()); verify(postService).getPosts(pageRequest);} Servic 로직 추가

0

Spring Boot 게시판 만들기 10 - 포스트 삭제하기

10. 포스트 삭제하기PostController.java @PostMapping("/post/{postId}/delete")public String deletePost(@PathVariable("postId") Long id){ postService.deletePostById(id); return "redirect:/";} PostService.java @Transactionalpublic void deletePostById(Long id){ postRepository.deleteById(id);} Post.html <tbody class="text-center"><tr th:each="Post:${PostList}" th:id="*{Post.id}"> <td class="align-middle" th:text="${PostStat.index+1}"></td> <td class="align-middle"> <a th:href="@{/post/{id}(id=${Post.id})}" th:text="${Post.title}"></a> </td> <td class="align-middle" th:text="${Post.name}"></td> <td class="align-middle" th:text="${Post.writeTime}"></td> <td class="text-center align-middle"> <a class="btn btn-primary" th:href="@{/post/{id}/revise(id=${Post.id})}">수정</a> <a href="#" th:href="'javascript:deletePost('+${Post.id}+')'" class="btn btn-danger">삭제</a><!--<button id="delete-btn" type="submit" class="btn btn-danger" th:onclick="deletePost([[ ${Post.id} ]]);">삭제</button>--> </td></tr></tbody> function deletePost(id) { if(confirm(id + "번 게시글을 삭제하시겠습니까?")) { const action = "/post/" + id + "/delete" let form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", action); document.body.appendChild(form); form.submit(); }}// var table = document.getElementById('PostTable');//// async function deletePost(id) {// url = "http://localhost:8080/post/" + id + "/delete";// console.log(url);// const response = await fetch(url, {// method: 'post'// });// }

0

Spring Boot 게시판 만들기 9 - 페이지 수정하기

9. 페이지 수정하기데이터를 수정하기 위해서는 수정하고자 하는 데이터를 찾아야 하기 때문에 id값이 필요하다. input태그의 type속성을 hidden으로해 form을 작성한 후 나머지 데이터와 함께 id값을 넘겨주도록 한다. post.html <h2>게시글 작성</h2><div class="card" style="padding: 20px; border-radius: 15px; margin: 20px auto;"> <form class=" form-horizontal" method="post" th:action="@{/post}" th:object="${postDto}"> <input type="hidden" th:if="*{id != null and id > 0}" th:field="*{id}"/> <div class="form-group"> <label>제목</label> <div class="col-sm-12"> <input type="text" style="border-radius: 5px;" class="form-control" th:field="*{title}" placeholder="제목을 입력해 주세요."/> </div> </div> <div class="form-group"> <label>이름</label> <div class="col-sm-12"> <input type="text" style="border-radius: 5px;" class="form-control" th:field="*{name}"placeholder="이름을 입력해 주세요."/> </div> </div> <div class="form-group"> <label>내용</label> <div class="col-sm-12"> <textarea class="form-control" style="height: 300px; border-radius: 5px;" th:field="*{content}" placeholder="내용을 입력해 주세요."></textarea> </div> </div> <div class="btn_wrap text-center"> <a th:href="@{/}" class="btn btn-default waves-effect waves-light">뒤로가기</a> <button type="submit" class="btn btn-primary waves-effect waves-light">저장하기</button> </div> </form></div> 수정페이지로 이동하기데이터를 수정위해서 URL경로를 통해 수정할 데이터의 id값을 받아온 후 해당 id값을 이용해 데이터를 조회한 뒤 기존 데이터를 반환하도록 한다. 내부 로직은 상세페이지를 가져오는 것과 똑같고 반환하는 템플릿만 다르게 반환한다. PostController.java @GetMapping("/post/{postId}/revise")public String getPostDetailsToRevise(@PathVariable("postId") Long id, Model model) { Post post = postService.getPostById(id); PostDto postDto = PostDto.builder() .id(post.getId()) .name(post.getName()) .title(post.getTitle()) .content(post.getContent()) .writeTime(post.getWriteTime()) .build(); model.addAttribute("postDto", postDto); return "post";} PostControllerTest.java

0

Spring Boot 게시판 만들기 8 - 상세 페이지

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head th:replace="/fragments/head :: main-head"></head><body class="bg-light"><nav th:replace="/fragments/navbar :: main-nav"></nav><div class="container col-lg-6 "> <h2>상세 페이지</h2> <div class="card" style="padding: 20px; border-radius: 15px; margin: 20px auto;"> <form class=" form-horizontal" method="post" th:object="${postDto}"> <h1 th:text="*{title}">제목</h1> <span>작성자 : </span> <span th:text="*{name}">Tester </span> <hr> <p class="lead" style="height: 300px; border-radius: 5px;" th:text="*{content}"></p> <hr> <div class="text-right" style="padding-right: 10px;"> <span class="text-right">작성일 : </span> <span class="text-right" th:text="*{writeTime}">작성일 </span> </div> <hr> <div class="btn_wrap text-center"> <a href="#" class="btn btn-default waves-effect waves-light">뒤로가기</a> <button type="submit" class="btn btn-primary waves-effect waves-light">수정하기</button> <button type="submit" class="btn btn-danger waves-effect waves-light">삭제하기</button> </div> </form> </div></div></body></html>

0

Spring Boot 게시판 만들기 7 - 특정 페이지를 가져오기

7. 특정 포스트를 불러오기특정 포스트 불러오기 요청 처리하기 PostController @GetMapping("/post/{postId}")public String getPostDetails(@PathVariable("postId")Long id, Model model){ Post post = postService.getPostById(id); PostDto postDto = PostDto.builder() .id(post.getId()) .name(post.getName()) .title(post.getTitle()) .content(post.getContent()) .writeTime(post.getWriteTime()) .build(); model.addAttribute("postDto", postDto); return "details";} PostControllerTest.java @Test@DisplayName("상세 페이지를 가져온다.")public void getPostDetails() throws Exception{ Post mockPost = Post.builder() .id(1L) .name("tester") .title("test") .content("test") .writeTime(LocalDateTime.now()) .build(); given(postService.getPostById(any())).willReturn(mockPost); ResultActions resultActions = mockMvc.perform(get("/post/1")); resultActions .andExpect(status().isOk()); verify(postService).getPostById(any());} PostControllerTest.java @Test@DisplayName("상세 페이지를 못 가져온다.")public void getPostDetailsException() throws Exception{ given(postService.getPostById(any())).willThrow(new PostNotExistedException(1L)); ResultActions resultActions = mockMvc.perform(get("/post/1")); resultActions .andExpect(status().isNotFound()); verify(postService).getPostById(any());} 포스트가 없는 경우에 대한 예외처리하기

0

Spring Boot 게시판 만들기 6 - 게시판 페이지 만들기

게시판 페이지 템플릿게시판 페이지도 게시판 작성페이지와 똑같이 Bootstrap 과 BootWatch 를 이용해 만들었다. <!DOCTYPE html><html lang="ko"><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="./css/bootstrap.css"> <link rel="stylesheet" href="./css/custom.min.css"> <title>게시글 작성 페이지</title></head><body class="bg-light"><nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top"> <a class="navbar-brand" href="#">게시판</a></nav><div class="container col-lg-6 "> <form class="form-inline my-2 my-lg-0 float-right" style="padding-bottom : 16px;"> <input class="form-control mr-sm-2" type="text" placeholder="Search"> <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button> </form> <div class="table-responsive clearfix"> <table class="table table-hover"> <thead> <tr> <th>번호</th> <th>제목</th> <th>작성자</th> <th>등록일</th> </tr> </thead> <tbody> <tr> </tr> </tbody> </table> <div class="btn_wrap text-right"> <a href="#" class="btn btn-primary waves-effect waves-light">Write</a> </div> <div class="text-center "> <ul class="pagination" style="justify-content: center;"> <li class="page-item disabled"> <a class="page-link" href="#">&laquo;</a> </li> <li class="page-item active"> <a class="page-link" href="#">1</a> </li> <li class="page-item"> <a class="page-link" href="#">2</a> </li> <li class="page-item"> <a class="page-link" href="#">3</a> </li> <li class="page-item"> <a class="page-link" href="#">4</a> </li> <li class="page-item"> <a class="page-link" href="#">5</a> </li> <li class="page-item"> <a class="page-link" href="#">&raquo;</a> </li> </ul> </div> </div></div></body></html> 타임리프 문법 적용하기<!DOCTYPE html><html lang="ko" xmlns:th="http://www.thymeleaf.org"><head th:replace="fragments/head :: main-head"/><body class="bg-light"><nav th:replace="fragments/navbar :: main-nav"/><div class="container col-lg-6 "> <form class="form-inline my-2 my-lg-0 float-right" style="padding-bottom : 16px;"> <input class="form-control mr-sm-2" type="text" placeholder="Search"> <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button> </form> <div class="table-responsive clearfix"> <table class="table table-hover"> <thead class="text-center"> <tr> <th>번호</th> <th>제목</th> <th>작성자</th> <th>등록일</th> <th >수정/삭제</th> </tr> </thead> <tbody class="text-center"> <tr th:each="Post:${PostList}"> <td class="align-middle" th:text="${PostStat.index+1}"></td> <td class="align-middle"> <a th:text="${Post.title}"></a> </td> <td class="align-middle" th:text="${Post.name}"></td> <td class="align-middle" th:text="${Post.writeTime}"></td> <td class="text-center align-middle"> <button class="btn btn-primary">수정</button> <button class="btn btn-danger">삭제</button> </td> </tr> </tbody> </table> <div class="btn_wrap text-right"> <a href="#" class="btn btn-primary waves-effect waves-light">Write</a> </div> <div class="text-center "> <ul class="pagination" style="justify-content: center;"> <li class="page-item disabled"> <a class="page-link" href="#">&laquo;</a> </li> <li class="page-item active"> <a class="page-link" href="#">1</a> </li> <li class="page-item"> <a class="page-link" href="#">2</a> </li> <li class="page-item"> <a class="page-link" href="#">3</a> </li> <li class="page-item"> <a class="page-link" href="#">4</a> </li> <li class="page-item"> <a class="page-link" href="#">5</a> </li> <li class="page-item"> <a class="page-link" href="#">&raquo;</a> </li> </ul> </div> </div></div></body></html>