인프런 커뮤니티 질문&답변
Update 할 때 조건검사(price >= 0) 는 어디서 하는게 좋은 방법일까요?
작성
·
919
7
안녕하세요. 너무 좋은 강의 잘 듣고있습니다 !! :)
강의 마지막부분에서 가장 좋은 방법이라고 말씀해주신대로,
Service 계층에 ItemUpdateDto 를 추가하고,
엔티티 클래스에 update() 함수도 만들어서 구현을 했습니다.
여기서 한 가지 궁금한점이 생겼는데요,
- price >= 0
- stockQuantity >= 0
- name 은 빈 문자열이 아님(StringUtils.hasText == true)
등의 조건을 검사하여 exeception 을 날리거나, update 를 진행하고 싶을 때
조건검사를 어디서 하는 것이 가장 좋은지 고민이 됩니다.
제 생각에는 크게 세가지 방법이 있을 것 같은데요..
1. Controller 에서 검사하여, 검증된 값만 DTO에 담아서 service 에 전달한다.
2. service 에서 엔티티의 update() 함수를 호출하기전에 검사한다.
3. 엔티티 클래스의 update() 함수 내부에서 검사한다.
세 가지 방법에대해 제가 고민해본 내용을 말씀드리면..
Book 클래스의 removeStock() 처럼 엔티티 내부에서 검사하고, NotEnoughStockException 같은 에러를 날리는 비지니스 로직을 넣어야할까요? (코드에 일관성이 있도록..) --> 3번
그런데, Controller 에서 미리 검사를 하면 굳이 service -> repository 를 타고 내려가서 select 쿼리를 날릴 필요가 없어지기 때문에 성능상 유리할 것 같다는 생각도 듭니다. --> 1번
두 군데에서 다 검사를 하는 것이 좋을까요? 실무에서는 보통 어떤 방법을 채택하는지 궁금합니다 .
퀴즈
회원 가입 시 화면 입력 데이터를 엔티티 객체 대신 별도의 Form 객체로 받는 주된 이유는 무엇일까요?
데이터베이스 성능을 최적화하기 위해서
화면 종속적인 데이터나 유효성 검증 로직을 분리하기 위해서
JPA 영속성 컨텍스트와 직접적인 관계를 맺기 위해서
코드의 자동 생성 기능을 활용하기 위해서
답변 1
19
안녕하세요. 이예슬님
사실 모든 곳에서 검사를 다 하는 것이 가장 안전한 방법입니다.
하지만 그러면 현실적으로 너무 불편하겠지요?
1. HTTP 요청 파라미터에 대한 부분은 컨트롤러에서 최대한 검증합니다. (price >=0)
2. 내부 DB 조회나 외부 호출이 필요한 검증들은 서비스에서 검증합니다. (예: 재고 수량)
3. 해당 엔티티가 가지고 있는 데이터 만으로 모두 검증할 수 있는 경우는 엔티티도 검증으로 고려합니다.
(서비스와 엔티티는 상황에 따라서 다릅니다. 추가로 복잡하다면 검증용 객체를 별도로 분리할 수도 있습니다.)
감사합니다.





