기억에 6번부터 조금 복잡해졌었던 것 같다 .. !
나름 그래도 과거의 내가 stream
도 써보려고 하고 많이 노력한 것 같기도하고
ㅎㅎㅎ
[ 기능 ]
- [ ] 이메일과 이름 입력 받기
- [ ] 닉네임 겹치는지 판별하기
- [ ] 오름차순으로 정렬한, 겹치는 닉네임 가진 유저의 이메일 리스트 만들기
- [ ] 결과 출력하기
[ 예외 ]
- [ ] 이메일과 이름이 같이 주어지지 않을 경우
- [ ] 크루가 1명 미만 10,000명 초과일 경우
- [ ] 이메일이 형식에 부합하지 않는 경우
- [ ] 이메일 전체 길이가 11자 미만 20자 이상일 경우
- [ ] email.com 도메인이 아닌 경우
- [ ] 닉네임이 한글이 아닐 경우
- [ ] 닉네임이 1자 미만 20자 이상일 경우
리팩토링 코드는 이것이다.
5번 문제 리팩토링 과정에서 적용했던 MVCS 구조를 가져가니까, 굳이 service를 거쳐야하는 이유?가 명확히 이해되지 않았다. (어차피 view도 controller가 다 알고 있는데, controller에서 다 해주면 될 일이 아닌가? 라는 생각이 들었기 때문에😂)
내 생각에 잘못 된 부분이 있을 수도 있지만,
나는 서비스를 굳이 사용해야만 하는 이유를 꼭 찾고 싶었어서 일단 controller
는 타이밍에 맞게 service
에 있는 비즈니스 로직을 불러오고, 이 service
안에서 model
을 적극! 건들 수 있도록 구현해보자고 마음 먹었다.
서비스를 쓸 때마다, 그냥 기존에 미션 진행했던대로 MVC 패턴만 가져가는게 더 명확하지 않나..? 는 생각이 들기는했는데 흠.. . .
6번 문제를 리팩토링 끝낸 지금 시점에서보면 controller
의 코드가 명확해지고, 중요한 도메인 로직이 모두 service
에 몰려있어서 더 나아 보이기는한다.
너무 어렵다 MVC~~
내 서비스 로직을 보면, Map을 활용해서 중복 닉네임 리스트를 검증하고 있음을 확인할 수 있다.
컬렉션인만큼, 얘도 일급 컬렉션으로 관리해볼까?라는 생각이 들었지만,
필수적인 도메인도 아니고, 모델 이름도 애매해서.. 그냥 service 클래스의 클래스 필드에 map을 선언하고, 로직 안에서 init() 해주도록 구현했다.
public List<String> getDuplicatedNickNamePersonEmails(List<Person> persons) {
initTwoCharacterToPerson();
for (Person person : persons) {
updateTwoCharacterToPerson(person);
}
List<String> emails = checkAndGetDuplicatedNickNamePersonEmails();
return emails.stream()
.distinct()
.collect(Collectors.toList());
}
겹치는 이름 판별하기에 가장 좋은 자료구조가 map이라는 생각이 들어, 기존 미션 진행했을 때랑 비슷하게 map을 활용해서 겹치는 닉네임을 판별했는데,
나름 괜찮은 것 같기도하고 조금 길어진 것 같기도하고 애매하다🙄
그래도 최대한! 가독성 좋게 만들기 위해
메소드명도 최대한 생략하지 않고 그 메소드가 하는 일을 명시할 수 있도록 ! 노력했고 읽는 순서도 고려하면서 작성했다.
그리고 기존 미션에서는 controller
에서 이미 정렬된 리스트를 outputView
에 전달해줬는데,
이 정렬은 OutputView
가 전적으로 담당해야하는 로직인 것 같다는 생각에 해당 정렬 과정을 outputView
클래스 안으로 넘겨버렸다!
그리고 Error 메세지 프린트 로직도 outputView
에게 넘겼다 :)
마지막으로 언급하고 싶은 부분은 toString()
메소드:)
테스트 로직이 편하게 하려고 모델 엔티티 내부에 toString()
메소드를 재정의했는데, 지금 생각해보니까 어차피 getter 만들거였으면 그걸로 판단해도 됐을 듯 싶다
:)..
그래도 뭐 나름 toString()
재정의 해보겠단 problem4의 회고록에서의 다짐을 지킨 것 같아 뿌듯하다 :)
확실히 복잡해지니까 더 시간이 걸리는듯!
그래도 이전보다 나아지는 코드에 뿌듯함이 많이 드는 것 같다 :)