MongoDB와 Spring Boot를 이용하여 학생 관리 프로그램을 만들어 보는 것!
기능
- 학번을 검색하여 해당 학생을 검색
- 아무것도 입력 없이 검색하면 모든 학생을 검색
- 이름, 학년, 학과, 취미 중 하나를 입력하여 해당하는 학생들을 검색
- 이름, 학년, 학과, 취미를 입력하여 조건에 모두 해당하는 학생들을 검색
- 학생 정보를 입력하여 추가
- 학번을 입력하여 해당 학생 정보를 삭제
- 학번을 입력하고 학년, 이메일, 취미를 수정
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로 데이터베이스를 생성해 준다.
application.yml이나 application.properties에 ID와 KEY를 넣고 github에 commit 해서 드러내지 않는 것이 좋을 것 같다.
따라서, intellij IDEA를 사용하는 경우 Edit Configurations를 누르고 Modify options를 눌러 Environment variables에 ID와 KEY를 입력하여 숨기는 것이 좋을 것 같다. 다른 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
mongodb에서 제공하는 spring boot 튜토리얼을 통해 위 과정을 확인할 수 있다.
이후 해야 할 일 :
페이지 만들기
컨트롤러 만들기
서비스 만들기
'MongoDB' 카테고리의 다른 글
스프링부트와 mongodb를 연결해보자! (0) | 2022.11.22 |
---|---|
MongoDB의 기본을 알아보자 - 1 (0) | 2022.11.02 |
자바로 연결해보자! (1) | 2022.11.02 |