좌충우돌 개발

테스트 케이스

|

클린코드 9장 단위 테스트

TDD 법칙

  1. 실패하는 단위 테스트를 작성할 때까지는 실제 코드를 작성하지 않는다.
  2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
  3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

깨끗한 테스트 코드를 유지해야 한다. 테스트 코드도 지속적으로 관리되어야 하기 때문이다. 코드에 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 단위 테스트이다.

개념당 assert문 수를 최소로 줄여라 . 테스트 함수 하나는 개념 하나만 테스트한다.

FIRST

  • 빠르게(Fast) : 테스트는 빨라야 한다. 테스트가 느리다면 자주 테스트를 할수 없게 되고 조기에 문제점을 찾아내 고치지 못하게 된다.
  • 독립적(Independent) : 각 테스트는 서로 의존하면 안된다.
  • 반복가능하게(Repeatable): 테스트는 어떤 환경에서도 반복가능해야 한다.( mock 이나 stub 사용)
  • 자가검증(Self-validating) : 테스트는 부울(bool) 결과를 내 야 한다.
  • 적시성(Timely): 단위 테스트는 테스트하려는 실행코드를 구현하기 직전에 구현한다.

Docker mysql 설치

|

Docker

docker machine 생성(터미널 접속)

  • docker-machine
  • docker-machine create —driver virtualbox 머신이름 : docker머신 생성
  • docker-machine start 머신이름 : docker데몬이 연결이 안될 때 머신 이름으로 시작한다

docker 명령어

  • docker search 이미지 검색
  • docker pull mysql 최신 버전의 mysql이 설치된 ubuntu리눅스 이미지 다운 받기
docker-machine create —driver virtualbox 머신이름

docker pull mysql

docker run --name mysql -e MYSQL_ROOT_PASSWORD=mypass -d -p 3306:3306 mysql

docker exec -it docker이름 /bin/bash

apt-get update

apt-get install net-tools

docker tool를 사용했을 때 문제 발생

  • 로컬에서 docker-tools를 통해 설치된 mysql에 접속을 할수 없다.
  • docker 자체 ip가 아닌 docker-machine의 ip로 접속해야 한다.
  • container 를 생성하면 기본적으로 외부와 통신이 불가능한 상태이다. 따라서 외부와 통신을 위해서는 container를 외부로 노출할 Port를 지정해야한다. 노출할 port를 지정하는 방법은 container 를 생성할때 -p option을 이용하면 된다. 

의존관계

|

Dependency + Injection + Framework

1. Dependency ( Dependency relationship)

의존 관계의 발생

  • supplier가 client의 필드
  • supplier가 client의 method의 파라미터
  • supplier가 client의 local 변수
  • supplier로 메시지를 보냄

의존관계가 생기면 supplier에 변경이 발생하였을 때 client에 영향 받게 되므로 client의 재사용이 어려워 진다.

재사용 가능한(reusable) 객체지향 설계/개발

  • client는 재사용이 어렵다.
  • client는 component/서비스가 될수 없다
  • component란 이를 만든 개발자의 영향이 미치지 않는 곳에서도 아무 변경없이 필요에 따라 확장해서 사용될 수 있는 소프트웨어 덩이다.

재사용

  • 재사용이 가능하게 되면 생산성이 향상된다.
  • 재사용 가능한 객체 지향 소프트웨어를 위한 구성이 디자인 패턴이다

Design patten

“ Elements of Reusable Object - Oriented software -Gof- ”

  • Object pattern 은 런타임 시 바뀔 수 있는 (상속이나, 관계보다) 더 동적인 오브젝트 (의존) 관계를 다룬다.
  • Design pattern의 분류 방법 중 class pattern과 object pattern으로 구분 할 수 있다.
  • Design pattern에서의 dependency : 컴파일 타임이 아니라 런타임 시 결정/구성되는 오브젝트 의존관계를 말한다.
  • 이를 위해서
    1. 구현 대신 인터페이스 사용
    2. 오브젝트 합성(composition) 사용

Java 설치 (ubuntu)

|

Java 설치

  • ubuntu 에서 java 자동 설치 : apt-get install java
  • ubuntu 에서 java 수동 설치
  • wget 을 설치 : apt-get install wget
  • wget –header “Cookie: oraclelicense=accept-securebackup-cookie” [http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.tar.gz]
  • 압축풀기 : tar -xvf 파일명
  • ln -s jdk1.8.0_05/ java : 실볼릭 링크 만들기
  • 쿠기 설정 후 다운로드
  • 다운 로드 된 압축 파일 압축 해제
  • cd ~ : home directory 로 이동
  • ls -al : directory 내의모든 파일 확인
  • vim 설치 : apt-get install vim
  • .bash_profile 설정 :
    JAVA\_HOME =/usr/apps/java
    PATH=$PATH:$JAVA_HOME/bin
    
  • source 명령어 : 로그아웃하지 않고도 환경설정 반영됨
    source .bash_profile
    

Docker 시작하기

|

Docker

Docker tool 설치

docker machine 생성(터미널 접속)

  • docker-machine
  • docker-machine create —driver virtualbox 머신이름 : docker머신 생성
  • docker-machine start 머신이름 : docker데몬이 연결이 안될 때 머신 이름으로 시작한다
  • docker-machine ls : 현재 생성된 docker 머신 목록
  • docker-machine ip : docker 머신의 ip정보
  • docker-machine env docker이름 : docker 머신의 환경 정보
  • docker images : 현재 로컬에 생성된 이미지 목록(docker 데몬이 연결이 되어 있지 않으면 에러가 발생한다)
  • docker-machine env docker이름 실행했을 때의 마지막 줄 실행
    eval $(docker-machine env docker이름)
    

docker 명령어

  • docker search 이미지 검색
  • docker images : 현재 로컬에 있는 이미지 목록
  • docker rm run된이름 : run되고 있는 컨테이너 삭제
  • docker run -dit -name 컨테이너이름 이미지이름
  • docker start 컨테이너 이름 : 컨테이너 시작
  • docker stop 컨테이너 이름 : 컨테이너 중지
  • docker restart 컨테이너 이름 : 컨테이너 재시작
  • docker attach 컨테이너 이름 : 시작된 컨테이너에 접속
    • 컨테이너 접속 시 bash 상태에서 exit나 ctrl+D를 하게되면 컨테이너 정지
    • ctrl+P, ctrl+Q를 차례대로 누르면 컨테이너가 정지되지 않고 빠져나옴
  • docker ps -a : 컨테이너 목록 확인
  • docker stop 컨테이너이름 : 컨테이너 정지
  • docker exec -it 컨테이너이름 /bin/bash : 외부에서 컨테이너 안으로 명령어 실행하기
  • docker inspect 컨테이너이름 : 컨테이너 상세정보

docker에 ubuntu 설치

  • docker pull ubuntu : ubuntu 이미지 다운 받기
  • docker run -name 이름 ubuntu : 이미지로 컨테이너 생성하기

docker에 한글팩 ubuntu 설치

  • docker 이미지 생성 Dockerfile 파일내용
FROM ubuntu:latest

RUN apt-get update

RUN apt-get install -y language-pack-ko

RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

CMD /bin/bash
  • docker build —tag ko_ubuntu:latest ./

  • docker run -it -—name ko_ubutu ko_ubuntu /bin/bash

-> kor_ubuntu 이미지로 docker ko_ubuntu 이름으로 docker 실행하고 bash쉘로 로그인 한다

  • docker exec -it docker실행이름

Docker 이미지 만들기

  • docker hub(web) 나 docker search 명령어를 통해 image를 검색
  • Dockerfile을 통해 이미지를 만들수 있다
    • 아래 예제 같이 설치해야 하는 작업들을 작성한다
FROM podbox/java8
RUN apt-get update

RUN apt-get install  -y language-pack-ko

# set locale ko_KR
RUN locale-gen ko_KR.UTF-8

ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

RUN apt-get install -y \
 vim \
 git

CMD /bin/bash
  • docker ps -a : 현재 떠있는 컨테이너 목록
  • docker stop $(docker ps -a -q) : 실행 중인 모든 컨테이너 중지
  • locale
  • docker start 이미지 이름
  • docker build -t ko_java8 .

docker에 서비스 배포하기

공통

git

  • git 과 java 가 설치된 컨테이너를 실행한다
  • git clone url : 최초 git에서 다운 받을 때
  • git pull url : 변경된 사항 받을 때
  • 클론한 directory로 이동
  • git branch -a 실행
  • git에서 배포하고자 하는 branch로 변경
    git checkout -b  로컬branch이름  origin/원격branch이름
    git branch -a
    git branch -vv
    

빌드

  • maven 일 때 : mvnw clean package
  • gradle 일 때 : gradlew build

A. 실행 jar 배포

  • 해당 빌드한 jar파일 실행 : java -jar 실행jar파일

B. war로 배포

  • war로 배포할 때는 컨테이너에 tomcat도 설치되어 있어야 한다.
  • 컨테이너에서 apt-get 으로 tomcat을 설치할 경우 실행이 되지 않는 문제점이 있다. 왜?
  • 컨테이너에 wget을 설치(apt-get install wget) 한후 tomcat 사이트에서 link를 복사후 다운 받아서 설치하면 정상적으로 동작함을 확인 할 수 있다.
  • 빌드한 war 파일을 tomcat/webapps/ 로 복사
  • 해당 war파일을 ROOT.war로 이름을 변경
  • tomcat/bin/startup.sh 실행
  • war파일이 풀리면서 ROOT디렉토리가 생성된다. 이때 정상적으로 서비스가 모두 올라오는데 많은 시간이 소요된다. sh을 기동하자마자 해당 페이지를 테스트하면 페이지를 찾을 수 없다고 나온다.

       docker run -dit --name 컨테이너이름 -p docker_port : service_port 이미지이름