@Controller
@RequestMapping("/score")
@RequiredArgsConstructor
public class ScoreController {
private final ScoreMongoService service;
@GetMapping("/list")
public String mongolist(Model model){
List<ScoreDTO> list = service.findAll();
model.addAttribute("mongolist",list);
return "mongo/list";
}
//insert
@GetMapping("/insert")
public String insertPage(){
return "mongo/mongo_insert";
}
@PostMapping("/insert")
public String insert(ScoreDTO document){
System.out.println("컨트롤러:"+document);
service.insertDocument(document);
return "redirect:/score/list";
}
@GetMapping("/multi/insert")
//동일한 형식의 입력데이터가 여러 개인 경우 파라미터를 동일한 이름으로 정의하고 형식에 맞게 DTO를 만들면 자동으로 List에 DTO가 담긴 형식으로 만들어진다.
public String multiInsert(){
List<ScoreDTO> docs = new ArrayList<>();
ScoreDTO document = null;
//임의로 10개의 데이터를 생성하는 코드이므로 나중에 쓰지 않아도 되는 코드
for(int i=1;i<=10;i++){
document = new ScoreDTO(null, "multi"+i, "multi"+i, "전산실", "서울특별시", 100, 100);
docs.add(document);
}
service.insertAllDocument(docs);
return "redirect:/score/list";
}
@GetMapping("/paginglist")
public String pagelist(@RequestParam("pageNo") String pageNo, Model model){
List<ScoreDTO> pagelist = service.findAll(Integer.parseInt(pageNo));
model.addAttribute("mongolist",pagelist);
return "mongo/list";
}
//검색
@GetMapping("/search")
public String searchPage(){
return "mongo/search";
}
@PostMapping("/search")
public String search(@RequestParam("field") String field,
@RequestParam("criteria") String criteria,
@RequestParam("value") String value, Model model){
List<ScoreDTO> searchlist = service.findCriteria(field+","+criteria,value);
// List<ScoreDTO> searchlist = service.findCriteria(field,value);
model.addAttribute("mongolist",searchlist);
return "mongo/list";
}
@GetMapping("/read")
public String read(@RequestParam("key") String key,
@RequestParam("value") String value,
@RequestParam("action") String action,
Model model){
System.out.println(key+","+value+","+action);
ScoreDTO document = service.findById(key, value);
String view="";
if(action.equals("read")){
view = "mongo/mongo_detail";
}else {
view = "mongo/mongo_update";
}
model.addAttribute("document",document);
return view;
}
@GetMapping("/read2")
public String read2(@RequestParam("value") String value,
@RequestParam("action") String action, Model model){
System.out.println("============");
ScoreDTO document = service.findById(value);
String view="";
if(action.equals("read")){
view = "mongo/mongo_detail";
}else {
view = "mongo/mongo_update";
}
model.addAttribute("document",document);
return view;
}
@PostMapping("/update")
public String update(ScoreDTO document){
System.out.println("&____**"+document);
service.update(document);
return "redirect:/score/paginglist?pageNo=0";
}
}
public interface ScoreMongoDAO {
public ScoreDTO findById(String value);
public List<ScoreDTO> findCriteria(String key, String value);
public ScoreDTO findById(String key,String value);
public void insertDocument(ScoreDTO doc);
public void insertAllDocument(List<ScoreDTO> docs);
public void update(ScoreDTO document);
public void test1();
public List<ScoreDTO> findAll();
public List<ScoreDTO> findAll(int pageNo);
}
@Repository
@RequiredArgsConstructor
public class ScoreMongoDaoImpl implements ScoreMongoDAO{
//spring-data-mongodb에서 제공하는 몽고디비의 핵심클래스 - 데이터를 제어할 수 있는 기능을 제공하는 클래스
//Mybatis의 SqlSession클래스와 유사
private final MongoTemplate mongoTemplate;
private final ScoreRepository repository;
@Override
public ScoreDTO findById(String value) {//기본키조회(_id필드값)
return repository.findById(value).get();
}
@Override
public ScoreDTO findById(String key, String value) {
//id로 조회할 수 있도록 작업
//search와 동일하게 조건을 적용해서 검색
//mongoTemplate의 findOne메소드를 이용해보기
Criteria criteria = new Criteria(key);
criteria.is(value);
Query query = new Query(criteria);
ScoreDTO document = mongoTemplate.findOne(query,ScoreDTO.class,"score");
return document;
}
@Override
public List<ScoreDTO> findCriteria(String key, String value) {
//Query는 조건정보를 담고 있는 클래스
//1. 선택한 key(필드)에 따른 value가 정확하게 일치하는 document를 검색
System.out.println(key+"-----------"+value);
//Criteria 객체는 조건을 어떤 필드에 어떻게 ㅈ거용할 것인지 정보를 담고 있는 객체
//Criteria 객체를 이용해서 Query객체를 만들어서 MongoTemplate의 find를 호출
// Criteria criteria = new Criteria(key);
// criteria.is(value);
//2. key(필드)와 조건을 value와 함께 적용
String[] data = key.split(",");
// Criteria criteria = new Criteria(data[0]);
// if(data[1].equals("is")){
// criteria.is(value);
// }else if(data[1].equals("gt")){
// criteria.gt(Integer.parseInt(value));
// }else if(data[1].equals("lt")){
// criteria.lt(Integer.parseInt(value));
// }
//3. Query클래스의 where메소드를 이용해서 처리
// Query query = new Query();
// query.addCriteria(Criteria.where(data[0]).lte(Integer.parseInt(value)));
//4. 정규표현식으로 검색
Criteria criteria = new Criteria(data[0]);
//^ => 해당 필드의 값 중 ^ 다음의 문자열로 시작하는 데이터 => like연산자와 동일 where dept like '인사%'
//dept like '%사%'
//criteria.regex("^"+value);
//.은 정규표현식에서 0개 이상의 임의의 문자를 나타내는 패턴문자열
criteria.regex(".*"+value+".*");
Query query = new Query(criteria);
List<ScoreDTO> list = mongoTemplate.find(query,ScoreDTO.class,"score");
System.out.println(list);
return list;
}
@Override
public void insertDocument(ScoreDTO doc) {
//도큐먼트 한 개 삽입
mongoTemplate.insert(doc);
}
@Override
public void insertAllDocument(List<ScoreDTO> docs) {
//도큐먼트 여러 개 삽입
mongoTemplate.insertAll(docs);
}
@Override
public void update(ScoreDTO document) {
//조건에 만족하는 document를 수정
//조건 정보를 담고 있는 객체
Criteria criteria = new Criteria("id");
criteria.is(document.getId());
Query query = new Query(criteria);
//업데이트기능을 수행하는 객체를 생성하고 적절한 값을 셋팅
Update update = new Update();
update.set("dept",document.getDept());
update.set("addr",document.getAddr());
mongoTemplate.updateMulti(query,update,"score");
}
@Override
public void test1() {
}
@Override
public List<ScoreDTO> findAll() {
System.out.println("=============================");
List<ScoreDTO> list = mongoTemplate.findAll(ScoreDTO.class,"score");
System.out.println(list);
return list;
}
@Override
public List<ScoreDTO> findAll(int pageNo) {
//PagingAndSortingRepository의 findAll메소드를 호출하면 페이징 처리가 된 객체를 전달받을 수 있다.
//PagingAndSortingRepository의 findAll메소드 내부에서 페이징처리를 자동으로 구현해준다.
//pageNo => 몇번째 페이지인지
//pageSize => 한 페이지에 출력할 도큐먼트의 갯수
//Sort객체
Sort sort = Sort.by("property").ascending();//오름차순정렬
Page<ScoreDTO> page = repository.findAll(PageRequest.of(pageNo,10,sort));
//Page객체에서 한 페이지에 출력할 document를 꺼내서 리턴하기
return page.getContent();
}
}
//1번 매개변수 - ScoreDTO는 Document와 매핑될 자바객체
//2번 매개변수 - 기본키타입
//인터페이스만 정의하면 Spring과 spring data내부에서 ScoreRepository의 모든 메소드와 상속하는 인터페이스의
//모든 메소드를 구현한 구현체를 자동으로 만들어준다.
public interface ScoreRepository extends MongoRepository<ScoreDTO,String> {
}
public interface ScoreMongoService {
public ScoreDTO findById(String value);
public ScoreDTO findById(String key, String value);
public void insertDocument(ScoreDTO doc);
public void insertAllDocument(List<ScoreDTO> docs);
public List<ScoreDTO> findCriteria(String key,String value);
public void update(ScoreDTO document);
public void test1();
public List<ScoreDTO> findAll();
public List<ScoreDTO> findAll(int pageNo);
}
@Service
@RequiredArgsConstructor
public class ScoreMongoServiceImpl implements ScoreMongoService{
private final ScoreMongoDAO dao;
@Override
public ScoreDTO findById(String value) {
return dao.findById(value);
}
@Override
public ScoreDTO findById(String key, String value) {
return dao.findById(key, value);
}
@Override
public void insertDocument(ScoreDTO doc) {
dao.insertDocument(doc);
}
@Override
public void insertAllDocument(List<ScoreDTO> docs) {
dao.insertAllDocument(docs);
}
@Override
public List<ScoreDTO> findCriteria(String key, String value) {
return dao.findCriteria(key,value);
}
@Override
public void update(ScoreDTO document) {
dao.update(document);
}
@Override
public void test1() {
}
@Override
public List<ScoreDTO> findAll() {
return dao.findAll();
}
//페이징처리
@Override
public List<ScoreDTO> findAll(int pageNo) {
return dao.findAll(pageNo);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>몽고디비 테스트</h1>
<hr/>
<h3><a href="/mongodb/score/list">mongodb데이터조회</a></h3>
<h3><a href="/mongodb/score/paginglist?pageNo=0">mongodb데이터조회(페이징처리)</a></h3>
<h3><a href="/mongodb/score/insert">mongo document삽입하기</a></h3>
<h3><a href="/mongodb/score/multi/insert">여러개 document삽입하기</a></h3>
<h3><a href="/mongodb/score/search">검색</a></h3>
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Score(Mongo)</h1>
<hr/>
<table align="center" border="1" width="600">
<tr bgcolor="skyblue">
<th>아이디</th><th>자바</th><th>성명</th>
<th>주소</th><th>부서번호</th>
<th>삭제</th>
</tr>
<tr th:each="mongo:${mongolist}">
<td><a th:href="@{/score/read(key=id,value=${mongo.id},action=read)}" th:text="${mongo.id}"></a></td>
<td><a th:href="@{/score/read2(value=${mongo._id},action=read)}" th:text="${mongo._id}"></a></td>
<td th:text="${mongo.java}"></td>
<td th:text="${mongo.name}"></td>
<td th:text="${mongo.addr}"></td>
<td th:text="${mongo.dept}"></td>
<td>
<a href="mybatisDel.do?id=<%=user.getId() %>">삭제</a></td>
</tr>
<tr>
<td colspan="6">
<a href="/mongodb/score/paginglist?pageNo=0">1</a>
<a href="/mongodb/score/paginglist?pageNo=1">2</a>
<a href="/mongodb/score/paginglist?pageNo=2">3</a>
<a href="/mongodb/score/paginglist?pageNo=3">4</a>
<a href="/mongodb/score/paginglist?pageNo=4">5</a>
</td>
</tr>
</table>
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script
src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<form role="form" class="form-horizontal"
action="/mongodb/score/insert" method="POST">
<fieldset>
<div id="legend">
<legend>아래 양식을 작성해주세요.</legend>
</div>
<div class="form-group" >
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">아이디</label>
<span th:text="${document.id}"></span>
</div>
<div class="form-group" >
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">성명</label>
<span th:text="${document.name}"></span>
</div>
<div class="form-group" >
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">부서명</label>
<span th:text="${document.dept}"></span>
</div>
<div class="form-group" >
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">주소</label>
<span th:text="${document.addr}"></span>
</div>
<div class="form-group" >
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">자바점수</label>
<span th:text="${document.java}"></span>
</div>
<div class="form-group ">
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">서블릿</label>
<span th:text="${document.servlet}"></span>
</div>
<div class="form-group" >
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">spring</label>
</div>
<div class="form-group" >
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">보너스</label>
</div>
<div class="form-group">
<!-- Button -->
<div class="col-sm-3 col-sm-offset-2">
<input type="button"
value="수정하기"
th:onclick="|location.href='@{/score/read(key=id,value=${document.id},action=update)}'|" class="btn btn-success" />
</div>
</div>
</fieldset>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<form role="form" class="form-horizontal"
action="/mongodb/score/insert" method="POST">
<fieldset>
<div id="legend">
<legend>아래 양식을 작성해주세요.</legend>
</div>
<div class="form-group">
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">아이디</label>
<div class="col-sm-3">
<input type="text" id="orgcode" name="id"
placeholder="아이디" class="form-control"
required>
</div>
</div>
<div class="form-group">
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">성명</label>
<div class="col-sm-3">
<input type="text" id="name" name="name"
placeholder="성명" class="form-control" minlength="4" required>
</div>
</div>
<div class="form-group">
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">부서명</label>
<div class="col-sm-3">
<input type="text" id="dept" name="dept"
placeholder="부서명" class="form-control" >
</div>
</div>
<div class="form-group">
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">주소</label>
<div class="col-sm-3">
<input type="text" id="addr" name="addr"
placeholder="주소"
class="form-control" required>
</div>
</div>
<div class="form-group">
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">자바점수</label>
<div class="col-sm-3">
<input type="text" id="java" name="java"
placeholder="자바점수" class="form-control"
required>
</div>
</div>
<div class="form-group">
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">서블릿</label>
<div class="col-sm-3">
<input type="number" id="servlet" name="servlet"
placeholder="서블릿" class="form-control" required>
</div>
</div>
<div class="form-group">
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">spring</label>
<div class="col-sm-3">
<input type="text" id="spring" name="spring"
placeholder="spring" class="form-control" >
</div>
</div>
<div class="form-group">
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">보너스</label>
<div class="col-sm-3">
<input type="text" id="bonus" name="bonus"
placeholder="보너스"
class="form-control" required value="10000">
</div>
</div>
<div class="form-group">
<!-- Button -->
<div class="col-sm-3 col-sm-offset-2">
<input type="submit" value="가입하기" class="btn btn-success"/>
</div>
</div>
</fieldset>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script
src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<form role="form" class="form-horizontal"
action="/mongodb/score/update" method="POST">
<input type="hidden" th:name="id" th:value="${document.id}">
<fieldset>
<div id="legend">
<legend>아래 양식을 작성해주세요.</legend>
</div>
<div class="form-group" >
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">아이디</label>
<span th:text="${document.id}"></span>
</div>
<div class="form-group" >
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">성명</label>
<span th:text="${document.name}"></span>
</div>
<div class="form-group" >
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">부서명</label>
<input type="text" th:name="dept" th:value="${document.dept}"/>
</div>
<div class="form-group" >
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">주소</label>
<input type="text" th:name="addr" th:value="${document.addr}"/>
</div>
<div class="form-group" >
<!-- 부서코드 -->
<label class="control-label col-sm-2" for="orgcode">자바점수</label>
<span th:text="${document.java}"></span>
</div>
<div class="form-group ">
<!-- 부서명-->
<label class="control-label col-sm-2" for="orgname">서블릿</label>
<span th:text="${document.servlet}"></span>
</div>
<div class="form-group" >
<!-- 부서위치-->
<label class="control-label col-sm-2" for="orgloc">spring</label>
</div>
<div class="form-group" >
<!-- 전화번호-->
<label class="control-label col-sm-2" for="orgtel">보너스</label>
</div>
<div class="form-group">
<!-- Button -->
<div class="col-sm-3 col-sm-offset-2">
<input type="submit"
value="수정하기"
class="btn btn-success" />
</div>
</div>
</fieldset>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="/mongodb/score/search">
<h1>검색하기</h1>
검색할 필드선택: <select name="field">
<option value="name">성명</option>
<option value="id">아이디</option>
<option value="addr">주소</option>
<option value="dept">부서</option>
<option value="java">java</option>
<option value="spring">spring</option>
<option value="servlet">servlet</option>
<option value="bonus">bonus</option>
</select>
조건: <select name="criteria">
<option value="is">=</option>
<option value="gt">></option>
<option value="gte">>=</option>
<option value="lt"><</option>
<option value="lte"><=</option>
</select>
<h3>검색값:</h3>
<input type="text" name="value" />
<input type="submit" value="검색"/>
</form>
</body>
</html>
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.