190108-TIL


Git

  • Git Blame -L

    • 특정 라인 범위가 변경된 히스토리를 볼 수 있다.

    • 사용 예시 : git blame -L 265,+12 -- joshua_test.java

    • 참고 자료 : https://stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a-specific-line-in-a-file

    • 이 명령어 역시, ‘git 사용법 잘 알아야겠다’고 생각하게 된 계기가 되었다.

      왜냐면 특정 라인에 대해 ‘예전에도 이 코드가 들어있었나? 그전에는 다른 사람들이 어떻게 작성했었지?’를 찾아야 될 때가 있는데, 일일히 모든 커밋 히스토리 뒤적거려가면서 하나하나 눌러보고 파악했었기 때문이다.

Spring

  • 스프링 프레임워크 입문 (https://www.inflearn.com/course/spring/)

    • 강의 들으면서 어설프게 이해하고 넘어갔던 개념들 복습중..
      • Petclinic 프로젝트는 확실히 참고하기 좋은 코드인듯
    • 의존성 주입 (DI) -> 생성자 주입
      • 어떤 빈이 되는 클래스에 생성자가 오로지 하나만 있고, 그 생성자의 매개변수 타입이 Bean으로 등록되어 있다면 Autowired 어노테이션을 생략하더라도 주입을 해준다.
      • Autowired는 setter가 있는 경우 setter에 붙이고, 없다면 필드에 붙이자.
        • 물론 인텔리제이에서는 생성자를 통한 주입을 권장하고 있음
    • Bean을 꺼내다쓸 때, ApplicationContext를 직접 주입하고 getBean을 이용할 수도 있지만 부트에서 그렇게 할 이유는 전혀 없다.
      • 그렇지만 이게 어떤 원리로 동작하는지, 지금은 왜 이게 없어도 편리하게 Bean을 꺼내다쓸 수 있는지 별도로 찾아서 공부해봐야겠다.
    • Petclinic 소스에서 PetRepository는 아무런 어노테이션이 없는데 어째서 Bean으로 등록이 되는가?
      • 스프링의 IoC 컨트롤러, 즉 ApplicationContext에는 수많은 LifeCycle Interface가 있다
      • 이 인터페이스를 구현하면 ApplicationContext에 관계된 수많은 단계에 끼어 들어갈 수 있음. 그 중 하나로 spring-data-jpa가 만들어준 것을 상속받아서 PetRepository는 Bean으로 등록이 되는 것
      • PetRepository가 상속하고 있는 Repository 인터페이스를 까보자. spring-data-commons 안에 들어있는 인터페이스고, 처음 설명은 다음과 같다.
        • Central repository marker interface. Captures the domain type to manage as well as the domain type’s id type. General purpose is to hold type information as well as being able to discover interfaces that extend this one during classpath scanning for easy Spring bean creation.
        • 번역기 : 중앙 저장소 마커 인터페이스. 관리 할 도메인 유형과 도메인 유형의 ID 유형을 캡처합니다. 범용 목적은 타입 정보를 유지하는 것뿐만 아니라 클래스 패스 스캐닝 동안 이 정보를 확장하여 스프링 빈을 쉽게 생성 할 수 있는 인터페이스를 발견하는 것입니다.
    • AOP 작성 실습

      • 어노테이션 작성 시에 사용하는 어노테이션 설명

        • Target : 지금 작성하는 이 어노테이션을 어디에 붙일건지 (메서드에 붙일거면 METHOD)
        • Retention : 이 어노테이션을 사용한 코드를 언제까지 유지할 것인지 (런타임까지 유지할거면 RUNTIME)
          • 런타임까지 유지해줘야 스프링이 그걸 찾아서 적용해줌
      • 어노테이션은 그 자체가 기능을 갖고 있지 않다. 주석과도 같은 것임. 따라서 어노테이션을 만들고 그걸 붙여줬다고 해서 갑자기 뭔가 뿅! 하고 해주지는 않는다.

        • 따라서 이걸 처리해줄 친구들을 만들어야 함
        • 이번꺼는 AOP 해보려고 만들었으니 Aspect가 붙은 Class를 만들어보자
      • @Aspect

        • 스프링 Bean만 Aspect가 될 수 있다
      • @Around

        • 여기서 명시한 어노테이션이 붙은 애들에게 수행될 작업이라는 것을 알려줌
        • 수행될 원래 작업은 joinPoint.proceed()로 동작하게 만듬
        @Around("@annotation(LogExecutionTime)")
        public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
              
            Object ret = joinPoint.proceed();
              
            stopWatch.stop();
            logger.info(stopWatch.prettyPrint());
              
            return ret;
        }
        
      • 자세한 원리는 따로 찾아보고 공부할 필요가 있음 (우선은 더 중요한 것부터 확실한 이해를..)