TIL - 0526

스프링

스프링이 추구하는 가치에 맞게 개발해보기 - 스프링이 DI를 사용하게된 이유

  • 자바가 추구하는 가치 그대로 객체지향이다 : 이전 엔터프라이즈 기술은 기술 개발에만 치중해있었음
  • 오브젝트 중심 개발 : 객체 존재, 객체 관계, 객체지향적인 설계(역할 분리, 변경이 생기더라도 한 곳에만 변경을 할 수 있게 확장을 고려한 설계, 쪼갤 수 있을 때까지)
    • User(자바빈)와 UserDAO(데이터베이스 - 데이터 핸들링)
  • 관심사란? 객체가 처리해야할 일
    • UserDAO를 예를 들어서 : DB 커넥션, SQL 생성 / 실행, 사용한 자원 반환
  • 아래 UserDAO의 문제점은 무엇일까? 데이터베이스 변경이 일어난다면? add 작업 말고 get, delete 등 작업할 때마다 코드 중복은? 다른 관심사가 하나에 몰려있음
  • 문제점 해결하기 : 관심사항을 분리시켜서 변경점 하나로 만들기
    1. 직접 작성하고 리팩토링
    2. 우선 중복되는 코드를 메소드로 분리함 - 중복 있는 코드에 한 부분 변경이 생겼을 때 모두 변경해야하니 변경점을 하나로 만듦
    3. 독립시키기 - 상속 : 같은 사용 방법인데, 일부분만 다를 때 서브 클래스를 만들어 서브 클래스에서 구현하도록 함, 확장/축소하더라도 그 부분만 변경하면 됨, 어떻게 생성되는지는 관심없고 생성되는 것에만 관심을 두게끔
    4. 완전히 독립시키기 - DAO가 여러 종류가 생긴다면? 의존관계로 만들어보자 : dependency injection 으로 해결하기, 스프링 DI가 이해가 된다, 사용되는 오브젝트(서비스) / 사용하는 오브젝트(클라이언트) - 서비스의 종류를 클라이언트가 정할 수 있음(완전 독립적)
  • 단계별 의미를 정리해보자
    1. 단순히 코드 중복 문제를 해결함 : 사용하는 곳에서 데이터베이스가 각각 다를 떄 어떻게 대처할 것인가 라는 문제점이 남음
    2. 상속으로 각각 사용처마다 구현을 다르게 할 수 있도록(팩토리 메소드 패턴) 위 문제를 해결함 : 이미 상속을 하고 있는 상황이라면? 상속으로 해결한 부분이 변경되거나 없어지거나 한다면? 모두 고쳐야함
    3. 아예 관심사를 분리하자 : 객체 역할을 분리해버려서 사용하는 관계로 바꾸자, 필요없을 땐 디펜던시만 삭제하면되고, 해당 디펜던시가 기능이 추가/삭제에 상관없이 내가 쓰고 싶은 것만 쓸 수 있음, 표준 인터페이스를 사용하자(DIP 지키기 - 큰 개념에 의존하기) - 구체적인 정보는 모두 감춰버리고 표준 사용 방법으로 사용하게하기
  • 모두 정리해보자 : 관심사(를 한 곳에 몰아두지말고, 사용할 땐 구체적인 모습은 모르도록 추상화하여 감추자(사용에 초점을 맞출 수 있게 - 완전….. 객체지향…)

리눅스

리다이렉션이란

  • 표준 입출력, 표준 오류 방향을 재지정하는 것

표준 입출력 리다이렉션

  • 기본적으로 표준 입출력은 키보드와 화면
  • > : 표준 출력을 화면이 아닌 다른 곳(파일)으로 지정할 수 있음
  • >> : 위와 같은 역할이지만, 파일로 지정했을 때 덮어쓰기가 아닌 붙여쓰기가 됨
  • < : 표준 입력을 변경(파일)할 수 있음

표준 오류 리다이렉션

  • 표준 오류의 표준 출력은 화면, 그 방향을 재지정할 수 있음 : 파일 디스크립터를 통해 표준 오류를 가리키고 >, » 로 리다이렉션
  • 파일 디스크립터 : 열려있는 파일을 참조하는 값(자연수 지정), 표준 입력 / 표준 출력 / 표준 오류는 각각 0 / 1/ 2 할당(시스템이 할당)
$ ls -l /bin/usr 2> list-err.txt
$ ls -l /bin/usr 2>> list-err.txt
  • 표준 오류를 표준 출력으로 출력하기
$ ls -l /bin/usr > list-output.txt 2>&1
$ ls -l /bin/usr &> list.output.txt
  • 표준 오류 버리기
    • /dev/null : 입력받고도 아무런 동작하지않음, 쓰레기통과 같은 역할
$ ls -l /bin/usr 2> /dev/null

파이프

  • 명령어 실행을 연결하는 명령어(‘ ’)
  • 앞의 명령어 실행 결과(표준 출력)를 뒤의 명령어 실행(표준 입력)에 전달하는 역할
$ ls -l /usr/bin | less
  • 파이프로 엮는 필터 명령어
    • sort
    • uniq
    • wc
    • grep
$ ls -al /usr/bin | sort | uniq | grep zip