intelliJ에 mongodb연결

brave_chicken·2024년 6월 11일

잇(IT)생 챌린지

목록 보기
69/90

ScoreController

@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";
    }
}

ScoreMongoDAO

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);
}

ScoreMongoDaoImpl

@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();
    }
}

ScoreRepository

//1번 매개변수 - ScoreDTO는 Document와 매핑될 자바객체
//2번 매개변수 - 기본키타입
//인터페이스만 정의하면 Spring과 spring data내부에서 ScoreRepository의 모든 메소드와 상속하는 인터페이스의
//모든 메소드를 구현한 구현체를 자동으로 만들어준다.
public interface ScoreRepository extends MongoRepository<ScoreDTO,String> {

}

ScoreMongoService

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);
}

ScoreMongoServiceImpl

@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);
    }
}

index

<!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>

list

<!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>

mongo_detail

<!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>

mongo_insert

<!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>

mongo_update

<!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">&gt;=</option>
			<option value="lt">&lt;</option>
			<option value="lte">&lt;=</option>
			

		</select>
		<h3>검색값:</h3>
		<input type="text" name="value" />
		<input type="submit" value="검색"/>
	</form>
</body>
</html>

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글