inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Clean Spring của Toby - Mô hình Domain Model và Kiến trúc Hexagonal Phần 1

Phát triển kiểm thử API và bộ xử lý ngoại lệ ProblemDetail

서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서

5

daejoon

2 câu hỏi đã được viết

0

서비스에 적용하는 @Valid는 사용을 위해서 클래스에 @Validated를 붙어주었는데?

컨트롤러에는 @Valid만 사용하셨습니다? 서비스와 같이 @Validated를 붙여줘야 하는것 아닌가요?

서비스와 컨트롤러의 사용방법 차이에 대해서 궁금합니다.

---
정확하게는 모르지만 검증 주체의 차이로 달라지는 것으로 알고 있습니다.

java spring spring-boot jpa 리팩터링 ddd

Câu trả lời 1

1

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 고대준님,

컨트롤러와 서비스에서 @Valid가 동작하는 방식이 서로 다르기 때문에 사용법에도 차이가 있습니다.

  • 컨트롤러의 @Valid
    Spring MVC가 HTTP 요청을 컨트롤러 메서드에 전달하는 과정에서 요청 DTO를 검증합니다. 따라서 일반적으로 컨트롤러 클래스에 @Validated를 별도로 붙이지 않고, 파라미터에 @Valid를 붙여 사용합니다.

  • 서비스의 @Validated
    서비스 메서드는 Spring MVC가 직접 호출하는 대상이 아니므로, 메서드 파라미터 검증을 활성화하려면 서비스 빈에 @Validated를 붙여 Spring의 메서드 검증 기능을 적용해야 합니다. 이후 메서드 파라미터에 @NotNull, @Size, @Valid 등의 검증 애노테이션을 사용할 수 있습니다.

즉, 질문자님이 이해하신 것처럼 검증을 수행하는 주체가 다르기 때문에 차이가 발생합니다.

@RestController
class MemberController {
    @PostMapping("/members")
    void register(@Valid @RequestBody MemberRegisterRequest request) {
        memberService.register(request);
    }
}

컨트롤러의 경우 Spring MVC가 요청 바인딩 과정에서 @Valid를 처리합니다.

@Validated
@Service
class MemberService {
    void register(@Valid MemberRegisterRequest request) {
        // 서비스 메서드 호출 시 메서드 파라미터 검증
    }
}

서비스의 경우 Spring이 관리하는 프록시를 통해 메서드가 호출될 때 @Validated가 메서드 검증을 활성화하는 역할을 합니다. 다만 컨트롤러에서 이미 검증했다고 해서 서비스나 도메인에서 모든 검증을 생략해도 된다고 단정하기는 어렵습니다. 서비스는 배치, 다른 어댑터, 테스트 코드 등 컨트롤러가 아닌 여러 진입점에서 호출될 수 있기 때문입니다. 도메인의 불변식이나 비즈니스 규칙은 도메인 객체 스스로 보장하도록 하는 것이 안전합니다.

이 주제와 관련해서는 아래 기존 답변이 가장 유사합니다.

MemberRegisterRequest 의 검증 방식으로 @Valid 와 초기화 스크립트의 차이가 무엇인가요?

해당 답변에서는 생성자·초기화 코드·검증 유틸리티·Bean Validation 애노테이션의 차이와 함께, 컨트롤러와 서비스 및 도메인 계층에서 검증을 어디까지 책임져야 하는지 설명하고 있습니다. 핵심은 모든 계층에서 무조건 같은 검증을 반복하기보다는, 각 계층의 독립적인 사용 가능성과 도메인 불변식 보호 여부를 기준으로 책임을 나누는 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

readme에 대한 자료는 따로 받아볼수 있나요?

0

96

2

Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.

0

106

2

테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.

0

62

1

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

115

3

안녕하세요 토비님 혹시 완성된 코드의 repository 주소는 없을까요?

0

155

2

테스트 관련 질문!

0

136

2

N+1 관련해서 질문있습니다.

0

169

3

도메인 모델에서 관계와 규칙을 구분하는 방법

0

172

2

헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?

0

251

2

어댑터에서 도메인에 직접 의존하는 경우에 대해

0

233

2

Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.

0

204

2

MemberService와 EmailSender 책임 분리에 대한 질문

0

179

2

NonNullApi를 NullMarked로 대체하라고 합니다.

0

253

2

39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.

0

138

2

Repository Adapter 설계에 대해 피드백을 부탁드립니다

0

180

2

헥사고날 part2 강의 출시 예정일 문의 드립니다.

0

339

2

PT 문의사항

0

168

1

초기 어플리케이션 구동 시 compose.yml 파싱 오류

0

246

2

애플리케이션의 JPA 리턴과 도메인 모델

0

200

2

애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의

0

211

2

페이징 처리를 해야한다면 어떻게 해야할까요?

0

268

2

애그리거트의 repository

0

194

2

Domain Expert가 정확히 어떤 역할을 하는 사람인가요?

0

356

1

회원 애플리케이션 서비스 테스트 (1)

0

171

2