TL;DR: String으로 처리하던 이메일, 로그인ID를 Value Class로 리팩토링하면서 타입 안전성과 도메인 표현력을 얻었지만, 어디까지 Value Class로 만들어야 하는지 기준을 고민해야 했다.시작: String이 모든 걸 해결해줄 거라 생각했다처음 회원가입 기능을 구현할 때는 단순했다. 테스트를 먼저 작성하며 이메일도 String, 로그인 ID도 String. 빠르게 구현하고 테스트도 통과했으니 문제없다고 생각했다. 그런데 코드가 늘어나면서 이상한 생각이 들기 시작했다.문제를 실감한 순간들1. 과도한 책임부여유효성 검증을 위해 User 클래스 내부에 대량의 검증 로직이 작성되고 있었다.@Entity class User( val uid: String, val email:..