디펜던시 추가해서 boot_20220228로 제작

opm.xml에 디펜던시 추가
<!-- mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- web server 실제로 web을 크롬에서 오는 주소를 인식해서 표시해주는-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- jsp에서 사용하기 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
환경설정 // 파일명 resources/application.properties
# 파일명 : resources/application.properties
# 포트번호 설정
server.port=8080
# devtools 설정
spring.devtools.livereload.enabled=true
# jsp위치 설정(어느폴더에 어떤 확장자)
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.jsp
# db연결
spring.data.mongodb.uri=mongodb://id219:pw219@1.234.5.158:37017/db219
spring.data.mongodb.database=db219
bootstrap

다운로드 후 압출 풀고 vs코드에 static폴더 안에 드레그
파일명 HomeController.java
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
// 크롬에서 주소를 입력한게 일치하면
// 밑에 있는 메소드라 실행
@GetMapping(value = {"/","/home"})
public String homeGET(){
// home.jsp를 표시하라
return "home";
}
}
실행 순서
insert.jar(웹에 보여질 화면)에서 name값을 받고
받은 내용을 MemberController.java파일에 Member mem으로 받음
받은 내용은 Member.java의 형식으로 Member에 저장
저장된 Member을 MemberDBImpl.java에서 member변수로 DB에 연동
member을 MemberDB.java에 MemberDB클래스로 사용
최종적으로 MemberController.java에서 실행

파일명 Boot20220228Application
package com.example.boot_20220228;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.controller","com.example.service"})
public class Boot20220228Application {
public static void main(String[] args) {
SpringApplication.run(Boot20220228Application.class, args);
}
}
파일명 Member.java
package com.example.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@NoArgsConstructor
@ToString
@Document(collection = "member3")
public class Member {
@Id // DB에 _id로 저장
private String id = null;
// @Field(name = "password") // 변수명을 데이터베이스에서 다르게 저장할 경우 사용
private String pw = null;
private String pw1 = null;
private String name = null;
private int age = 0;
}
insert.jsp(화면에 보여질 내용)
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>member</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}"/>
<script type="text/javascript" src="@{/js/bootstrap.min.js}"></script>
</head>
<body>
<h3>member insert</h3>
<hr />
<div style="padding: 20px;">
<form th:action="@{/member/insert}" method="post">
<label style="width:75px; height: 30px; display:inline-block;">아이디 : </label>
<input type="text" placeholder="아이디" name="id"/></br>
<label style="width:75px; height: 30px; display:inline-block;">암호 : </label>
<input type="password" placeholder="암호" name="pw"/></br>
<label style="width:75px; height: 30px; display:inline-block;">암호확인 : </label>
<input type="password" placeholder="암호확인" name="pw1"/></br>
<label style="width:75px; height: 30px; display:inline-block;">이름 : </label>
<input type="text" placeholder="이름" name="name"/></br>
<label style="width:75px; height: 30px; display:inline-block;">나이 : </label>
<input type="text" placeholder="나이" name="age"/></br>
<label style="width:75px; height: 30px; display:inline-block;"></label>
<input type="submit" class="btn btn-primary" value="회원가입" />
</form>
</div>
</body>
</html>
파일명 select.jsp (화면에 보여질 내용)
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원목록</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}"/>
<script type="text/javascript" src="@{/js/bootstrap.min.js}"></script>
</head>
<body>
<div style="padding: 20px;">
<h3>member list</h3>
<hr />
<table class="table">
<tr>
<th>아이디</th>
<th>이름</th>
<th>나이</th>
<th>버튼</th>
</tr>
<tr th:each="tmp, idx : ${list}">
<td th:text="${tmp.id}"></td>
<td th:text="${tmp.name}"></td>
<td th:text="${tmp.age}"></td>
<td>
<a th:href="@{/member/update( id=${tmp.id} )}">수정</a>
<a th:href="@{/member/delete( id=${tmp.id} )}">삭제</a>
<form th:action="@{/member/delete}" method="get">
<input type="hidden" name="id" valut="${tmp.id}" />
<input type="submit" value="삭제1">
</form>
</td>
</tr>
</table>
</div>
</body>
</html>
파일명 update.jsp(화면에 보여질 내용)
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원수정</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}"/>
<script type="text/javascript" src="@{/js/bootstrap.min.js}"></script>
</head>
<body>
<div style="padding: 20px;">
<h3>member update</h3>
<hr />
<form th:action="@{/member/update}" method="post">
<label style="width:75px; height: 30px; display:inline-block;">아이디 : </label>
<input type="text" th:value="${member.id}" name="id" readonly /></br>
<label style="width:75px; height: 30px; display:inline-block;">이름 : </label>
<input type="text" th:value="${member.name}" name="name" /></br>
<label style="width:75px; height: 30px; display:inline-block;">나이 : </label>
<input type="text" th:value="${member.age}" name="age" /></br>
<label style="width:75px; height: 30px; display:inline-block;"></label>
<input type="submit" class="btn btn-primary" value="수정하기" />
</form>
</div>
</body>
</html>
파일명 MemberController.java
package com.example.controller;
import java.util.List;
import com.example.entity.Member;
import com.example.service.MemberDB;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value = "/member") // 중간에 도메인을 묶어서 사용
public class MemberController {
// DB에 일의 수행하는 클래스
// 클래스명 obj = new 클래스명();
@Autowired
public MemberDB memberDB;
// 127.0.0.1:8080/member/update?id=1
@GetMapping(value = {"update"})
public String updateGET(
Model model,
@RequestParam(name = "id") String id){
// DB에서 내용을 가져오기
Member member = memberDB.selectOneMember(id);
// jsp로 전달해줌
model.addAttribute("member", member);
return "member/update"; // 표시할 jsp파일명 확장자X
}
// id, name,age
@PostMapping(value = "/update")
public String updatePOST(@ModelAttribute Member member){
System.out.println(member.toString());
int ret = memberDB.updateMember(member);
if(ret == 1 ){
// post에서는 jsp를 표시X
// redirect를 이용하여 주소를 변경
// 127.0.0.1:8080/member/selectlist
return "redirect:/member/selectlist";
}
// 127.0.0.1:8080/member/update?id=1
return "redirect:/member/update?id=" + member.getId();
}
// 127.0.0.1:8080/member/delete?id=1
// <form action="" method="get">
// <input type="text" name="id" valut="1" />
// <form>
// <a href="/member/delete?id=aaa">버튼</a>
@GetMapping(value = {"delete"})
public String deleteGET(@RequestParam(name = "id") String id ){
int ret = memberDB.deleteMember(id);
if(ret == 1){ //성공
return "redirect:/member/selectlist";
}
// 실패
return "redirect:/member/selectlist";
}
// 127.0.0.1:8080/member/selectlist
@GetMapping(value = {"/selectlist"})
public String selectlistGET(Model model){
// 1. DB에서 목록 받아오기
List<Member> list = memberDB.selectListMember();
// 2. jsp로 전달하기
model.addAttribute("list", list);
// 3. member폴더의 select.jsp를 표시하라
return "member/select";
}
// 127.0.0.1:8080/member/insert
@GetMapping(value = {"/insert"})
public String insertGET(){
// member폴더에 있는 insert.jsp로 생성
return "member/insert";
}
// post는 사용자가 입력한 내용이 전달되고 DB작업을 위해서 필요한 시점
// jsp를 표시하는게 아니라 주소창에 입력후 엔터키를 누름
@PostMapping(value = {"/insert"})
public String insertPOST( @ModelAttribute Member mem // 아래 @RequestParam 부분을 한번에 묶음
// @RequestParam(name = "id") String id,
// @RequestParam(name = "pw") String pw,
// @RequestParam(name = "pw1") String pw1,
// @RequestParam(name = "name") String name,
// @RequestParam(name = "age") int age
){
System.out.println(mem.toString());
memberDB.insertMember(mem);
// DB에 추가하기 // 위쪽에 @ModelAttribute로 한번에 실행
// 클래스명 mem = new 생성자();
// Member mem = new Member();
// mem.setId(id);
// mem.setName(name);
// 주소창에 /member/insert를 입력후 엔터키를 누르는것과 같은 역할
return "redirect:/member/insert"; // redirect => 페이지 이동
}
}
파일명 MemberDB.java
package com.example.service;
import java.util.List;
import com.example.entity.Member;
import org.springframework.stereotype.Service;
// DB와 연동하는 부분 구현하는 설계부분
@Service
public interface MemberDB {
// 삭제, 수정, 추가의 리턴은 int
// 추가할 내용을 member로 주면 추가한 후에 실제 추가된 내용을 반환
public Member insertMember( Member member );
// 회원 전체 목록(page, search X)
public List<Member> selectListMember();
// 회원 1명 삭제 (회원 아이디가 오면 삭제후 -1, 0 또는 1로 리턴)
public int deleteMember(String id);
// 회원 1명 조회하기
public Member selectOneMember(String id);
// 회원 정보 변경
public int updateMember(Member member);
}
파일명 MemberDBImpl.java
package com.example.service;
import java.util.List;
import com.example.entity.Member;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
// DB연동을 실제로 수행하는 구현부
// 구현부는 프레임워크에 따라서 안만듬..
@Service
public class MemberDBImpl implements MemberDB {
// 환경설정으로 생성된 객체를 가져옴
// MongoTemplate mongodb = new MongoTemplate();
@Autowired
private MongoTemplate mongodb;
@Override
public Member insertMember(Member member) {
try {
return mongodb.insert(member);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public List<Member> selectListMember() {
try {
Query query = new Query();
return mongodb.find(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public int deleteMember(String id) {
try {
Member member = new Member();
member.setId(id);
DeleteResult result = mongodb.remove(member);
if(result.getDeletedCount() == 1L){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public Member selectOneMember(String id) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return null;
}
}
@Override
public int updateMember(Member member) {
try {
// query 조건
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(member.getId());
query.addCriteria(criteria);
// update수정할 설정
Update update = new Update();
update.set("name", member.getName());
update.set("age", member.getAge());
UpdateResult result = mongodb.updateFirst(query, update, Member.class);
if(result.getMatchedCount() == 1L){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return -1;
}
}
}