171228-TIL

Reading time ~1 minute

오늘 한일

- DI 및 Spring DI

  • @Controller, @Service, @Repository 애노테이션이 설정된 클래스에 대한 인스턴스 생성 및 의존관계 설정을 애노테이션으로 자동화 완료

  • MVC 프레임워크의 AnnotationHandlerMapping이 BeanFactory와 BeanScanner를 활용해 동작하도록 리팩토링

  • for문을 사용한 부분들을 스트림으로 변경

  • null 관련 부분들을 Optional로 변경(약간 아쉬운 부분이 있어 다시 진행 중)

- Optional의 orElse()와 orElseGet()

  • 소스 코드를 볼수 있으면 좋은 점이 이거다.

    Object object1 = objectOptional.orElse(new Object());
    Object object2 = objectOptional.orElseGet(() -> new Object());
    
    출처: http://multifrontgarden.tistory.com/131 [우리집앞마당]
    

    두 메소드의 차이점을 인터넷으로 보다 보니 전자의 경우 Optional 내부의 값이 null이 아닌 경우에도 무조건 객체를 생성하고 후자의 경우 null인 경우만 생성을 한다는 설명을 봤다. 설명 자체가 이해가 안 되진 않는다.

    public T orElse(T other) {
        return value != null ? value : other;
    }
    
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }
    

    이렇게 Optional 내부를 보면 이해 자체를 할 필요도 사라지고 확실히 기억된다.
    덤으로 지금 orElseGet을 사용하려는데 자꾸 컴파일 에러가 나서 고생 중이었는데 왜 안되고 있는지도 알 수 있다.


오늘 느낀점

  • 1단계 힌트로만 진행하고 있었는데 오후에 2단계 힌트를 봤다. 어떤 메소드를 만들어야 하는지 설명이 있다 보니 두 시간 정도 만에 초록불이 보이게 완성했던 거 같다. 힌트를 보기전에 내가 예상했던 방법으로 구현하게 되어있던데 아직은 대략적인 형태는 예상돼도 실체화(?) 시키는 능력까지는 부족한 것 같다. 특히나 개인적인 욕심 때문인지 일정 이상의 힌트를 보고 만들면 통과했다는 느낌이 들지 해냈다는 느낌이 안 나는 것 같다..

  • for 문을 스트림으로 변경하는 건 크게 어려움이 없는데 생각해보면 매번 for 문으로 요구 사항을 해결 한 다음 리팩토링단계때 스트림으로 변경하는 것 같다. 다음번부터는 처음부터 스트림으로 작성하는 버릇을 들여봐야겠다.

  • 마찬가지로 Optional을 적용하고 있는데 자주 사용하지 않다 보니 약간 헤맨 감이 있었다. 구현 자체는 해뒀는데 Optional을 제대로 사용한 느낌이 아니라 좀 더 보고 있다. 일단 이 부분이 해결되면 pr을 보내도록 해야겠다.(동시에 다른 곳도 마음에 안 드는 곳이 보이면 고치는 중이다)

  • 오후 5시쯤 너무 피곤해서 30분쯤 자고 일어나니 다시 팔팔해졌다.(그러고나니 낮에 구현했던 코드들에서 불필요한 부분들도 많이 보이더라) 도리어 지금 하나도 안졸려서 문제다.


내일 할일

  • DI 프레임워크 실습 마무리
    • Optional 적용
  • 백엔드 송년회