반응형

div를 사용하여 기본 샘플을 살펴보자.

See the Pen 너비(width, height) by Myeongjun Go (@junngo) on CodePen.

코드를 보면 div를 선언하고 width와 height가 각각 100px로 설정이 되어있다.

2개의 속성의 기본값은 auto(자동)이다. 특별히 px같은 값으로 명시를 하지 않는다면 이 2개의 속성은 브라우저가 자동으로 계산해준다. 이 점을 인지하고 있지 못하다면  width나 height 속성을 제대로 활용할 수가 없다. 하나 지우면 갑자기 넓어지고, 다른걸 지우면 안나고 하는 현상이 발생하기 때문이다.

자동으로 계산이 된다는 이야기는 태그가 블록인지 인라인지에 따라서 달라진다.

 

인라인 요소

대표적인 인라인 태그인 span 태그를 살펴보자.

width: 콘텐츠 크기만큼 늘려준다.

height: 콘텐츠 크기만큼 늘려준다.

 

* 인라인 요소는 width 와 height를 명시해도 효과가 전혀 없다. 인라인은 가로 세로 크기가 명시가 안된다.

 

블록 요소

대표적 블록 태그는 div를 살펴보자.

width: 가로 요소를 부모 크기만큼 최대한 늘려준다.

height: 세로 요소를 컨텐츠 크키만큼 늘려준다.

 

세로 요소는 지정된  값이 없고, 콘텐츠도 없다면 하면에 아예 출력이 되지 않는다. 이점에 대해서는 주의가 필요.

 

추가적 속성 값

max-widht / max-height: 기본 값은 none

min-widht / min-height: 기본 값은 0

 

반응형
반응형

배치 작업은 한국말로 일괄 작업을 뜻합니다. 고객이 송금이나 주문을 하는 작업은 실시간으로 발생이 됩니다. 고객에 입장에서는 모든 작업이 실시간 작업으로 실행될 것으로 판단이 되나, 내부적으로 특정 시간대마다 발생되는 배치 작업이 굉장히 많습니다. 고객은 주문은 하였지만 주문 이후 다음 STEP은(상품 포장, 배송 등)는 배치 작업으로 처리가 될 수도 있습니다. 송금 작업 이후에도 고객의 금액에 대한 집계 작업 또는 후 처리에 대해서는 모두 일괄 작업으로 수행이 될 것입니다.

배치작업이 필요한 예시

  • 포장, 배송
  • 송금 작업 후 금액 집계
  • 이메일 알람
  • 일/주/월 정산
  • 주기별로 필요한 크롤링 및 데이터 호출

고객은 모르게 시스템 뒷쪽에는 수 많은 배치 작업들이 동작을 하고 있습니다.

배치 작업을 만들기 위해서 필요한 시스템 개발은 다양한 프로그래밍 언어로 개발을 할 수 있습니다.

그 중에서 자바와 Spring Batch를 활용하여 배치 학습을 하도록 하겠습니다.

 

 

반응형
반응형

도커를 통해서 mysql 설치 및 접속 방법

 

1. mysql 설치

docker run -d -p 3306:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=q1w2e3r4 mysql:latest

-p 3306:3306 : 외부와 도커 내부 3306포트로 연결

--name mysql-container : 컨테이너 이름 지정

 

2. 도커 접속

docker exec -it mysql-container bash

 

3. 로그인

mysql -u root -p;

입력 및 패스워드 입력

반응형
반응형

SRP(Single Responsibility principle)

단일 책임 원칙 - 쉽게 유지 보수하고, 이해하기 쉬운 코드와 버그 발생 시 범위를 줄인다.

1. 한 클래스는 한 기능만 책임진다.

2. 클래스가 바뀌어야 하는 이유는 오직 하나여야 한다.

 

코드가 변경되는 이유가 여러개라면, 여러 장소에서 코드 변경이 된다. 유지보수, 추가 개발이 어렵다.

코드를 이해하고 변경하기 어려워진다. 기능들에 대해서 개별로 분리하라.

 

ex) 파싱 프로그램

1. 입력 읽기

2. 주어진 형식 파싱

3. 결과처리

4. 결과 요약 리포트

 

파싱 하는 작업을 한 클래스 내에서 작업하는 것이 아닌 기능의 따라서 코드를 분리한다.

 

응집도(Cohesion)

클래스나 메서드의 책임이 서로 얼마나 강하게 연결되어 있는지를 측정.

응집도가 높은 코드를 작성.

ex) CSV 데이터를 파싱하는 작업과 관련된 두 메서드를 한그룹으로 만들었다 <- 응집도가 높다

속성에 맞는 것을 모아서 클래스로 작성 하자. 계산 작업을 하는 로직을 파싱이나, 결과 전송하는 로직과 같은 곳에 작성이 되어 있다면 직접적이 관련이 없기 때문에 응집도가 떨어진다.

 

클래스를 개발할 때는 흔히 다음과 같은 카테고리로 그룹화(클래스 분리)

기능 / 정보 / 유틸리티 / 논리 / 순차 / 시간

 

결합도(Coupling)

한 기능이 다른 클래스에 얼마나 의존하고 있는지를 가늠. 많은 클래스를 참조할 수록 기능을 변경할 때 유연성이 떨어진다. 어떤 클래스의 코드를 바꾸면 이 클래스에 의존하는 모든 클래스가 영향을 받는다.

결합도가 낮은 코드를 작성.

 

인터페이스를 이용하면 요구 사항이 바뀌더라도 유연성을 유지할 수 있다.

ex) csv를 파싱하는데 json 항목으로 인코딩된 거래 내역을 파싱할려면? xml으로 파싱할려면? 최초 개발시 현재 개발하는 부분이 추가적으로 개발이 필요하단걸 염두 했다면 인터페이스를 이용했을 것이고, 구현한 클래스를 만들어서 호출하는 부분은 로직 변경 없이 손쉽게 기능을 추가를 할 수 있다.

 

 

명심하고 또 명심)

KISS (Kepp It Short and Simple)

DRY (Don't repeat yourself)

갓 클래스와 중복 코드를 피하자.

 

OCP (Open / Closed Principle)

코드를 직접 변경하지 않고 해당 메서드나 동작을 바꿀 수 있다. 코드 변경 없이(closed), 확장성은 개방(open)된다.

어떻게? 인터페이스를 사용한다.

반복 로직 비즈니스 로직이 결합되어 있다면 인터페이스를 사용해서 결합을 제거하자.

 

실제로 코드를 직접 변경하지 않는 다는 이야기는 호출하는 부분에서는 코드르 변경하지 않는다는 이야기다. 확장을 하고자 하는 코드는 당연히 확장을 하기 위해서는 코드 작성이 필요하다.

 

 

더 나은 코드와 샘플 코드를 많이 보고 생각하고 곱씹고 익히자.

명심하고 또 명심하자. 유지보수와 기능 개발을 하게 쉽게 해야돼.

더 재밌게 코드를 작성할 수 있어!

 

소스코드)

https://github.com/Iteratr-Learning/Real-World-Software-Development/tree/master/src/main/java/com/iteratrlearning/shu_book/chapter_03

 

책 참고)

실전 자바 소프트웨어 개발

반응형
반응형

안녕하세요.

우리가 작성한 코드가 깃헙이나 깃랩에 push가 되면 자동으로 빌드 및 배포가 될 수 있도록 CI 툴을 많은 사용 합니다.

젠킨스나, Travis CI는 많이 들어 보셨으리라 생각이 되는데요.

앞에 말씀드린 툴 이외에도 Drone.io라는 CI 툴이 있습니다.

Drone.io를 사용해보도록 하겠습니다.

 

도커 기반으로 설치를 하기 때문에 도커가 설치가 되어 있으셔야 됩니다.

 

1. 깃랩 클라이언트ID와 키를 발급

깃랩 프로젝트 레파짓을 사용하기 때문에 클라이언트 ID와 키를 발급 받으셔야 됩니다.

깃랩 로그인 후 오른쪽 상단 프로필을 눌러주세요.

preference -> Application(왼쪽 메뉴) -> 값 입력

Name: 구분 이름

Redirect URI: 드론.io를 설치할 서버 URI/login

ex) http://127.0.0.1:8080/login

---> 포트번호는 설정의 따라서 달라질 수 있습니다.

 

확인을 누르고 나면 Application ID와 Secret을 확인하실 수 있습니다.

 

2. 서버에서 시크릿 키 발급

openssl rand -hex 16

 

3. 서버에서 드론(서버) 설치 (도커로 진행)

docker pull drone/drone:1

 

4. 환경 변수 등록 (~/.bashrc)

export DRONE_GITLAB_CLIENT_ID=[...]  <- 깃랩에서 발급 받은 클라이언트 아이디
export DRONE_GITLAB_CLIENT_SECRET=[...]  <- 깃랩에서 발급 받은 시크릿 키
export DRONE_RPC_SECRET=[...] <- 2번 항목 서버에서 발급 받은 키
export DRONE_SERVER_HOST=127.0.0.1:8080
export DRONE_SERVER_PROTO=http

등록 후  source ~/.bashrc 명령어를 입력해주세요

 

5. 드론 서버 구동

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=https://gitlab.com \
  --env=DRONE_GITLAB_CLIENT_ID=`echo $DRONE_GITLAB_CLIENT_ID` \
  --env=DRONE_GITLAB_CLIENT_SECRET=`echo $DRONE_GITLAB_CLIENT_SECRET` \
  --env=DRONE_RPC_SECRET=`echo $DRONE_RPC_SECRET` \
  --env=DRONE_SERVER_HOST=`echo $DRONE_SERVER_HOST` \
  --env=DRONE_SERVER_PROTO=`echo $DRONE_SERVER_PROTO` \
  --env=DRONE_LOGS_TRACE=true \
  --publish=8080:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

구동할 때 8080 포트로 구동하였습니다.

 

6. 드론 서버 구동 확인

docker ps -a
docker logs drone

위의 명령어를 통해서 도커가 잘 구동이 되었는지 확인을 해주세요.

그리고 등록하신 서버 호스트 주소를 입력하여 drone.io 대시보드가 잘 보이는지 확인을 해주시면 되겠습니다.

 

지금까지는 Drone 서버를 설치를 하였습니다.

이후에 개발자가 깃랩에 코드를 push 하고 드론이 자동으로 빌드를 하기 위해서는 drone runner를 설치를 해주셔야 됩니다.

즉, 드론 서버는 깃랩과 통신을 하기 위한 서버 역할을 하고, runner는 (빌드) 작업을 진행하는 역할을 합니다.

러너가 없다면 코드가 push 되고 드론 서버에서 요청을 받아도 빌드 작업을 진행할 수 없습니다.

 

7. 드론 러너 설치 (도커)

docker pull drone/drone-runner-docker:1

 

8. 환경변수 등록(~/.bashrc)

export DRONE_RPC_HOST=127.0.0.1:8080
export DRONE_RPC_PROTO=http

 

9. 드론 러너 구동

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=`echo $DRONE_RPC_PROTO` \
  -e DRONE_RPC_HOST=`echo $DRONE_RPC_HOST` \
  -e DRONE_RPC_SECRET=`echo $DRONE_RPC_SECRET` \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=`echo $HOSTNAME` \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

 

10. 드론 러너 구동 확인

docker logs runner

위와 같이 성공으로 나오면 이상 없이 설치가 되셨습니다.

 

러너까지 설치가 완료되셨다면, drone.io를 사용하기 위한 준비는 끝났습니다.

감사합니다.

 

 

[참고 문서]

드론 서버: docs.drone.io/runner/docker/installation/linux/

드론 runner: docs.drone.io/runner/docker/overview/

 

 

반응형

+ Recent posts