본문 바로가기

서버개발스터디/3주차 (MongoDB)

#03 Spring Boot & MongoDB 연결 및 테스트작성

오늘은 저번시간에 만들어 놓은 Collection 과 Spring boot를 연결하고 테스트를 진행한다! 

 

Index

  • Maven dependency 및 Property 추가
  • UserMongoDBRepository 인터페이스 및 User DTO 생성 
  • Junit 테스트작성

Maven dependency 및 Property 추가

1. 아래처럼 pom.xml 에 dependency를 추가한다. (기존 프로젝트가 아니라면 Lombok도 추가)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
 
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

 

2. property 추가 

application.properties 파일에 아래처럼 MongoDB설정 정보를 넣는다.

(sample는 저번 시간에 mongoDB서버에 만들어놓은 DB의 이름이다.)

## MongoDB 설정
spring.data.mongodb.uri=mongodb://127.0.0.1:27017
spring.data.mongodb.database=sample
 

 

Robo 3T로 DB를 보면 sample이 보인다. 

 

 

UserMongoDBRepository 인터페이스 및 User DTO 생성

스터디 1, 2주차 때 사용했던 프로젝트에 같이 붙여서 사용할 예정이다!
(혹시 프로젝트를 새로 생성하고싶다면 Spring boot 기본으로 생성하고 위에 언급한 dependency 만 추가하면 된다.)

 

2주차 프로젝트 실습 바로가기 (1주차 - JPA사용, 2주차 - Kafka 테스트) 하나의 프로젝트에서 모두 테스트함

 

1. User DTO 클래스 생성

해당 클레스는 MongoDB Document에 대응하는 DTO클래스를 만들기 때문에 우리가 저번포스팅에서 만들어 놓은 

DB 명 : sample

Collection 명 : user   (RDB의 테이블과 유사)

Document : name    (RDB의 row와 유사 )

 

User 클래스를 작성 하는데 getter setter 를 만들기 싫으니까 lombok의 @Data 어노테이션 사용하자!

package com.example.study.model;
 
import lombok.Data;
 
@Data
public class User {
 
    private String name;
 
    @Override
    public String toString() {
        return "name is " + name;
    }
}

 

2. UserMongoDBRepository.java 인터페이스 생성

MongoRepository를 extends 해야된다.

package com.example.study.repository;
import com.example.study.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
 
public interface UserMongoDBRepository extends MongoRepository<User, String> {
    public User findByName(String name);
}

 

Junit 테스트작성

1. SpringBootMongoDBTest.java 파일생성 

package com.example.study;
 
import java.util.List;
 
import com.example.study.model.User;
import com.example.study.repository.UserMongoDBRepository;
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
@SpringBootTest
public class SpringBootMongoDBTest {
    @Autowired
    private UserMongoDBRepository mongoDBRepository;
 
    @Test
    public void printMongoDB() {
        System.out.println(mongoDBRepository.findByName("park").getName());
        List<User> result = mongoDBRepository.findAll();
        for(User user : result) {
            System.out.print(user.getName() + ", ");
        }
    }
    
}
 

실행되는 순서를 한번 살펴보자.

 

순서 1) Test를 시작하면 Ioc컨테이너에 Bean이 등록되고 우리가 사용 할 UserMongoDBRepository 인터페이스에 Bean을 스프링이 DI해준다. (@Autowired를 보고 컨테이너가 넣어줌)

순서 2) printMongoDB() 메서드가 호출되면서 주입된 mongoDBRepository 변수를 이용해서 findByName으로 MongoDB에서 "park" 라는 이름으로 조회하고 return된 User 객체에서 .getName()으로 User 클래스에 name변수를 return 받아서 콘솔에 프린트한다.

순서 3) mongoDBRepository.findAll(); 를 호출해서 return 되는 List<User> 타입을 return 객체를 result 변수에 저장한다. (사실 저장하는게 아니라 주소값만 가지고 있다..  이미 Heap에 생성된 주소값을 저장하는 것뿐...)

순서 4) for문을 이용해서 List안에 들어있는 User객체의 getName()을 호출하고 return 되는 name변수를 프린트 한다.

 

이렇게 @Test를 수행한 결과가 잘 나왔는지 확인하고 오류가 있다면 MongoDB Server가 잘 올라와 있는지 확인해보자! 

 

Spring Test 결과

테스트 결과 

MongoDB 데이터 확인

 

 

마무리 

1주차에 사용한 JPA와 이번에 사용한 MongoDB를 보면 서로 다중상속( interface는 다중상속이 가능함 )받는 인터페이스가 같다는걸 확인할 수 있다. 그래서 해당 인터페이스를 공부하면 조금더 깊이있게 기술을 사용하고 이슈가 발생 했을때에도 해결하기 쉬울 것 같다는 생각이 든다. 

MongoRepository interface
JpaRepository interface

그리고 더욱더 궁금한 점은 User 클래스를 만들고 맴버변수 name을 private 으로 만들후에 

@Data를 붙여주지 않으면 getter setter 가 없기 때문에 변수에 접근을 할 수 없을텐데 테스트를 해보니 

값이 멤버변수 name에 들어가 있는 걸 확인했다...   이게 어떻게 가능한건지 너무궁금하다. 

나중에 이 부분에대해서 깨닫게 된다면 다시한번 정리해서 포스팅 하기로!!!