Database/MongoDB

[MongoDB/Spring Boot] MongoDB 활용 예제

공대생안씨 2025. 1. 18. 15:56

1. Mongo DB

  • NoSQL 데이터베이스, 문서 지향 데이터베이스
    • NoSQL : ‘Not Only SQL’
    • RDBMS와는 데이터 저장 방식이 다름
    • 스키마가 고정되지 않아, 다양한 형태의 데이터 저장 가능
  • 구조화되지 않은 데이터나 반정형 데이터 (JSON, XML 등) 효과적 처리 가능
    • 데이터를 JSON과 유사한 BSON (바이너리 JSON) 형식으로 저장
  • 유연한 데이터 모델링 가능, 스키마가 변경되더라도 적응이 쉬움

 

1-1. Mongo DB 사용 이유 및 장점

  1. 유연한 스키마
    • 위에 언급했듯이 스키마가 고정되어 있지 않아, 데이터 구조 변경이 쉬움
  2. 데이터를 여러 서버에 분산 저장 가능 ⇒ 데이터 증가에 유연한 대응 가능
  3. 성능
    • 대량 데이터 읽고 쓰기가 빠름
    • 인덱스 및 샤딩 (sharding) 을 통해 쿼리 성능 최적화 가능
  4. 복잡한 쿼리 지원
  5. 실시간 데이터 처리하는 데 적합함 ⇒ 웹 애플리케이션, 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=이름
  • 확인을 위해 몇개의 샘플 유저 데이터를 삽입 후 진행함

⇒ ‘이름’을 포함하는 이름을 가진 유저 목록 조회됨을 확인!

 

⇒ ‘이름’이 이름에 포함되지 않은 데이터는 반환되지 않았음을 확인!