1. Mongo DB
- NoSQL 데이터베이스, 문서 지향 데이터베이스
- NoSQL : ‘Not Only SQL’
- RDBMS와는 데이터 저장 방식이 다름
- 스키마가 고정되지 않아, 다양한 형태의 데이터 저장 가능
- 구조화되지 않은 데이터나 반정형 데이터 (JSON, XML 등) 효과적 처리 가능
- 데이터를 JSON과 유사한 BSON (바이너리 JSON) 형식으로 저장
- 유연한 데이터 모델링 가능, 스키마가 변경되더라도 적응이 쉬움
1-1. Mongo DB 사용 이유 및 장점
- 유연한 스키마
- 위에 언급했듯이 스키마가 고정되어 있지 않아, 데이터 구조 변경이 쉬움
- 데이터를 여러 서버에 분산 저장 가능 ⇒ 데이터 증가에 유연한 대응 가능
- 성능
- 대량 데이터 읽고 쓰기가 빠름
- 인덱스 및 샤딩 (sharding) 을 통해 쿼리 성능 최적화 가능
- 복잡한 쿼리 지원
- 실시간 데이터 처리하는 데 적합함 ⇒ 웹 애플리케이션, IoT, 빅데이터 분석 등 다양하게 사용됨
2. Spring Boot, Mongo DB 활용 예제
2-1. MongoDB Atlas 가입 및 기본 설정
- MongoDB Atlas
- 클라우드 기반 데이터베이스 서비스
- MongoDB 배포, 관리를 도와주는 플랫폼
2-1-1. 회원가입
https://account.mongodb.com/account/login
위의 링크로 회원가입 진행
2-1-2. Organization 생성
- 회원가입을 진행하면 Organization이 자동으로 생성됨
- 만약 다른 organization을 생성하고 싶다면 추가적으로 생성하면 됨
2-1-3. Project 생성
1. 톱니바퀴 버튼을 눌러 Organization의 설정으로 이동
2. 좌측의 Projects 탭 클릭 → New Project 클릭
3. 이름 입력 (태그는 선택적으로 입력) → Next 클릭
4. Project 접근 멤버 추가 (없다면 스킵) → Create Project 클릭
2-1-4. Cluster 생성
1. 홈 화면에서 Create a cluster의 Create 버튼 클릭
2. 가격 선택 (여기서는 무료 선택)
3. 정보 기입 → Create Deployment 클릭
- Name: Cluster 이름
- Provider: AWS
- Region: Seoul(ap-northeast-2)
4. Network Access 설정 (스킵 가능)
- 현재는 내 개인 ip만 접근 가능하게 설정되어 있음 ⇒ 모든 ip가 접근 가능하게 설정하는 단계임
4-1. Network Access 클릭
4-2. 내 ip 주소에서 edit 클릭
4-3. ALLOW ACCESS FROM ANYWHERE 클릭 → confirm 클릭
5. 다시 돌아와서 database user 생성
- 첫 user 생성 시 admin으로 만들어야 함
- Username, password 입력 → Copy 클릭 → Create Database User 클릭 → Choose a connection method 클릭
6. Drivers 클릭
- Compass 클릭 후 MongoDB의 GUI를 통해 DB 관리도 가능함
7. 자바 버전 선택 → connection string 복사
- 입력되지 않은 정보 기입 후 application.properties나 application.yml 등에 붙여 넣을 것임
2-2. Spring Boot, MongoDB 활용 예제
- 간단하게 유저 관련 가입, 조회와 관련한 예제
2-2-1. 데이터베이스 생성
1. Atlas MongoDB 홈 화면에서 Browse Collections 클릭
2. Create Database 클릭
- 샘플 데이터베이스가 존재할 것임
3. 데이터베이스, 컬렉션 정보 기입 후 Create 클릭
컬렉션
- MongoDB에서 데이터베이서 내에 존재하는 문서 (Document)의 그룹
- 관계형 데이터베이스에서의 테이블과 유사한 개념임
- 유저 관련 예제이므로 유저 관련 컬렉션 생성함
4. 데이터베이스 생성 확인
2-2-2. build.gradle
- mongoDB 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' // mongoDB 의존성 추가
}
2-2-3. application.yml 설정
spring:
data:
mongodb:
uri: [복사해 둔 uri를 수정해서 붙여넣기]
uri
- 기존 복사해 둔 uri는 아래와 같은 형식임
mongodb+srv://[유저id]:[db비밀번호]@[클러스터 uri]/[db 이름]?retryWrites=true&w=majority&appName=MyCluster
- [db비밀번호]와 [db 이름] 을 채워서 applicaton.yml에 넣을 것!
ex) mongodb+srv://chm2006:[db 비밀번호]@mycluster.wtuen.mongodb.net/[db이름]?retryWrites=true&w=majority&appName=MyCluster
2-2-4. User
@Document(collection = "User") // mongoDB에서 생성한 컬렉션 이름
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
private String id;
private String name;
private String loginId;
private String password;
public User(String name, String loginId, String password) {
this.name = name;
this.loginId = loginId;
this.password = password;
}
}
- JPA 사용 시의 엔티티와 매우 유사함
- @Entity가 아닌 @Document 사용
- @Id에 해당하는 필드는 Object 타입 혹은 String 타입으로 생성할 것!
2-2-5. UserRepository
public interface UserRepository extends MongoRepository<User, String> {
List<User> findUsersByNameContains(String name);
}
- JpaRepository와 매우 유사함
- MongoRepository<Document, Id 타입> 을 상속!
- 기본적인 crud 기능이 내장
2-2-6. UserService
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public String saveUser(UserRequestDto userRequestDto) {
User user = new User(userRequestDto.getName(), userRequestDto.getLoginId(), userRequestDto.getPassword());
User savedUser = userRepository.save(user);
return savedUser.getId();
}
public List<UserResponseDto> findUserByName(String name) {
List<User> usersByNameContains = userRepository.findUsersByNameContains(name);
List<UserResponseDto> results = new ArrayList<>();
for (User user : usersByNameContains) {
UserResponseDto dto = new UserResponseDto(user.getName(), user.getLoginId());
results.add(dto);
}
return results;
}
}
- user 저장 메서드, 이름 포함하는 user 조회 메서드 2개 생성함
2-2-7. DTO
- UserRequestDto
@Getter
public class UserRequestDto {
private String name;
private String loginId;
private String password;
}
- UserResponseDto
@Getter
@AllArgsConstructor
public class UserResponseDto {
private String name;
private String loginId;
}
2-2-8. UserController
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/user")
public String save(@RequestBody UserRequestDto userRequestDto) {
return userService.saveUser(userRequestDto);
}
@GetMapping("/user")
public List<UserResponseDto> find(@RequestParam("name") String name) {
return userService.findUserByName(name);
}
}
2-3. 결과 확인
2-3-1. 유저 생성
- [POST] localhost:8080/user
⇒ 생성된 user의 Id를 반환함을 확인!
⇒ 데이터베이스에도 저장됨을 확인!
2-3-2. 유저 조회
- [GET] localhost:8080/user?name=이름
- 확인을 위해 몇개의 샘플 유저 데이터를 삽입 후 진행함
⇒ ‘이름’을 포함하는 이름을 가진 유저 목록 조회됨을 확인!
⇒ ‘이름’이 이름에 포함되지 않은 데이터는 반환되지 않았음을 확인!