본문 바로가기
Project/소경관

[소경관] : 주민(방문자, 블랙리스트) 차량 조회 로직

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

MongoDB에 등록한 차량 정보 중 주민 차량만 가져오는 로직을 구현한다.

<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>

View에서는 carDTOList를 받아서 th:each로 반복시켜 리스트를 쭉 뽑아준다.

 

package project.SPM.mapper;

import project.SPM.dto.CarDTO;

import java.util.List;

public interface ICarListMapper {

    List<CarDTO> getResidentList() throws Exception;

}

주민 차량 조회를 위한 메서드와 리턴 타입을 정의해 준다.

 

// 주민 차량 조회
@Override
public List<CarDTO> getResidentList() throws Exception {

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

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

    // 조회할 조건, SQL의 WHERE 역할과 같다.
    Document query = new Document();
    query.append("sort", "주민");

    // 조회 결과 중 출력할 컬럼
    Document projection = new Document();
    // ObjectId를 가져오지 않기 위해 사용한다.
    projection.append("_id", 0);

    FindIterable<Document> documents = col.find(query).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에서 데이터를 가져와야 하는데 주민 데이터만 가져와야 하므로 Document query를 생성해주고 append로 key와 value 값을 지정해 찾을 데이터를 선택해 준다.

 

sort 컬럼에서 “주민”인 데이터만 가져오기 위해 지정해 주었다. 주석처럼 SQL의 WHERE 역할을 한다고 보면 되는데 이걸 어디서 사용하냐면 조금 아래 FindIterable<Document> documents = col.find(**query**).projection(projection); 여기에서 사용한다.

 

블랙리스트 조회나 방문자 조회도 모든 로직이 똑같으나 query.append()의 Key, Value 값만 따로 정의해주면 된다.

 

package project.SPM.service;

import project.SPM.dto.CarDTO;

import java.util.List;

public interface ICarListService {

    // 주민 차량 조회 로직
    List<CarDTO> getResidentList() throws Exception;

}

마찬가지로 리턴타입을 인터페이스에서 정의해준다.

 

// 주민 차량 조회
@Override
public List<CarDTO> getResidentList() throws Exception {

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

    carDTOList = iCarListMapper.getResidentList();

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

    return carDTOList;
}

Mapper에 MongoDB 조회 관련 로직을 수행하도록 보내고 리턴 받아온 값을 null 체크해 준 뒤 Controller에 바로 carDTOList를 리턴해주었다.

 

package project.SPM.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import project.SPM.dto.CarDTO;
import project.SPM.service.ICarListService;

import java.util.List;

@Slf4j
@Controller
@RequestMapping("/carList")
@RequiredArgsConstructor
public class CarListController {

    private final ICarListService iCarListService;

    // 차량 주민 리스트 페이지 및 로직
    @GetMapping("/resident")
    public String resident(Model model) throws Exception {

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

        model.addAttribute(carDTOList);

        return "carList/resident";
    }

}

Controller에서는 리턴 받아온 값을 Model 객체에 담아 View로 보내주었다.

 


문제

  1. 페이징 관련 로직
  2. Controller에서 throws Exception 사용 → Service로 뺴야 한다.
반응형

댓글