DataBase/Mongo DB

Mongo DB 3강 - Spring Boot 연결 / CRUD

상맹 2021. 9. 23. 16:52
반응형

1. Springboot 연결

① 스프링부트 프로젝트 생성

mongoapp 스타터 프로젝트 생성

 - Mongo DB nosql이기 때문에 JPA를 사용할수없다.

 - Spring Data MongoDB : 현재 사용할 꺼!, Spring 4.0 사용, thread는 아이디 응답할때 까지 가만히 있는다. 동기적 DB

 - Spring Data Reactive MongoDB : spring 5.0(Reactive)에 사용, 비동기식, thread 사용 X

 → 비동기 서버(스레드 1 개, 서버가 압도적 빠름) - Node.js (nio 지원) (express server), 스프링 5.0(비동기) / NoSQL

 → 스레드 기반(스레드 N 개, 문맥교환) / RDB

 

MongoDB 선택

 ② application.yml로 변경

yml로 변경

spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: greendb

 

③ main package 에서 domain package 생성

 - Board.java Class 생성

package com.cos.mongoapp.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Data;

@Data
@Document(collection = "board")
public class Board {
	
	@Id
	private String _id;
	private String title;
	private String content;
}

 - BoardRepository(Interface) 생성

package com.cos.mongoapp.domain;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface BoardRepository extends MongoRepository<Board, String>{

}

 - web package 생성 후 BoardCotroller 생성

package com.cos.mongoapp.web;

import java.util.List;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.cos.mongoapp.domain.Board;
import com.cos.mongoapp.domain.BoardRepository;
import com.cos.mongoapp.web.dto.BoardSaveDto;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor // DI
@RestController // 데이터 리턴 서버
public class BoardController {
	
	// DI
	private final BoardRepository boardRepository;
	
	@PutMapping("board/{id}")
	public void update(@RequestBody BoardSaveDto dto, @PathVariable String id) {
		
		Board board = dto.toEntity();
		board.set_id(id); // save함수는 같은 아이디면 수정한다.
		
		boardRepository.save(board);
	}
	
	@DeleteMapping("board/{id}")
	public int deleteById(@PathVariable String id) {
		
		boardRepository.deleteById(id); // 내부적으로 실행되다가 오류 Exception 발동
		
		return 1; // 1 : 성공, -1 : 실패
	}
	
	@GetMapping("/board/{id}")
	public Board findById(@PathVariable String id) {
		return boardRepository.findById(id).get();
	}
	
	@GetMapping("/board")
	public List<Board> findAll() { // 리턴을 JavaObject로 하면 스프링 내부적으로 JSON으로 자동 변환 해준다.
		return boardRepository.findAll();
	}
	
	@PostMapping("/board")
	public Board save(@RequestBody BoardSaveDto dto) { // {"title":"제목3","content":"내용3"}
		Board boardEntity = boardRepository.save(dto.toEntity());
		
		return boardEntity; // MessageConverter 발동 -> 자바오브제그를 Json 변환해서 응답함.
	}
		
	
	
}

Board sav(BoardSaveDto dto)시 데이터를 x-www-form-urlencoded로 받기 때문에 @RequestBody annotation을 추가

 application/json 타입으로 데이터 받게 한다.

- web package 내에 dto package 생성 후 BoardSaveDto를 만든다.

package com.cos.mongoapp.web.dto;

import com.cos.mongoapp.domain.Board;

import lombok.Data;

@Data
public class BoardSaveDto {
	private String title;
	private String content;
	
	public Board toEntity() {
		Board board = new Board();
		board.setTitle(title);
		board.setContent(content);
		return board;
	}
}

 ④ Web에서 확인하기 위해 데이터 삽입

MongoDB Enterprise > db.board.save({title:"제목1", content:"내용1"});
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.board.save({title:"제목2", content:"내용2"});
WriteResult({ "nInserted" : 1 })

http://localhost:8080/board 이동 결과 값

- BoardController 에서 데이터 전송 시 DB에 입력되도록 코드를 작성하였다. 이를 Postman 프로그램을 이용하여 제대로 전달되었는지 확인

Body 선택 → raw 선택 → JSON 선택 → 제목3, 내용3 입력 → Send
< Postman 결과 >
< 웹에서 결과 >

2. CRUD

 2.1 GET으로 DATA 보기

  - postman으로 get 주소 (localhost:8080/board) 입력하여 데이터 확인

3건의 데이터 확인

 2.2 Post 이용하여 DATA를 전송

@PostMapping("/board")
public Board save(@RequestBody BoardSaveDto dto)

 @RequestBody annotation에 의해서 데이터를 JSON형식으로 전송한다.

 * 규칙 - object를 return하면 json으로 바뀐다.

@PostMapping("/board")
public Board save(@RequestBody BoardSaveDto dto) { 
    
	Board boardEntity = boardRepository.save(dto.toEntity());
		
    ObjectMapper om = new ObjectMapper();
    String jsonData = null;
    try{
        jsonData = om.writeValueAsString(boardEntity);
    } catch(JsonProcessingException e){
        e.printStackTrace();
    }
        
	return jsonData; 
}

ObjectMapper는 Jackson 라이브러리 중 하나

* Jackson 라이브러리는 json으로 converting해주는 라이브러리

 

위와 같은 코드는 스프링이 생략가능 하게 만들어 다음과 같이 표현할 수 있다.

@PostMapping("/board")
public Board save(@RequestBody BoardSaveDto dto) { // {"title":"제목3","content":"내용3"}
	Board boardEntity = boardRepository.save(dto.toEntity());
		
	return boardEntity; // MessageConverter 발동 -> 자바오브젝트를 Json 변환해서 응답함.
}

 * MessageConverter 발동 → 자바오브젝트를 JSON으로 변환해서 응답함.

 - Postman 이용해서 DATA post 하기

결과

 

 2.3 DATA 한 건 찾기

@GetMapping("/board/{id}")
public Board findById(@PathVariable String id) {
	return boardRepository.findById(id).get();
}

 - id는 해시값이기 때문에 String Type

 - findById의 리턴타입은 optional, 그러나 지금은 중요하지 않으므로 .get()사용

 

 - postman 이용

 2.4 DATA 삭제하기

@PutMapping("board/{id}")
public void update(@PathVariable String id) {
	boardRepository.save(board);
}

 - deleteById는 삭제하는 것으로 return 값이 없다.

 - 그러나 내부적으로 실행되다가 오류가 발생하면 Exception을 터뜨린다. 그렇기에 삭제에 성공했을 시 숫자를 1을

   리턴하도록 코드를 설정한다.

@PutMapping("board/{id}")
public void update(@RequestBody BoardSaveDto dto, @PathVariable String id) {
		
	Board board = dto.toEntity();
	board.set_id(id); // save함수는 같은 아이디면 수정한다.
		
	boardRepository.save(board);
}

 - postman 이용해서 삭제하기(제목 4 삭제)

리턴값 1을 받아왔다.(성공적으로 삭제!)

 - get 을 이용하여 전체 데이터 조회 해보면 제목4의 데이터가 삭제

 

 2.5 DATA 수정하기

@PutMapping("board/{id}")
public void update(@RequestBody BoardSaveDto dto, @PathVariable String id) {
		
	Board board = dto.toEntity();
	board.set_id(id); // save함수는 같은 아이디면 수정한다.
		
	boardRepository.save(board);
}

 - postman 사용 (Put, Delete 사용하기 위함!)

 - 제목 1 DATA의 제목과 내용을 변경

  - 결과

 

반응형

'DataBase > Mongo DB' 카테고리의 다른 글

Mongo DB 6강 - 배열 연산자 (고급)  (0) 2021.09.27
Mongo DB 5강 - Update, Remove  (0) 2021.09.24
Mongo DB 4강 - Save, Find, 연산  (0) 2021.09.23
Mongo DB 2강 - RDBS vs NoSQL / 접속  (0) 2021.09.23
Mongo DB 1강 - 설치  (0) 2021.09.23