Written on
·
17
0
login 레포지토리 구현 과정에서 궁금한 점이 있어 질문드립니다.
findAll 메서드를 findByLoginId에서 활용함. 해당 메서드 활용이 다양한 면에서 불필요하다고 생각함
@Slf4j
@Repository
public class MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
public Member save(Member member) {
member.setId(++sequence);
log.info("save: member ={}", member);
store.put(member.getId(), member);
return member;
}
public Member findById(Long id) {
return store.get(id);
}
//문제의 부분
public Optional<Member> findByLoginId(String loginId) {
return findAll().stream()
.filter(m -> m.getLoginId().equals(loginId))
.findFirst();
}
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
findAll 메서드는 public 메서드이기 때문에 클래스 사용자와 맞닿아 있음. 따라서, findAll의 구현방식이 달라진다면 다른 메서드에도 영향이 감 (메서드간 결합도가 높음)
findAll이 public 메서드이기에 중복된 코드를 줄이기 위한 모듈화라고도 보기 어려움
결합도와 관계 없이 findAll의 경우 ArrayList에 다시 감싸는 작업때문에 시간복잡도도 증가함
그래서 저는 findAll 메서드를 활용하는 것이 아니라 그냥 아래와 같이 store.values()
를 직접 호출하는 것이 더 좋은 코드가 아닌가라는 생각이 들어요
(제가 결합도에 너무 집착하고 있는 것 같기도하네요)
public Optional<Member> findByLoginId(String loginId) {
return store.values().stream()
.filter(m -> m.getLoginId().equals(loginId))
.findFirst();
}
public 메서드라도 클래스 내부에서 재사용해도 상관없다.
public 메서드를 클래스 내부에서 사용하는 것은 좋지 않지만, 현재와 같이 변경 가능성이 작은 경우 상관없다.
성능은 조금 줄어들더라도 가독성이 우선이다. 그 정도의 성능저하로 보이진 않는다.
현재와 같이 간단한 메서드라면 재구현해도 상관이 없지만, 만약 findAll이 복잡한 로직의 메서드라면 재사용이 불가피하다.
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다. 정원영님. 질문 주신 내용을 바탕으로 여러 관련된 정보를 제공해드리겠습니다.
Public 메서드 재사용의 장점: 클래스 내부에서도 public 메서드를 재사용함으로써 코드 중복을 줄일 수 있고, 유지보수가 용이해지는 장점이 있습니다. 만약 메서드의 구현이 변경되더라도, 해당 메서드를 사용하는 모든 부분에서 변화가 반영될 수 있기 때문에 집중적 관리가 가능해집니다.
결합도와 모듈성: 높은 결합도로 인해 변경 시 영향을 받을 수 있는 부분도 있지만, 이는 코드의 일관성을 유지하고 모듈화의 장점을 살리기 위한 설계 선택일 수 있습니다. 특히, findAll
메서드처럼 간단한 구조의 메서드라면 재사용의 장점을 더욱 극대화할 수 있습니다.
성능과 가독성: 클래스 메서드인 findAll
은 실제로 데이터의 크기나 성능에 큰 영향을 미치지 않는다면, 코드의 가독성과 유지보수를 더 중시하는 것이 일반적입니다. 현대의 패턴에서는 가독성 및 유지보수를 종종 성능보다 우선시하기 때문입니다.
상황에 따른 최적화: 물론, findAll
메서드가 복잡해질 경우에는 성능을 고려하여 직접 store.values()
를 호출하는 방법도 고려해볼 수 있습니다. 하지만 현재 코드 형태에서는 충분히 괜찮고, 재구현의 필요성이 크지 않습니다.
이와 같은 접근 방식도 가능한 이유는 코드의 복잡성, 유지보수 편의성, 그리고 각 개발 환경에 따른 성능 최적화 요구사항이 다르기 때문입니다. 따라서, 현재의 상황과 필요에 맞게 설계를 조정하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
와 AI 성능 확실하네요. 사람의 의견이 아니라서 ChatGPT의 의견을 받는 것마냥 의심의 여지가 있지만 추가 참고 사례를 보니 조금 해소되는 것 같네요