본문 바로가기
Project/소경관

[소경관] : mongoDB 정보를 가져와 조회하기, 차량 정보 조회

by 오주현 2022. 5. 12.
반응형

엑셀과 직접 등록으로 등록한 주민 데이터를 조회하기 위한 로직을 구현한다.

<table class="table table-striped">
    <thead>
    <tr>
        <th scope="col">이름</th>
        <th scope="col">연락처</th>
        <th scope="col">차량번호</th>
        <th scope="col">주소</th>
        <th scope="col">구분</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="m: ${carDTOList}">
        <td th:text="${m.name}"></td>
        <td th:text="${m.phoneNumber}"></td>
        <td th:text="${m.carNumber}"></td>
        <td th:text="${m.address}"></td>
        <td th:text="${m.sort}"></td>
    </tr>
    </tbody>
</table>

carDTOList에 담겨진 주민 정보를 뿌려준다.

 

페이징 처리는 아직 안 해주었다. 넘버링도 넣긴 해야 하는데 고민 중이다.

 

public interface ICarListMapper {

    // 전체 차량 조회 로직
    List<CarDTO> getFullCarList() throws Exception;
}

인터페이스에서 먼저 getFullCarList()를 정의한다.

 

MongoDB에 저장되어 있는 차량 정보를 list에 담아 Controller까지 전달해 줄 거기 때문에 리턴 타입은 List로 설정해 주었다.

 

package project.SPM.mapper.impl;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import project.SPM.dto.CarDTO;
import project.SPM.mapper.ICarListMapper;

import java.util.LinkedList;
import java.util.List;

@Slf4j
@Component("CarListMapper")
@RequiredArgsConstructor
public class CarListMapper implements ICarListMapper {

    private final MongoTemplate mongo;

    // 전체 차량 조회
    @Override
    public List<CarDTO> getFullCarList() throws Exception {

        // 조회 결과를 전달하기 위한 객체
        List<CarDTO> carDTOList = new LinkedList<>();

        MongoCollection<Document> col = mongo.getCollection("Car");

        Document projection = new Document();

        // ObjectId를 가지고 오지 않을 때 사용
        projection.append("_id", 0);

        FindIterable<Document> documents = col.find().projection(projection);

        for (Document doc : documents) {
            if (doc == null) {
                doc = new Document();
            }

            CarDTO carDTO = new CarDTO();

            carDTO.setName(doc.getString("name"));
            carDTO.setPhoneNumber(doc.getString("phoneNumber"));
            carDTO.setCarNumber(doc.getString("carNumber"));
            carDTO.setAddress(doc.getString("address"));
            carDTO.setSort(doc.getString("sort"));

            carDTOList.add(carDTO);

        }

        return carDTOList;
    }
}

인터페이스에서 정의한 메소드를 오버라이딩해 재정의한다. mongoDB를 사용하기 위해 MongoTemplate 을 의존성 주입을 받는다.

 

조회 결과를 전달하기 위한 객체를 만들고 mongoDB에 데이터를 저장할 때 자동으로 생성되는 _id를 가져오지 않기 위해 로직 하나를 추가해 주었다. 그 뒤는 for문으로 document에 들어있는 값을 carDTO로 옮겨주고 carDTO를 carDTOList에 저장한 뒤 리턴시켰다.

 

public interface ICarListService {

    // 전체 차량 조회 로직
    List<CarDTO> getFullCarList() throws Exception;
}

마찬가지로 getFullCarList()를 Service 인터페이스에서도 정의해주었다. 리턴 타입도 같다.

 

package project.SPM.service.impl;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import project.SPM.dto.CarDTO;
import project.SPM.mapper.ICarListMapper;
import project.SPM.service.ICarListService;

import java.util.LinkedList;
import java.util.List;

@Slf4j
@Component("CarListService")
@RequiredArgsConstructor
public class CarListService implements ICarListService {

    private final ICarListMapper iCarListMapper;

    @Override
    public List<CarDTO> getFullCarList() throws Exception {

        // 결과 값
        List<CarDTO> carDTOList = null;

        carDTOList = iCarListMapper.getFullCarList();

        if (carDTOList == null) {
            carDTOList = new LinkedList<>();
        }

        return carDTOList;
    }
}

Service에서는 null 체크 정도만 해주었고 리턴한다.

 

//차량 전체 리스트 페이지 및 로직
@GetMapping("/carList/fullCarList")
public String fullCarList(Model model) throws Exception {

    List<CarDTO> carDTOList = iCarListService.getFullCarList();

    model.addAttribute(carDTOList);

    return "carList/fullCarList";

}

Controller에서 model 객체에 담아 View로 넘겨주었고 맨 위에 있는 html에서 값을 받아 화면에 띄워주었다.


반응형

댓글