1. Springboot 연결
① 스프링부트 프로젝트 생성
- 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
② application.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을 추가
- 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 })
- BoardController 에서 데이터 전송 시 DB에 입력되도록 코드를 작성하였다. 이를 Postman 프로그램을 이용하여 제대로 전달되었는지 확인
2. CRUD
2.1 GET으로 DATA 보기
- postman으로 get 주소 (localhost:8080/board) 입력하여 데이터 확인
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 삭제)
- 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 |