본문 바로가기

3.구현/Java or Kotlin

[java] springboot에서 mongodb 연동하기

들어가기

MongoDB는 nosql로서 간단하게 중소 데이터 규모에 적합한 데이터베이스이다. MongoDB에 가장 큰 특징은 json 형태의 동적 스키마형 문서 데이터 입출력하는 document 형태의 구조를 가진다. Spring boot에서는 아주 간단하게 연동해서 사용할 수 있다.

작성자: http://ospace.tistory.com/ (ospace114@empal.com)

환경 구성

MongoDB을 사용하기 위한 Dependency 추가하자.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

그리고 MongoDB를 접속하기 위한 접속 정보 설정한다.

spring.data.mongodb.host = 127.0.0.1
spring.data.mongodb.port = 27017
spring.data.mongodb.database = bar

포트번호는 기본적으로 27017를 사용한다. database에 bar를 설정한다.
사용자 명과 패스워드이 있다면 username과 password에 설정하면 된다.

spring.data.mongodb.username = 사용자ID
spring.data.mongodb.password = 패스워드

MongoDB에서 사용할 DB를 구성해야한다. 사용할 기본 database 이름을 bar로 생성하고 collection 이름을 foo로 한다.

UserDto 클래스

사용자 데이터를 저장하고 처리할 간단한 DTO 클래스를 정의했다.

public class UserDto {
    private String id;
    private String name;

    //getter, setter
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

UserMapper 클래스 구현

Java에서 MongoDB를 연결할 UserMapper 클래스를 구현한다. 이미 설정 정보를 가지고 MongoTemplate 빈객체를 내부적으로 생성한다. 새당 빈객체를 가져다가 사용하면 된다.

@Component
public class UserMapper {
    @Autowired
    private MongoTemplate mongoTemplate;
    private final String collectionName = "foo";

    public List<UserDto> findAll(String name) {
        Query query = Query.query(Criteria.where("name").is(name));
        return mongoTemplate.find(query, UserDto.class, collectionName);
    }

    public UserDto find(String id) {
        return mongoTemplate.findById(id, UserDto.class, collectionName);
    }

    public void update(UserDto user) {
        Query query = Query.query(Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name", user.getName());
        mongoTemplate.updateFirst(query, update, collectionName);
    }

    public void save(UserDto user) {
        mongoTemplate.save(user, collectionName);
    }

    public void remove(String id) {
        Query query = Query.query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, UserDto.class, collectionName);
    }
}

MongoTemplate를 통해서 MongoDB를 엑세스한다. MontoTemplate 클래스에서는 다양한 메소드를 제공한다. 앞의 예제에서는 find(), findById(), save(), remove(), update()을 사용했지만 mapReduce()도 있다. 그리고 더 다양한 메소드를 제공한다.
find()나 save(), remove는 어렵지 않지만 update는 좀더 신경써야 한다. Update 객체를 만들어서 변경할 필드값을 직접 설정해줘야한다. 그리고 여러 개를 동시에 변경하려면 updateMulti()를 사용해야 한다.

사용예

간단하게 활용하는 예를 보자. 브라우저에서 바로 확인할 수 있도록 "save", "delete", "update" 경로를 사용했다.

@RestController
@RequestMapping("/user")
public class UserRestController {
    @Autowired
    private UserMapper userMapper = null;

    static private final Logger logger = LoggerFactory.getLogger(UserRestController.class);
    @RequestMapping("/{id}")
    public UserDto getUser(@PathVariable("id")String id) {
        logger.info("getUser - id[{}]", id);
        return userMapper.find(id);
    }

    @RequestMapping("/save")
    public void save(@RequestParam(name="id")String id, @RequestParam(name="name")String name) {
        logger.info("save - id[{}] name[{}]", id, name);
        UserDto found = userMapper.find(id);

        UserDto user = new UserDto();
        user.setId(id);
        user.setName(name);

        if (null == found) {
            userMapper.save(user);
        } else {
            userMapper.update(user);
        }
    }

    @RequestMapping("/delete/{id}")
    public void delete(@PathVariable("id")String id) {
        logger.infodeletesave - id[{}]", id);
        userMapper.remove(id);
    }
}

브라우저에서 사용하는 경우 아래 링크를 참조해서 사용하면 된다.

마무리

MongoTemplate를 사용한 간단한 MongoDB 엑세스하는 방법을 살펴보앗다. 너무 간단해서 뭐가 놓친부분이 없나할 정도있다. 이제 다양한 상황에 맞는 데이터 처리 방법만 고민하면 된다. 여러분에게 도움이 되었으면 하네요. 모두 즐거운 코딩생활하세요. ospace.

참고

[1] Accessing Data with MongoDB, https://spring.io/guides/gs/accessing-data-mongodb/
[2] Class MongoTemplate, https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html

반응형