Jul 16, 2019 - Constructor DI(Constructor Injection)

spring boot로 코딩 중에, @Autowired를 사용할 때,
inteliJ warning에서

always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies

이런 메시지가 뜰 경우에,

@Autowired
private TestService testService;

위의 경우를

private final PodsService podsService;
public TestController(TestService testService) {
    this.testService = testService;
}

다음과 같이 변경할 수 있습니다.

Spring 4.3부터는 Spring Bean으로 구성된 클래스가 오직 하나의 생성자를 가지면 Autowired 주석을 생략 할 수 있고 Spring은 해당 생성자를 사용하고 필요한 모든 의존성을 주입을 한다고 하네요.

DI도 디자인 패턴 중 하나이며, 의존성 주입이 코드 속에 숨겨질 경우, 의존하는 어떤 클래스가 문제가 생겼는지를 확인하기 위해서는 한번더 해당 클래스를 테스트해야하는 경우가 생깁니다.

Constructor DI 를 권장하는 이유는 다음과 같습니다.

  1. 단일 책임의 원칙 생성자의 인자가 많을 경우 코드량도 많아지고, 의존관계도 많아져 단일 책임의 원칙에 위배됩니다.
    그래서 Constructor Injection을 사용함으로써 의존관계, 복잡성을 쉽게 알수 있어 리팩토링의 단초를 제공하게 됩니다.

  2. 테스트 용이성 DI 컨테이너에서 관리되는 클래스는 특정 DI 컨테이너에 의존하지 않고 POJO여야 합니다.
    DI 컨테이너를 사용하지 않고도 인스턴스화 할 수 있고, 단위 테스트도 가능하며, 다른 DI 프레임 워크로 전환할 수도 있게 됩니다.

  3. Immutability Constructor Injection에서는 필드는 final로 선언할 수 있습니다.
    불변 객체가 가능한데 비해 Field Injection은 final는 선언할 수 없기 때문에 객체가 변경 가능한 상태가 된됩니다.

  4. 순환 의존성 Constructor Injection에서는 멤버 객체가 순환 의존성을 가질 경우 BeanCurrentlyInCreationException이 발생해서 순환 의존성을 알 수 있게 된됩니다.

  5. 의존성 명시 의존 객체 중 필수는 Constructor Injection을 옵션인 경우는 Setter Injection을 활용할 수 있습니다.


참조


Jul 10, 2019 - Log 압축 및 관리하기

#!/bin/bash
cd /home/logs/
case $? in
0)
        [ ! -d backup ] && mkdir backup
        find * -mtime +0 | xargs -t -i mv {} backup/{}.bak
        cd backup
        find *.bak | xargs -t -i tar cfz {}.tar {}
        rm -rf *.bak
        find * -mtime +60 | xargs -t -i rm -rf {}
;;
*)
    echo 'directory not found.'
;;
esac

log 자체가 하루에 21G 씩 쌓이다보니, 그대로 유지하기는 무리가 있습니다.
그렇기 때문에, 시간이 지난 파일은 압축을 하여, backup 폴더로 옮기는 작업을 진행하는 것이 좋습니다.
backup 폴더에 쌓이 파일을 30일을 기다렸다가, 지웁니다.

단순 로그성 파일이므로, 해당 파일을 압축하게 되면 100~200M 까지 줄어들게 되어, 서버 관리에 매우 유용합니다.

find * -mtime +0 오늘보다 과거를 의미합니다.

find -mtime -3      3일(72시간)보다 새로움
find -mtime 3       4일(96시간) 전에서 3일(72시간)전까지
find -mtime +3     4일(96시간)전보다 과거

find * -mtime +0 | xargs -t -i mv {} backup/{}.bak 오늘이 아닌 파일(어제 파일) bak 라는 파일명을 붙여서 backup 폴더로 이동시켜라라는 의미가 됩니다.

그리고 backup 폴더로 이동하여, bak 라는 파일명을 가진 파일을 tar 로 압축합니다. (용량 줄이기..) 압축한 후 bak 파일을 지웁니다.
60일 이전 파일을 지웁니다. (2달 파일 이력관리)

Jul 10, 2019 - GOOGLE 크롤링 IP 대역

public static void main(String[] args) {


        String GOOGLE_IP_01= "66.102.0.0,66.249.64.0,64.233.160.0,104.132.0.0,72.14.192.0";
        String GOOGLE_IP_02= "66.102.15.255,66.249.95.255,64.233.191.255,104.135.255.255,72.14.255.255";

        boolean crawling = false;
        long ip = ipToInt("221.142.49.47");
        String[] googleIp1 = GOOGLE_IP_01.split(",");
        String[] googleIp2 = GOOGLE_IP_02.split(",");

        if(googleIp1.length > 0 && googleIp1.length == googleIp2.length) {

            for (int i = 0; i < googleIp1.length; i++) {

                long googleIp01 = ipToInt(googleIp1[i]);
                long googleIp02 = ipToInt(googleIp2[i]);
                if (googleIp01 < ip && googleIp02 > ip) {
                    crawling = true;
                    break;
                }
            }
        }

        System.out.println(crawling);

    }




    public static Long ipToInt(String ipAddr) {
        String[] ipAddrArray = ipAddr.split("\\.");

        long num = 0;
        for (int i = 0; i < ipAddrArray.length; i++) {
            int power = 3 - i;
            /*
             * i의 값으 범위는 0~255 사이이며, 그 값을 256으로 나눈 나머지 값에
             * 256을 power의 값인
             * 1~9 사이는 2,
             * 10~99 사이는 1,
             * 100 이상은 0 의 값에 누승하여 num 값에 더함
             */
            num += ((Integer.parseInt(ipAddrArray[i]) % 256 * Math.pow(256, power)));
        }
        return num;
    }

구글에서 크롤링을 하는 ip 대역. 추가될때마다 계속 추가할 예정..

66.102.0.0 - 66.102.15.255 안에 대역이 구글 대역폭이라 그 안에 들어오는 유입건에 대해서는 무효처리하기 위해, 별도 기능 구현.