코드 리뷰
이번 시간에는 호눅스가 리뷰를 해주셨다!
우선 질문했던 2가지 에 대한 답변부터 살펴보자.
질문 1
우선 저의 repository는 Map을 사용하고 있습니다. (User를 저장할때 Map에 전달하는 Key값인 ID 와 userId(닉네임)은 다릅니다!)
기존에 가입된 userId로 중복 가입시 예외를 던지기 위해 service에 다음과 같은 메서드를 만들었습니다.
public class UserService {
// 생략...
private boolean isDuplicateUserId(String userId) {
return repository.findAll().stream()
.anyMatch(u -> userId.equals(u.getUserId()));
}
}
하지만 위 방식은 Service에서 repository의 모든 membe에 대한 정보를 매번 읽어오기 때문에 문제가 된다고 생각합니다.
따라서 repository 내부에서 entryset을 활용한 메서드를 따로 만들어 주어야 할까요?
public class MemoryUserRepository implements UserRepository {
private final Map<Long, User> store = new ConcurrentHashMap<>();
private Long sequence = 0L;
// 생략...
이걸 Service에서 검증해야하는 것 같은데... 매번 repository에서 값을 끌어다 쓰니 좋지 못한것 같아서요!
질문 2
디렉토리 구조를 좀더 잘 설계하고 싶다면 무엇을 공부해야 하나요?? "클린 아키텍처" 이런 책을 읽어보면 될까요?
1. User의 id 필드 의미
Primary key 같이 개별 User를 식별 하기 위한 키로 id를 사용하였습니다.
이후 사용자를 등록하는 UserRepository#save 메서드에서 sequence 번호를 증가시켜 저장할때 전달하게 하였습니다!
public Long save(User user) {
user.setId(++sequence);
store.put(user.getId(), user);
return user.getId();
}
2. @Repository의 의미
@Repository의 역할은 영속화(저장)와 관련된 예외를 catch하며, 그 예외를 다시 Spring에게 uncheckd exception으로 던지게 합니다.
이를 위해서 Spring은 PersistenceExceptionTranslationPostProcessor 를 제공하는데 (SpringBoot를 쓴다면 자동 등록)
<bean class= "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
@Repository 에노테이션을 사용할수 있도록 도와줍니다. 추가적으로 Service에 대하여도 다음 글에서 읽어보았다!
3. 의미 있는 변수명 사용하기
4. 알수 없는 Map의 사용...
지나고 보니 왜 내가 이런식으로 코드를 작성한건지 모르겠다... (뇌가 힘들었나??...)
다음과 같이 변경하였습니다.
public Optional<User> findById(Long id) {
return Optional.ofNullable(userMap.get(id));
}
음 일단 자료구조는 Key:Value로 관리하는 Map을 사용하고 싶었기 때문에 List로 변경하지는 않았습니다.
일단 Map을 계속사용해 보고 싶었기 때문입니다. ㅎㅎ
5. Map에서 Key값 변경하기
원래 나의 MemoryUserRepository 에서는 User id를 통해 map에 저장하였다.
public class User {
private Long id;
private String userId;
private String password;
private String name;
private String email;
// 생략...
}
User에는 user를 식별하는 id 와 닉네임에 해당되는 userId가 있다.
public class MemoryUserRepository implements UserRepository {
private final Map<Long, User> userMap = new ConcurrentHashMap<>();
private Long sequence = 0L;
// 생략 ...
}
이를 Map<String, User> 로 변경하였다. 이후 다음과 같은 부가적인 효과를 얻을 수 있었다.
'CODE SQUAD > FeedBack 정리' 카테고리의 다른 글
[Review] 스프링 카페 3단계 - DB에 저장하기 (2022/03/11) (0) | 2022.03.11 |
---|---|
[Review] 스프링 카페 2단계 - 글 쓰기 기능 구현 (2022/03/08) (0) | 2022.03.08 |
[Review] 로또 3단계 - 코드 리뷰 반영 (2022/02/27) (0) | 2022.02.27 |
[Review] 로또 3단계 - 수동구매 기능 추가 (2022/02/25) (0) | 2022.02.25 |
[Review] 사다리 구현 5단계 - 실행결과 출력 (2022/02/22) (0) | 2022.02.23 |
댓글