본문 바로가기

MongoDB

MongoDB와 Spring Boot를 이용한 프로젝트 만들기 - 1

MongoDB와 Spring Boot를 이용하여 학생 관리 프로그램을 만들어 보는 것!

기능

  1. 학번을 검색하여 해당 학생을 검색
  2. 아무것도 입력 없이 검색하면 모든 학생을 검색
  3. 이름, 학년, 학과, 취미 중 하나를 입력하여 해당하는 학생들을 검색
  4. 이름, 학년, 학과, 취미를 입력하여 조건에 모두 해당하는 학생들을 검색
  5. 학생 정보를 입력하여 추가
  6. 학번을 입력하여 해당 학생 정보를 삭제
  7. 학번을 입력하고 학년, 이메일, 취미를 수정

spring initializr를 이용하여 프로젝트를 생성해 준다.

다음과 같은 dependencies를 추가하였다.

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// handlebars
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.4'

그리고

mongodb atlas로 데이터베이스를 생성해 준다.

연결하는 방법은 이 글을 확인!

 

스프링부트와 mongodb를 연결해보자!

https://account.mongodb.com/account/login?signedOut=true Cloud: MongoDB Cloud account.mongodb.com 로그인을 해준다! 이후 용도에 맞게 클러스터를 만들어준다음 우측에 있는 CONNECT를 클릭! Connect your application을 눌러서 s

thoughtlessly.tistory.com

application.yml이나 application.properties에 ID와 KEY를 넣고 github에 commit 해서 드러내지 않는 것이 좋을 것 같다.

따라서, intellij IDEA를 사용하는 경우 Edit Configurations를 누르고 Modify options를 눌러 Environment variablesIDKEY를 입력하여 숨기는 것이 좋을 것 같다. 다른 IDE 또한 방법이 있을 것이다.

${ID}, ${KEY}로 하여 ID와 KEY를 환경변수로 입력받도록 만들었다.

 

이제 연결이 되었는지 확인해 보기 위해 간단하게 테스트를 해보았다.

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

@Getter
@Setter
@Document("testCol")
public class studentInfo {

    @Id
    private String id;

    private String name;
    private int grade;
    private String gender;
    private String email;
    private org.bson.Document belong;
    private String[] hobby;

    public studentInfo(String id, String name, int grade, String gender, String email, org.bson.Document belong, String[] hobby) {
        super();
        this.id = id;
        this.name = name;
        this.grade = grade;
        this.gender = gender;
        this.email = email;
        this.belong = belong;
        this.hobby = hobby;
    }

}

먼저 학생 정보를 입력하고 쓰기 위한 모델을 만들었다.

@Documnet("test")로 연결된 DB에 test라는 이름의 collection을 사용한다.

그리고 @Id 어노테이션을 입력한 id를 중복 불가능한 _id로 사용하였다.

import com.mongodbspringboot.mongodbspringboot.model.studentInfo;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;

public interface studentInfoRepository extends MongoRepository<studentInfo, String> {

    @Query("{id: '?0'}")
    studentInfo findStudentInfoById(String id);

    public long count();

    @Query("{id: '?0'}")
    List<studentInfo> findAll(String id);
}

그리고 레포지토리를 만들었다.

@Query를 사용하여 id를 입력받아 해당 쿼리를 검색할 수 있게 하였고,

count() 메서드로 쿼리의 개수를 알 수 있게 하였고,

findAll()로 id를 가진 모든 쿼리를 List로 받아오도록 만들었다.

@SpringBootApplication
@EnableMongoRepositories

먼저 어노테이션을 써서 mongoRepository를 쓸 것을 명시하고

implements CommandLineRunner

간단히 정상 작동하는지를 보기 위한 것이니 CommandLineRunner로 구현해보려고 한다.

@Autowired
studentInfoRepository studentInfoRepository;

@Autowired 어노테이션을 사용하여 레포지토리를 주입하였다.

public void insertStudentInfo() {
        studentInfoRepository.save(
                new studentInfo(
                        "2015100930",
                        "aufsprit",
                        4,
                        "male",
                        "sio3@gmail.com",
                        new Document("coll_name", "컴퓨터학부").append("dept_name", "컴퓨터학과"),
                        new String[]{"게임","코딩"}
                )
        );
        studentInfoRepository.save(
                new studentInfo(
                        "2019201030",
                        "test",
                        3,
                        "male",
                        "test@gmail.com",
                        new Document("coll_name", "test1").append("dept_name", "test2"),
                        new String[]{"testtest","test"}
                )
        );
        studentInfoRepository.save(
                new studentInfo(
                        "2020094140",
                        "saltIs",
                        4,
                        "female",
                        "saltIsSalt@gmail.com",
                        new Document("coll_name", "간호학과").append("dept_name", "소아간호전공"),
                        new String[]{"피아노연주","요리"}
                )
        );
    }

먼저 정보를 저장하는 메서드를 만들어서 내용들이 입력되도록 만들었다.

public void selectInfoById(String id) {
        studentInfo studentInfo = studentInfoRepository.findStudentInfoById(id);
        System.out.println(getStudentInfoDetails(studentInfo));
    }

그리고 selectInfoById(String id)를 만들어서 레포지토리에 있는 findStudentInfoById()를 사용하여 학생을 검색, 출력하게 하였다.

public void selectAllInfo() {
        long count = studentInfoRepository.count();
        System.out.println("Entered number of student : " + count);
        studentInfoRepository.findAll().forEach(id -> System.out.println(getStudentInfoDetails(id)));
    }

다음은 레포지토리에서 count()findAll()을 이용하여 모든 학생이 몇 명 인지와 각각의 학생 정보를 출력하도록 하였다.

 public void deleteAllInfo() {
        studentInfoRepository.deleteAll();
    }

    public void deleteInfoById(String id) {
        studentInfoRepository.deleteById(id);
    }

deleteAll()과 deleteById()는 학생 검색과 달리 기능만 수행하면 되므로 레포지토리에 따로 추가하지 않고 원래 있던 메서드를 사용하였다.

public void updateStudentInfoById(String id) {
        int newGrade = 2;
        String newEmail = "newEmail@mail.com";
        String[] newHobby = {"coding", "game"};

        List<studentInfo> list = studentInfoRepository.findAll(id);
        list.forEach(
                studentId ->
                {
                    studentId.setGrade(newGrade);
                    studentId.setEmail(newEmail);
                    studentId.setHobby(newHobby);
                });
        List<studentInfo> infoUpdated = studentInfoRepository.saveAll(list);
    }

id를 입력받아 해당하는 학번 정보를 입력한 학년, 이메일, 취미로 저장하게 만들었다.

@SpringBootApplication
@EnableMongoRepositories
public class MongodbSpringBootApplication implements CommandLineRunner {

    @Autowired
    studentInfoRepository studentInfoRepository;

    public static void main(String[] args) {
        SpringApplication.run(MongodbSpringBootApplication.class, args);
    }

    public void run(String... args) {
        deleteAllInfo();
        insertStudentInfo();
        selectInfoById("2019201030");
        updateStudentInfoById("2019201030");
        selectInfoById("2019201030");
        deleteInfoById("2019201030");
        selectAllInfo();
    }

    public void insertStudentInfo() {
        studentInfoRepository.save(
                new studentInfo(
                        "2015100930",
                        "aufsprit",
                        4,
                        "male",
                        "sio3@gmail.com",
                        new Document("coll_name", "컴퓨터학부").append("dept_name", "컴퓨터학과"),
                        new String[]{"게임","코딩"}
                )
        );
        studentInfoRepository.save(
                new studentInfo(
                        "2019201030",
                        "test",
                        3,
                        "male",
                        "test@gmail.com",
                        new Document("coll_name", "test1").append("dept_name", "test2"),
                        new String[]{"testtest","test"}
                )
        );
        studentInfoRepository.save(
                new studentInfo(
                        "2020094140",
                        "saltIs",
                        4,
                        "female",
                        "saltIsSalt@gmail.com",
                        new Document("coll_name", "간호학과").append("dept_name", "~~간호전공"),
                        new String[]{"피아노연주","요리"}
                )
        );
    }

    public void selectInfoById(String id) {
        studentInfo studentInfo = studentInfoRepository.findStudentInfoById(id);
        System.out.println(getStudentInfoDetails(studentInfo));
    }

    public void selectAllInfo() {
        long count = studentInfoRepository.count();
        System.out.println("Entered number of student : " + count);
        studentInfoRepository.findAll().forEach(id -> System.out.println(getStudentInfoDetails(id)));
    }

    public void updateStudentInfoById(String id) {
        int newGrade = 2;
        String newEmail = "newEmail@mail.com";
        String[] newHobby = {"coding", "game"};

        List<studentInfo> list = studentInfoRepository.findAll(id);
        list.forEach(
                studentId ->
                {
                    studentId.setGrade(newGrade);
                    studentId.setEmail(newEmail);
                    studentId.setHobby(newHobby);
                });
        List<studentInfo> infoUpdated = studentInfoRepository.saveAll(list);
    }

    public void deleteAllInfo() {
        studentInfoRepository.deleteAll();
    }

    public void deleteInfoById(String id) {
        studentInfoRepository.deleteById(id);
    }

    public String getStudentInfoDetails(studentInfo id) {
        System.out.println(
                id.getId() + " " +
                id.getName() + " " +
                id.getGrade() + " " +
                id.getGender() + " " +
                id.getEmail() + " " +
                id.getBelong() + " " +
                Arrays.toString(id.getHobby())
        );

        return "";
    }
}

이런 식으로 간단하게 mongodb와 spring boot가 연결되어 있는지 확인하는 겸, 각 기능들을 테스트해 보았다.

 

https://www.mongodb.com/compatibility/spring-boot

 

Spring Boot Integration With MongoDB Tutorial

In this tutorial, we demonstrate Spring Boot integration with MongoDB, connect to Atlas cluster, and perform simple CRUD examples.

www.mongodb.com

mongodb에서 제공하는 spring boot 튜토리얼을 통해 위 과정을 확인할 수 있다.

 

이후 해야 할 일 :

페이지 만들기

컨트롤러 만들기

서비스 만들기

'MongoDB' 카테고리의 다른 글

스프링부트와 mongodb를 연결해보자!  (0) 2022.11.22
MongoDB의 기본을 알아보자 - 1  (0) 2022.11.02
자바로 연결해보자!  (1) 2022.11.02