반응형

업무하다가 웹사이트를 빈번하게 들어가서 검색하기 어려운 것들이 조금 있어서,

메신저에서 검색하고 싶은 내용들이 많아서 봇을 만들어 보려고 한다.

 

텔레그램 봇 기능

https://core.telegram.org/bots 

에 명시된 기능 가능

 

텔레그램 bot api 문서

https://core.telegram.org/api

문서가 있지만 이거로 보고 개발하기 내용물이 많아 라이브러리를 사용하는게 낫겠다.

 

우선 이런 API 들을 사용하려면 키를 발급 받아야 한다.

 

bot 만들기 및 API 키 발급하기

텔레그램 검색창에 BotFather 검색 후 말을 건다.

BotFather 를 사칭하는 애가 ㅁ낳으니 위에서 처럼 ⌵ 로 체크된 공식 파더한테 말을 걸어라

방에 들어가면 위와 같이 help 메시지가 온다.

 

/newbot 이라고 채팅해서 봇을 만들자

        - [ /newbot ] 명령어를 입력하면, 봇의 이름을 입력하라고 함.

         - 봇의 이름이 'bot'으로 끝나지 않는 경우 생성되지 않음.

         - 정상적으로 등록되면 'HTTP API Access Token'을 발급해줌.

 

방이름과 bot 아이디는 변경 가능하다.

방이름 변경 - /mybots

봇이름 변경 - /setname

 

봇을 만들면 API 키값을 준다.

 

 

JAVA API 사용

Java

둘 중에 하나 골라서 사용하면 된다.

 

나는 https://github.com/rubenlagus/TelegramBots 이 API 를 골랐다. 이유는 딱히 없다.

 

자바 API 라이브러리

<dependency>
  <groupId>org.telegram</groupId>
  <artifactId>telegrambots</artifactId>
  <version>5.1.1</version>
</dependency>

예제코드

public static void main(String[] args) {
	SpringApplication.run(TelegramApplication.class, args);

	try {
		TelegramBotsApi api = new  TelegramBotsApi(DefaultBotSession.class);
		api.registerBot(new TestHandlers());
	} catch (TelegramApiException e) {
		e.printStackTrace();
	}

}

위 처럼 TelegramBotsApi 객체 생성 후 봇 정보를 기입한 클래스를 registerBot 에 등록만 해주면 된다.

세부로직은 등록한 클래스 TestHandlers 에서 작성한다.

 

public class TestHandlers extends TelegramLongPollingBot {

    @Override
    public String getBotUsername() {
        return "방제말고 bot 이름";
    }

    @Override
    public void onUpdateReceived(Update update) throws TelegramApiException {
        Message message = update.getMessage();
        log.info(message.toString());
        if (update.hasMessage() && update.getMessage().hasText()) {
            SendMessage sendMessage = new SendMessage();
            sendMessage.setChatId(update.getMessage().getChatId().toString());
            sendMessage.setText("자동 응답으로 보낼 메시지");
            execute(sendMessage);
        }
    }

    @Override
    public String getBotToken() {
        return "API_발급된키 넣어주세요.";
    }
}    

봇으로 등록 할 클래스 에는 TelegramLongPollingBot 을 상속 받아줘서 token 값 및 bot name 을 입력해서 

onUpdateReceived 에 로직 처리를 해주면 된다.

Update 클래스에는 유저 이름 및 id 등 여러 데이터가 넘어온다.

 

위와 같이 스프링 서버나 자바 를 run 시켜주면

telegram.me/봇이름

와 같이 웹 url 로 이동해 텔레그램 메신저로 이동해서 등록된 봇을 확인할 수 있다.

 

 

 

굳이 java api 로 하지않고 텔레그램 api 를 그대로 사용해도 된다.

반응형
반응형

typescript-kr.github.io/pages/tutorials/typescript-in-5-minutes.html

 

TypeScript 한글 문서

TypeScript 한글 번역 문서입니다

typescript-kr.github.io

 

반응형

'Languague > Typescript' 카테고리의 다른 글

[typescript ]typescript 설치 및 실행  (0) 2021.04.16
반응형

1. typescript 실행시 필요사항

1) node.js

    - 필요 이유 : typescript가 node.js 로 설치 됩니다.

 2) typescript

    - 용   도 : typescript를 javascript로 변경하는 컴파일러를 제공  합니다

    - 버   전 : 2.7.2

    - 설치 방법 : npm install -g typescript@2.7.2 (전역으로 설치)

   npm install -g typescript 로 최신버젼 설치 가능

    작성기준 typescript@4.2.4

 2) ts-node

    - 용   도 : typescript를 바로 실행하는데 사용 됩니다

    - 버   전 : 3.3.0

    - 설   치 : npm install -g ts-node@3.3.0

    npm install -g ts-node 로 최신버젼 설치 가능

    작성기준 ts-node@9.1.1

 

2. typescript 실행

  1) Sample 코드

let hello: string = "hello typescript!";
console.log(hello);

 

  2) 실행 방법

    (1) 파일 컴파일 실행

      - tsc(TypeScript Compiler)

      - tsc 로 컴파일하고 node로 실행

      > tsc .\hello.ts

      > node.\hello.js

      hello typescript!

 

    (2) 파일 직접 실행

      - ts-node로 바로 typescript 실행

      > ts-node .\hello.ts

      hello typescript!

 

 

   (3) 프로젝트 단위로 실행 

      - 프로젝트 단위로 실행 할때는 tsc 명령어 만으로 컴파일 가능. 

      A. tsc 만 실행 할경우 

        - 프로젝트 root 디렉토리에 tsconfig.json 파일이 존재한다면 해당 파일을 읽어 프로젝트 전체를 대상으로

          컴파일 

      B. tsc --outdir ./dist 로 실행 할경우

        - --outdir를 통하여 컴파일 결과가 담김 디렉토리를 선택하면 해당 디렉토리로 컴과일 결과가 저장

반응형

'Languague > Typescript' 카테고리의 다른 글

[typescript] typescript gitbook 튜토리얼 추천  (0) 2021.04.16
반응형

@Id는 해당 프로퍼티가 테이블의 주키(primary key) 역할을 한다는 것을 나타낸다.


@GeneratedValue는 주키의 값을 위한 자동 생성 전략을 명시하는데 사용한다.


Primary 키 생성 전략으로 JPA가 지원하는 것은 아래의 네 가지이다.


1. AUTO : (persistence provider가) 특정 DB에 맞게 자동 선택

  데이터베이스 벤더에 의존하지 않고, 데이터베이스는 기본키를 할당하는 벙법
- 데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE 방법 중 하나를 자동으로 선택해주는 방법이다.
- 예를들어, Oracle일 경우 SEQUENCE를 자동으로 선택해서 사용합니다. 따라서, 데이터베이스를 변경해도 코드를 수정할 필요가 없다.


2. IDENTITY : DB의 identity 컬럼을 이용

  기본 키 생성을 데이터베이스에 위임하는 방법 (데이터베이스에 의존적)
  - 주로 MySQL, PostgresSQL, SQL Server, DB2에서 사용합니다.


3. SEQUENCE : DB의 시퀀스 컬럼을 이용

  데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 (데이터베이스에 의존적)
  - 주로 시퀀스를 지원하는 Oracle, PostgresSQL, DB2, H2에서 사용한다. 
  - @SequenceGenerator를 사용하여 시퀀스 생성기를 등록하고, 실제 데이터베이스의 생성될 시퀀스이름을 지정해줘야 한다.


4. TABLE : 유일성이 보장된 데이터베이스 테이블을 이용

  키 생성 테이블을 사용하는 방법
- 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만드는 방법이다.
- 테이블을 사용하므로, 데이터베이스 벤더에 상관없이 모든 데이터베이스에 적용이 가능하다.

postgres를 이용하여 테스트해보면 AUTO와 SEQUENCE는 실제 INSERT 쿼리가 일어나기 전에 다음 쿼리를 통해서 주키를 가져오는 것을 확인할 수 있다.

select nextval ('hibernate_sequence')


기본키 자동생성 사용방법

  • @Id 어노테이션을 사용한다.
  • @GeneratedValue를 사용한다.
  • @GeneratedValue에 원하는 키 생성 전략을 선택한다. (IDENTITY, SEQUENCE, TABLE, AUTO)

Sample 코드

@Entity
public class Team {
  @Id
  @Column(name = "team_id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
}


@Entity
@SequeceGenerator(name = "TEAM_SEQ_GENERATOR", sequenceName = "TEAM_SEQ", initialValue = 1, allocationSize = 1)
// name=식별자 생성기 이름, sequenceName=DB에 등록될 시퀀스이름, initialValue=최초시작하는 수, allocationSize=증가하는수)
public class Team {

  @Id
  @Column(name = "team_id")
  @GeneratedValue(strategy = GenerationType. SEQUENCE, generator = "TEAM_SEQ_GENERATOR")
  private Long id;

}

@Entity
@TableGenerator(name="TEAM_SEQ_GENERATOR", table="TEAM_SEQUENCES", pkColumnValue="TEAM_SEQ", allocationSize=1)
// name=식별자 생성기 이름, table=키생성 테이블 이름, pkColumnValue=DB에 등록될 시퀀스이름)
public class Team {
  @Id
  @Column(name = "team_id")
  @GeneratedValue(strategy = GenerationType. TABLE, generator = "TEAM_SEQ_GENERATOR")
  private Long id;

}

@Entity
public class Team {
  @Id
  @Column(name = "team_id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

}


참고문헌

ithub.tistory.com/24

 

반응형
반응형

jpa 를 사용하려면 @Entity 클래스를 먼저 생성해야 한다.

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name="coin.market_code")
public class MarketCode {

    @Id
    @Column(name = "market_code")
    private String marketCode;
    @Column(name = "korean_name")
    private String koreanName;
    @Column(name = "english_name")
    private String englishName;

    @Builder
    public MarketCode(String marketCode, String koreanName, String englishName) {
        this.marketCode = marketCode;
        this.koreanName = koreanName;
        this.englishName = englishName;
    }
}

 

먼저 데이터베이스에 저장하기 위해 유저가 정의한 클래스가 필요한데 그런 클래스를

Entity라고 한다

@Id

primary key를 가지는 변수를 선언하는 것을 뜻한다. @GeneratedValue 어노테이션은 해당 Id 값을

어떻게 자동으로 생성할지 전략을 선택할 수 있다. 

보통 일반적으로

@GeneratedValue(strategy = GenerationType.AUTO)

를 사용한다. DB에 맞게 자동으로 생성해주는 역할이다.

참고 -> juntcom.tistory.com/156 - GeneratedValue생성방법

@Table

별도의 이름을 가진 데이터베이스 테이블과 매핑한다. 기본적으로 @Entity로 선언된 클래스의 이름은 실제

데이터베이스의 테이블 명과 일치하는 것을 매핑한다. 따라서 @Entity의 클래스명과 데이터베이스의 테이블명이

다를 경우에 @Table(name=" ")과 같은 형식을 사용해서 매핑이 가능하다.

@Column

@Column 선언이 꼭 필요한 것은 아니다. 하지만 @Column에서 지정한 변수명과 데이터베이스의 컬럼명을

서로 다르게 주고 싶다면 @Column(name=" ") 같은 형식으로 작성하면 된다.

그렇지 않은 경우에는 기본적으로 멤버 변수명과 일치하는 데이터베이스 컬럼을 매핑한다.

컬럼에 언더바가 있을 경우에는 꼭 column 어노테이션을 사용해야 한다.

 

 

JpaRepository

public interface MarketCodeRepository extends JpaRepository<MarketCode, String> {

}

Spring Data JPA에서 제공하는 JpaRepository 인터페이스를 상속하기만 해도 되며,

인터페이스에 따로 @Repository등의 어노테이션을 추가할 필요가 없다



Spring Data JPA에서 제공하는 JpaRepository 인터페이스를 상속하기만 해도 되며,

인터페이스에 따로 @Repository등의 어노테이션을 추가할 필요가 없다

 

 

그렇게 JpaRepository를  단순하게 상속하는 것만으로 위의 인터페이스는 Entity 하나에 대해서

아래와 같은 기능을 제공하게 된다.

 method

 기능

 save()

 레코드 저장 (insert, update)

 findOne()

 primary key로 레코드 한건 찾기
 findAll()

 전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능

 count()  레코드 갯수
 delete()  레코드 삭제

 

public interface MarketCodeRepository extends JpaRepository<MarketCode, String> {
	List<MarketCode> findBykoreanName(String koreanName);
}

주의사항 변수명을 korean_name 처럼 언더바로 사용할시에 findBy가 적용이 안된다.

변수명을 카멜케이스로 맞추자.

 

Query 메소드에 포함할 수 있는 키워드는 다음과 같다.

메서드 이름 키워드

 샘플

 설명

 And

 findByEmailAndUserId(String email, String userId)

 여러필드를 and 로 검색

 Or

 findByEmailOrUserId(String email, String userId)

 여러필드를 or 로 검색

 Between

 findByCreatedAtBetween(Date fromDate, Date toDate)

 필드의 두 값 사이에 있는 항목 검색

 LessThan

 findByAgeGraterThanEqual(int age)

 작은 항목 검색

 GreaterThanEqual

 findByAgeGraterThanEqual(int age)

 크거나 같은 항목 검색

 Like

 findByNameLike(String name)

 like 검색

 IsNull

 findByJobIsNull()

 null 인 항목 검색

 In

 findByJob(String … jobs)

 여러 값중에 하나인 항목 검색

 OrderBy

 findByEmailOrderByNameAsc(String email)

 검색 결과를 정렬하여 전달

 


참고문헌

docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies  - jpa문서
반응형
반응형

세팅 옵션

- autoCommit:

auto-commit설정 (default: true)

- connectionTimeout:

pool에서 커넥션을 얻어오기전까지 기다리는 최대 시간, 허용가능한 wait time을 초과하면 SQLException을 던짐. 설정가능한 가장 작은 시간은 250ms (default: 30000 (30s))

- idleTimeout:

pool에 일을 안하는 커넥션을 유지하는 시간. 이 옵션은 minimumIdle이 maximumPoolSize보다 작게 설정되어 있을 때만 설정. pool에서 유지하는 최소 커넥션 수는 - - - - minimumIdle (A connection will never be retired as idle before this timeout.). 최솟값은 10000ms (default: 600000 (10minutes))

 

- maxLifetime:

커넥션 풀에서 살아있을 수 있는 커넥션의 최대 수명시간. 사용중인 커넥션은 maxLifetime에 상관없이 제거되지않음. 사용중이지 않을 때만 제거됨. 풀 전체가아닌 커넥션 별로 적용이되는데 그 이유는 풀에서 대량으로 커넥션들이 제거되는 것을 방지하기 위함임. 강력하게 설정해야하는 설정 값으로 데이터베이스나 인프라의 적용된 connection time limit보다 작아야함. 0으로 설정하면 infinite lifetime이 적용됨(idleTimeout설정 값에 따라 적용 idleTimeout값이 설정되어 있을 경우 0으로 설정해도 무한 lifetime 적용 안됨). (default: 1800000 (30minutes))

 

- connectionTestQuery:

JDBC4 드라이버를 지원한다면 이 옵션은 설정하지 않는 것을 추천. 이 옵션은 JDBC4를 지원안하는 드라이버를 위한 옵션임(Connection.isValid() API.) 커넥션 pool에서 커넥션을 획득하기전에 살아있는 커넥션인지 확인하기 위해 valid 쿼리를 던지는데 사용되는 쿼리 (보통 SELECT 1 로 설정) JDBC4드라이버를 지원하지않는 환경에서 이 값을 설정하지 않는다면 error레벨 로그를 뱉어냄.(default: none)

- minimumIdle:

아무런 일을 하지않아도 적어도 이 옵션에 설정 값 size로 커넥션들을 유지해주는 설정. 최적의 성능과 응답성을 요구한다면 이 값은 설정하지 않는게 좋음. default값을 보면 이해할 수있음. (default: same as maximumPoolSize)

- maximumPoolSize:

pool에 유지시킬 수 있는 최대 커넥션 수. pool의 커넥션 수가 옵션 값에 도달하게 되면 idle인 상태는 존재하지 않음.(default: 10)

- poolName:

이 옵션은 사용자가 pool의 이름을 지정함. 로깅이나 JMX management console에 표시되는 이름.(default: auto-generated)

 

- initializationFailTimeout:

이 옵션은 pool에서 커넥션을 초기화할 때 성공적으로 수행할 수 없을 경우 빠르게 실패하도록 해준다. 상세 내용은 한국말보다 원문이 더 직관적이라 생각되어 다음 글을 인용함.

 

- readOnly:

pool에서 커넥션을 획득할 때 read-only 모드로 가져옴. 몇몇의 database는 read-only모드를 지원하지 않음. 커넥션이 read-only로 설정되어있으면 몇몇의 쿼리들이 최적화 됨.(default: false)

 

- driverClassName:

HikariCP는 jdbcUrl을 참조하여 자동으로 driver를 설정하려고 시도함. 하지만 몇몇의 오래된 driver들은 driverClassName을 명시화 해야함. 어떤 에러 메시지가 명백하게 표시 되지않는다면 생략해도됨.

 

- validationTimeout:

valid 쿼리를 통해 커넥션이 유효한지 검사할 때 사용되는 timeout. 250ms가 설정될 수 있는 최솟값(default: 5000ms)

 

- leakDetectionThreshold:

커넥션이 누수 로그메시지가 나오기 전에 커넥션을 검사하여 pool에서 커넥션을 내보낼 수 있는 시간. 0으로 설정하면 leak detection을 이용하지않음. 최솟값 2000ms (default: 0)

 

MySQL Performance Tips

- prepStmtCacheSize:

커넥션당 캐시할 prepared statementsts 숫자. 250 ~ 500 개 추천

 

- prepStmtCacheSqlLimit:

드라이버가 캐시할 sql문의 최대길이. 기본값은 256. Hibernate 와 같은 ORM 프레임워크의 기본값은 낮다. 권장 설정은 2048 이다.

 

- cachePrepStmts:

캐시가 기본적으로 비활성화 되어있는 경우 위의 매개 변수 는 효과가 없어진다. 이 매개변수를 true 로 해야 설정이 된다.

 

- useServerPrepStmts: 최신버젼의 MySql 은 서버 측 명령문을 지원하므로 상당한 성능 향상을 제공할 수 잇다. 이 속성을 true 로 해야 한다.

 

참고문헌

> https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby

반응형
반응형

docker compose 란

 

도커 컴포즈는 컨테이너 여럿을 띄우는 도커 애플리케이션을 정의하고 실행하는 도구(Tool for defining and running multi-container Docker applications) 이다.

컨테이너 실행에 필요한 옵션을 docker-compose.yml이라는 파일에 적어둘 수 있고, 컨테이너 간 의존성도 관리할 수 있어서 좋다.

 

도커와 도커 컴포즈를 비교하면 다음과 같다.

  • Dockerfile vs. Dockerfile-dev: 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
  • docker build vs. docker-compose build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
  • docker run의 옵션들 vs. docker-compose.yml: 이미지에 붙이는 장식들(=인스턴스의 변수들)
  • docker run vs. docker-compose up: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)

간단히 말해 docker run 으로 실행하면 매번 복잡한 옵션 및 명령어들을 여러개 적어두고 실행해야 하는데, 

docker-compose 는 docker-compose.yml 에 사용하고자 하는 도커이미지 및 옵션 값들을 작성해 놓고 docker-compse up 이라는 명령어로 일관적으로 실행할 수 있다.

하나씩 실행해야 하는 수고로움이 덜어진다.

 

설치

docker-compose version 을 치고 조회가 되면 설치할 필요가 없다.

 

없다면 설치하면 된다.

docker-compose 설치는 매우매우 쉽다. 아래를 따라하면 된다.

출처는 https://docs.docker.com/compose/install/

윈도우는

curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

 

docker-compose 속성

version

version: '2.1'

docker run에서는 없었던 부분입니다. docker-compose.yml 파일의 제일 윗부분에는 파일 규격 버전을 적는다. 파일의 규격에 따라 지원하는 옵션이 달라지며, 최근에 "3.1"이 등장하긴 했지만 보통은 "2"나 "2.1"을 사용해도 충분.

services

services:

이 항목 밑에 실행하려는 서비스들을 정의한다. 서비스란, 앱 컨테이너나 postgres 컨테이너 각각의 묶음이다.

services 하위

서비스의 이름

image

image: postgres:9.6.1

db 서비스에서 사용할 도커 이미지를 적는다.

volumes

volumes: - ./docker/data:/var/lib/postgresql/data

docker run으로 앱 컨테이너를 실행할 때 --volume 옵션을 사용하여 데이터베이스의 데이터를 로컬 컴퓨터에 저장했던 부분과 같다.

다만 docker-compose.yml의 volumes에는 상대 경로를 지정할 수 있다는 점이 다르다.

environment

environment: - POSTGRES_DB=sampledb - POSTGRES_USER=sampleuser - POSTGRES_PASSWORD=samplesecret - POSTGRES_INITDB_ARGS=--encoding=UTF-8

docker run에서 -e 옵션에 적는 내용이다. 마지막의 POSTGRES_INITDB_ARGS 부분이 추가되었는데, 데이터베이스 서버의 인코딩을 설정하기 위함이다.

healthcheck

healthcheck: test: "pg_isready -h localhost -p 5432 -q -U postgres" interval: 3s timeout: 1s retries: 10

postgres 서비스가 제대로 실행될 뿐만 아니라 데이터베이스에 접근할 수 있는지도 파악을 해야 합니다.

healthcheck는 바로 이것을 제어할 수 있습니다. 검사에 사용할 명령(test)을 3초 간격(interval)으로 열 번 시도(retries)하며, 각 시도에서 타임아웃은 1초(timeout)로 지정하였다.

여기서 사용한 pg_isready 명령은 데이터베이스 서버에 접근할 수 있는지를 파악. 

 

service 하위

앱 서비스의 이름으로 지정자 마음대로 지으면 된다.

 

build

build: context: . dockerfile: ./compose/django/Dockerfile-dev

db 서비스와 달리 앱 서비스는 도커 이미지를 빌드할 일이 잦기 때문에, 특정 이미지 대신 build 옵션을 추가한다.

context는 docker build 명령을 실행할 디렉터리 경로라고 보면 된다.

dockerfile은 도커 이미지를 빌드하는 데 사용할 Dockerfile을 지정하면 된다. 

environment

environment: - DJANGO_DEBUG=True - DJANGO_DB_HOST=db - DJANGO_DB_PORT=5432 - DJANGO_DB_NAME=sampledb - DJANGO_DB_USERNAME=sampleuser - DJANGO_DB_PASSWORD=samplesecret

환경 변수는 그냥 docker run을 할 때보다 좀더 자세하게 적었습니다. 각 값은 Django 설정 파일(djangosample/settings.py)에서 사용합니다.

ports

ports: - "8000:8000"

도커 컴포즈로 서비스를 실행하면 기본적으로 가상의 네트워크가 하나 만들어지고, 네트워크 외부의 접근이 막힙니다. (도커 컨테이너가 그렇듯이요.) 따라서 외부에서 접근할 수 있는 포트를 지정해주어야 한다. 여기서는 Django 개발 서버의 기본 포트는 8000을 지정하였습니다.

depends_on

depends_on: db: condition: service_healthy

서비스가 하나 이상일 때, 실행 의존성을 지정할 수 있다. 여기서 지정한 내용은, db 서비스가 실행된 후에 django 서비스를 실행하겠다는 의미. contidion 뒤에는 서비스 시작(service_started)이나 서비스 헬스체크 성공(service_healthy)을 지정할 수 있다.

db 서비스의 healthcheck 부분과 여기서의 service_healthy 부분이 서로 맞물리면, db 서비스에서 데이터베이스 서버 접속이 가능해진 순간 이후에야, django 서비스가 시작한다.

depend_on에서 condition을 지정하는 방식이 도커 컴포즈 파일 규격 3.0과 3.1에서는 제대로 작동하지 않는다고 합니다.

links

links: - db

docker run에서 --link 옵션에서 지정했던 내용입니다. 앱 컨테이너 안에서 db 서비스를 db라는 이름으로 참조할 수 있다.

command

command: /start-dev.sh

docker run으로 앱 컨테이너를 실행할 때 가장 마지막에 적었던 ./manage.py runserver 0:8000을 대신할 셀 스크립트 파일을 하나 만들었습니다. 다음은 start-dev.sh의 내용이다.

#!/bin/sh python manage.py migrate python manage.py runserver 0:8000

volumes

volumes: - ./:/app/

docker run으로 앱 컨테이너를 실행할 때 프로젝트 루트 디렉터리를 컨테이너 안에 연결했던 부분과 같습니다.

 

예시

version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:5.7 # 사용할 이미지\
    # restart: always
    container_name: jun-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: '비번'  # MYSQL 패스워드 설정 옵션
      MYSQL_USER: '계정'
      MYSQL_PASSWORD: '비번'
    volumes:
      - /Users/유저명/폴더명:/var/lib/mysql  
    # command: # 명령어 실행
      # - mysqld --default-authentication-plugin=mysql_native_password
      # - --character-set-server=utf8mb4
      # - --collation-server=utf8mb4_unicode_ci
  mongo:
    image: mongo
    # restart: always
    ports:
      - 9017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: 유저계정
      MONGO_INITDB_ROOT_PASSWORD: 비번  

예시2

version: '2.1'

# 변경 부분!
volumes:
  django_sample_db_dev: {}

services:
  db:
    image: postgres:9.6.1
    volumes:
      # 여기도 변경 부분!
      - django_sample_db_dev:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=sampledb
      - POSTGRES_USER=sampleuser
      - POSTGRES_PASSWORD=samplesecret
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8
    healthcheck:
      test: "pg_isready -h localhost -p 5432 -U postgres"
      interval: 3s
      timeout: 1s
      retries: 10

  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    environment:
      - DJANGO_DEBUG=True
      - DJANGO_DB_HOST=db
      - DJANGO_DB_PORT=5432
      - DJANGO_DB_NAME=sampledb
      - DJANGO_DB_USERNAME=sampleuser
      - DJANGO_DB_PASSWORD=samplesecret
      - DJANGO_SECRET_KEY=dev_secret_key
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    links:
      - db
    command: /start-dev.sh
    volumes:
      # 마지막으로 여기도!
      - ./manage.py:/app/manage.py
      - ./requirements.txt:/app/requirements.txt
      - ./requirements-dev.txt:/app/requirements-dev.txt
      - ./djangosample:/app/djangosample

docker-compose 실행하기

https://docs.docker.com/compose/wordpress/

에 워드프레스 docker-compose.yml 파일이랑 실행방법 있음

 

yml 파일 설치된 dir 에서 실행

docker-compose up -d ##시작
docker-compose down -d ##내리기

 

 

참고문헌

> http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/ --도커 docs

> docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose - ms에서 만든 문서 - build 도 나옴

반응형
반응형

개발 환경 : mac

 

Flutter 를 시작하려면 문서부터 보고 차근차근 하면 된다.

flutter-ko.dev/docs/get-started/install/macos

 

일단 flutter sdk 다운부터 하자

flutter 다운

$ cd ~/development
$ unzip ~/Downloads/flutter_macos_2.0.3-stable.zip

다운받고 압축풀고, path 에 추가하자

 $ export PATH="$PATH:`pwd`/flutter/bin"

 위 명령어는 압축을 푼 경로에서 실행해야 한다.

또 위 명령어로 실행 하면 영구적이지 않고 터미널 열때마다 해당 작업을 해야 한다.

해서 위 명령어를 전역 path 로 저장하자.

 

영구적인 flutter 경로 등록

$ vi ~/.bash_profile

bash_profile 들어가서 

export PATH="$PATH:경로/flutter/bin"

export PATH="$PATH:[flutter sdk 압축 푼 경로]flutter/bin" 

다음과 같이 입력 후 파일 나와서

$ source ~/.bash_profile

로 적용해주고 

$ echo $PATH

또는

$ which flutter

로 확인해보자

 

여기까지만 하고 flutter 명령어로 어플리케이션 개발을 할 수 있다.

 

하지만 안드롱이드 스튜디오로 개발하는것이 용이하기 때문에 안드로이드 스튜디오를 다운받자

 

안드로이드 스튜디오로 flutter 를 개발하려면 flutter plugin 부터 다운받아야 한다.

 

 

configure 에서 plugins 메뉴에서 

flutter 플러그인을 설치후 ide를 재실행하자.

Application 선택 후

 

sdk 경로를 앞서 받았던 flutter 경로의 skd 경로로 설정해주면 된다.

 

여기까지 오면 모든 완료가 되었고, 원하는 기기 버젼 연결 후 실행 하면 끝이다.

 

참고

flutter-ko.dev/docs/get-started/install/macos [flutter 튜토리얼]

 

반응형

+ Recent posts