Nickname VO(Value Object) 생성
@Getter
@NoArgsConstructor
@Embeddable
public class Nickname {
@Column(name="nickname", nullable = false, length = 20)
private String value;
public Nickname(String value){
if(value==null||value.isBlank()){
throw new IllegalArgumentException("닉네임은 필수입니다.");
}
if(value.length()>20){
throw new IllegalArgumentException("닉네임은 20자 이하여야 합니다.");
}
this.value= value;
}
}
닉네임 중복 검사는 어디서 해야 할까?
- 처음엔 "자기 자신의 로직은 VO 안에 있어야 한다"고 생각했다. 그래서 닉네임 중복 검사를
Nickname
값 객체 내부에서 처리하려고 했지만, 이는 올바른 방식이 아니었다.
- **
Nickname
**은 **값 객체(Value Object)**로서 불변성을 가져야 하며, **외부 의존성(repository, DB 등)**에 접근해서는 안 된다.
- 예를 들어
userRepository.existsByNickname(this)
같은 코드를 VO 내부에 넣는다면, VO가 영속성 계층에 직접 의존하게 되어 테스트가 어려워지고 유지보수도 힘들어지며, 결과적으로 DDD의 핵심 원칙을 위반하게 된다.
- 중복 검사는 단순한 유효성 검사를 넘어서는 비즈니스 규칙이며, 시스템의 상태(DB에 이미 존재하는지 등)를 확인해야 한다.
- 따라서 VO가 아닌 서비스 계층에서 처리해야 한다.