본문 바로가기
Project/소경관

[소경관] : 직접 차량 등록하기 기능 추가

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

경비원이 관리하는 주민을 등록하는 방법 중 한 가지인 직접 등록하기를 구현한다.

아직 몇 가지 구현이 덜 된 부분이 있지만 일단 핵심 로직은 완성되었기 때문에 로직을 정리한다.

<form th:action="@{/carManagement/addCar}" th:method="post" th:object="${addCarVo}">
    <input placeholder="이름을 입력해 주세요." id="name" th:field="*{name}">이름</input>
    <br>
    <input placeholder="연락처를 입력해 주세요." id="phoneNumber" th:field="*{phoneNumber}">연락처</input>
    <br>
    <input placeholder="차량 번호를 입력해 주세요." id="carNumber" th:field="*{carNumber}">차량 번호</input>
    <br>
    <input placeholder="동, 호수만 적어주세요." id="address" th:field="*{address}">상세 주소</input>
    <br>
    <button type="submit">버튼</button>
</form>

View 코드는 위와 같이 해주었다. 일단 꾸미지 않고 값을 받아오는 것에 집중했다.

 

package project.SPM.vo;

import lombok.Data;

import javax.validation.constraints.NotNull;

@Data
public class AddCarVo {

    @NotNull
    private String name;

    @NotNull
    private String phoneNumber;

    @NotNull
    private String carNumber;

    @NotNull
    private String address;

}

View object에 보내어 값을 받아 올 Vo를 만들어 주었다.

 

@GetMapping("/addCar")
public String addCar(Model model) {

    model.addAttribute("addCarVo", new AddCarVo());

    return "carManagement/addCar";
}

Model에 Vo를 담아 보내주면 위에 View에서 input으로 받은 값을 addCarVo에 담아 /addCar로 보내준다.

 

@PostMapping("/addCar")
public String add(@Validated @ModelAttribute AddCarVo addCarVo, BindingResult bindingResult) throws Exception {

    log.debug("#### Controller AddCarVo : {}", addCarVo);

    CarDTO carDTO = new CarDTO(
            addCarVo.getName(),
            addCarVo.getPhoneNumber(),
            addCarVo.getCarNumber(),
            addCarVo.getAddress()
    );

    log.debug("#### Controller CarDTO : {}", carDTO);

    boolean res = iCarService.addCar(carDTO);

    log.debug("#### Controller 마지막 로직에서 체크한 res 값 : {}", res);
    String msg;
    String url;
    if (res == true) {
        msg = "차량 등록을 완료하였습니다.";
        url = "carManagement/carManagement";
    } else {
        msg = "차량 등록에 실패하였습니다. 다시 시도해주세요.";
        url = "carManagement/addCar";
    }

    return url;
}

addCarVo에 받아온 입력 값을 CarDTO에 옮겨 담아준다.

 

return 값은 원래는 int로 했었는데 피드백 받아 boolean으로 바꿔보았다. log도 info 말고 debug 레벨로 바꾸어 적용했다.

 

CarDTO에 값을 옮겨 담고 CarService로 보내준다. Service에서 리턴 받은 res 값을 기준으로 url을 리턴시켜주었다.

 

아직 redirect를 만들지 못 했는데 마저 만들고 redirect로 리턴해 주어서 뭔가 완료되었다는 메시지를 띄울 생각이다.

 

@Override
public boolean addCar(CarDTO carDTO) throws Exception {

    log.debug("#### 직접 등록 로직 처리 : {}", this.getClass().getName());

    boolean res = iCarMapper.addCar(carDTO);

    return res;
}

인터페이스에 먼저 정의하고 오버라이딩해서 사용하는데 코드는 생략한다. Service에서 따로 처리할 로직이 없어서 Mapper로 바로 보내주었다.

 

여기서 생기는 고민

  1. vo에서 dto로 값을 옮기는 것을 Service에서 할까?..
  2. Controller에서 Service로 값을 보내지 말고 바로 Mapper로 값을 보내줄까?..

정도가 있다. Service에서 서비스 로직을 처리하는데 딱히 할 게 없어서 잘 모르겠다. 일단은 Service에 옮겼다 Mapper를 거쳐가는 형식으로 놔두었는데 추후 리팩토링이 필요하다면 바꿀 예정이다.

 

@Override
public boolean addCar(CarDTO carDTO) throws Exception {

    log.debug("#### Mapper carDTO : {}", carDTO);
    boolean res = true;

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

    if (carDTO == null) {
        carDTO = new CarDTO();
        res = false;
    }
    col.insertOne(new Document(new ObjectMapper().convertValue(carDTO, Map.class)));

    log.debug("#### resturn : res : {}", res);

    return res;
}

CarMapper도 어렵지 않다. 저장할 mongo Collection을 가져오고 CarDTO Null 체크를 해준 뒤, Document로 변환해주고 값을 추가해 주면 된다.

 

여기서 마지막에 null 아닌데.. 저장이 안 된 경우엔 true로 체크될 것 같은데 이것도 한 번 고민해 봐야한다.



반응형

댓글