본문 바로가기
Project/소경관

[소경관] : 등록한 차량 및 주민 정보 수정과 삭제 로직 구현하기

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

차량 정보와 같이 등록한 주민이나 방문자, 무단 주차자의 정보를 삭제하고 수정할 수 있는 페이지와 로직을 구현했다.

@GetMapping("/updateCar")
public String updateCarPage(Model model) throws Exception {

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

    UpdateCarListVo updateCarListVo = new UpdateCarListVo();
    updateCarListVo.setCarDtoList(carDTOList);

    model.addAttribute("carDTOList", carDTOList);
    model.addAttribute("updateCarListVo", updateCarListVo);

    return "carManagement/updateCar";
}

직접 체크 로직과 거의 비슷한 구조로 구현했다. 차량 수정 기본 화면을 보여주는 페이지에 Model 객체를 생성하고 CarDTO를 List로 만들어 Model 객체에 담았고, View에서 체크해 온 값을 담아 새로 가지고 올 UpdateCarListVo 객체도 담아주었다.

 

@Data
public class UpdateCarListVo {

    private List<CarDTO> carDtoList;
}

UpdateCarListVo에는 CarDTO를 리스트로 가지고 있는 파라미터 하나를 가지고 있다.

 

<form th:action="@{/carManagement/update}" th:object="${updateCarListVo}" method="post">

<table class="table table-striped" align="left">

    <thead>
    <tr>
        <th scope="col">이름</th>
        <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: ${updateCarListVo.carDtoList}">

        <td>
            <input type="text" th:field="*{carDtoList[__${mStat.index}__].name}">
        </td>

        <td>
            <input type="text" th:field="*{carDtoList[__${mStat.index}__].phoneNumber}">
        </td>

        <td>
            <input type="text" th:field="*{carDtoList[__${mStat.index}__].sort}">
        </td>

        <td>
            <input type="text" th:field="*{carDtoList[__${mStat.index}__].carNumber}">
        </td>

        <td>
            <input type="text" th:field="*{carDtoList[__${mStat.index}__].address}">
        </td>

        <td>
            <input th:type="checkbox" class="form-check-input" th:field="*{carDtoList[__${mStat.index}__].check}" th:value="true" readonly>
        </td>

    </tr>
    </tbody>

</table>

<button th:type="submit" th:text="저장하기"></button>

</form>

 

View를 보면 CarController에서 Model 객체에 담아온 값 중 updateCarListVo를 object로 받아 input 값을 취합하여 값을 넘겨줄 준비를 했고, carDTOList에 있는 차량 정보를 thymeleaf의 each를 통해 뿌려주었다.

마지막에 checkbox로 T,F값을 추가로 받아왔다. 이 check 값은 default 값이 false고 체크 시 true로 바뀌는데 true로 바뀐 값은 삭제하는 로직을 Service단에서 추가해 줄 것이다.

 

@PostMapping("/update")
public String updateCar(@ModelAttribute UpdateCarListVo updateCarListVo) throws Exception {

    boolean res = iCarService.updateCar(updateCarListVo);

    if (res == false) {

        return "carManagement/updateCar";

    } else {

        return "carManagement/carManagement";

    }

}

차량 수정 및 삭제 로직을 처리하기 위한 CarController이다. 위에서 object에 받아온 updateCarListVo를 받았고 Service 로직으로 넘겨준다. Service와 Mapper는 인터페이스에 메소드를 구현하고 오버라이딩하여 사용했다. 항상 클래스 맨 위에 private final ICarService iCarService; 이렇게 의존성을 주입해 주어야 한다. 이때, 롬복 라이브러리에서 제공하는 @RequiredArgsConstructor ****를 잘 사용하고 있다. 생성자가 하나일 경우 알아서 빈 객체를 찾아준다.

아, Service로 보내주면서 return type을 boolean으로 설정해주어서 성공, 실패를 구분지었다.

나중에 alert나 redirect로 msg와 url을 전달해 간단한 메시지를 띄워도 좋을 것 같다.

인터페이스 코드는 생략한다. GIt Hub에서 확인이 가능하다.

 

@Override
public boolean updateCar(UpdateCarListVo updateCarListVo) throws Exception {

    boolean res;

    ArrayList<CarDTO> list = new ArrayList<>();

    // check가 false인 경우에만 list에 저장
    for (CarDTO carDTO : updateCarListVo.getCarDtoList()){
        if (carDTO.isCheck() == false) {
            list.add(carDTO);
        }
    }

    res = iCarMapper.updateCar(list);

    return res;
}

인터페이스에서 구현한 메소드를 오버라이딩해 사용한다.

Controller에서 넘어온 updateCarListVo 값을 list를 만들고 for문으로 값을 담아준다. 이때, if문을 통해 아까 View에서 체크한 삭제 값을 구분하여 삭제하지 않는 부분, false로 들어온 값만 list에 담아준다.

boolean 타입의 리턴 타입을 바라며 CarMapper로 값을 넘겨주었다.

 

@Override
public boolean updateCar(List<CarDTO> list) throws Exception {

    boolean res = true;

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

    // 컬렉션이 존재할 경우에만 삭제한다.
    if (mongo.collectionExists("Car")) {
        mongo.dropCollection("Car");
    }

    for (CarDTO carDTO : list) {
        if (carDTO == null) {
            carDTO = new CarDTO();
        }

        col.insertOne(new Document(new ObjectMapper().convertValue(carDTO, Map.class)));
    }

   return res;
}

CarMapper에서는 Service에서 정리한 list 값을 저장하기 위한 로직을 수행한다. 먼저, 기존에 있던 유저 정보 컬렉션이 있는 경우 먼저 삭제해 주었다. 그 다음에 for문과 insertOne을 통해 값을 하나씩 저장해 주었다.

 


반응형

댓글