Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

springboot 2.x 이상 springbatch table문제 해결 방법!

OpenSource/Spring Batch 2020. 8. 13. 15:42
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

id 'org.springframework.boot' version '2.3.2.RELEASE'를 사용 중!

그리고 springbatch개발을 하고 있다!

 

그런데? 스프링배치를 수행하면서 아래의 오류 발생~~!

bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE 
where JOB_NAME = ? and JOB_KEY = ?]; 
nested exception is java.sql.SQLSyntaxErrorException: 
Table 'BATCH_JOB_INSTANCE' doesn't exist

스프링배치는 수행관련 내용들을 메타데이터로 남겨서 테이블에 저장하는데

해당 테이블 스키마를 생성하지 않아서 문제가 되었다.

https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch-database

위와 같은 내용이 있었다. 스프링부트 2.x 이상일 경우 위와같은 내용을 

application.yaml 또는 application.properties에 작성하면 된다.

저자의 경우 application.yaml에 아래와 같이 작성하였고

spring.batch.initialize-schema: always

그리고나서 스프링배치를 돌리면??

아래와 같이 테이블이 자동적으로 생성되는것을 알 수 있다. 

스프링배치 테이블들

 

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

springbatch setting시 오류: Spring Boot plugin requires Gradle 5 (5.6.x only) or Gradle 6 (6.3 or later). The current version is Gradle 4.10.3

OpenSource/Spring Batch 2020. 8. 6. 17:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#appendix-dependency-versions

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

스프링 사용 시 버전에 맞게 사용하자~

디펜던시!!

빌드 툴도 역시나! 버전에 맞게~

Tomcat, jetty 등등도~버전을 체크!

자바 버전도! SpringBoot 2.3.2 Release는 요구된다칸다! 8이상이~

스프링프레임워크는 5.2.8 또는 그 상위가 요구!

 

 

그래들은 https://gradle.org/releases/에서 다운 받자!

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2020.07.16 스터디

OpenSource/K8s 2020. 7. 16. 16:33
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

6장 볼륨 : 컨테이너에 디스크 스토리지 연결

볼륨은

  1. pod와 라이프사이클이 같다. 즉, pod가 생성 될 때 볼륨이 생성, 삭제될 때 볼륨이 삭제.
  2. pod 스펙에 정의 된다.
  3. pod의 모든 컨테이너에서 볼륨을 사용할 수 있다.(단, 볼륨에 액세스해야하는 각 컨테이너에 볼륨을 마운트 해야 한다.)
  4. 여러가지 종류가 존재
    1. emptyDir: 일시적인 데이터를 저장하는 비어있는 단순 디렉토리.
    2. hostPath : 워커 노드(물리장비)의 파일 시스템에서 pod로 디렉토리를 마운트 하는데 사용.
    3. gitRepo : git스토리지의 내용을 체크아웃해 초기화된 볼륨.
    4. nfs : pod에 마운트 된 NFS 공유.(Network File System)
    5. gcePersistentDisk(구글 컴퓨트 엔진 영구 디스크)
    6. cinder etc.
  • emptyDir 실습

실습01

1. fortune.sh 만들기

#!/bin/bash
trap "exit" SIGINT
mkdir /var/htdocs
while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep 10
done

※ shell script의 권한 체크 필요!

 

2. Dockerfile 만들기

FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortune.sh /bin/fortune.sh
ENTRYPOINT /bin/fortune.sh

3. yml 만들기

apiVersion: v1
kind : Pod
metadata :
  name: fortune
spec:
  containers:
  - image: 화사 도커 허브 주소라서 삭제/teri_epi/fortune
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

4. Docker Image 만들기!

docker build -t 회사도커허브주소/teri_epi/fortune .

5. Docker push!

docker push 회사도커허브주소/teri_epi/fortune

잘되었는지 dockerHub에서 확인.

회사 도커허브

6. k8s pod 수행!

kubectl create -f fortune-pod.yml

k는 kubectl alias해놓음.

7. port 포워드

kubectl port-forward fortune 8080:80

8. 확인

10초 마다 html생성 -> 새로고침 해보면 된다.

메모리를 사용하도록 할 수도 있다.

emptyDir:

  medium: Memory

더 많이 했는데 귀찮아서 정리는 요기까지 ㅋㅋ

 

- 끝 -

'OpenSource > K8s' 카테고리의 다른 글

2020.07.16 스터디  (0) 2020.07.16
repository does not exist or may require 'docker login' k8s  (0) 2020.02.20
docker hub login시 error 발생!  (0) 2020.01.29

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

초 간단 Apache Storm 맛보기(코딩)

OpenSource/Apache Storm 2020. 5. 25. 19:17
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

이번 포스팅에서는 maven, springframework, java를 사용한다.

이전 시간에 apache storm 클러스터를 셋팅 해보았다.

그에 맞는 storm버전을 maven pom.xml에 작성해보자.
maven관련 내용은 메이븐레파지토리에서 알수 있다.

https://mvnrepository.com/artifact/org.apache.storm/storm-core/1.0.1

 

그리고 로깅과 스프링프레임워크 관련도 셋팅 해보자.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

 

    <groupId>storm</groupId>

    <artifactId>game</artifactId>

    <version>1.0-SNAPSHOT</version>

 

    <properties>

        <!-- spring -->

        <spring.version>3.2.13.RELEASE</spring.version>

        <!-- storm -->

        <storm.version>1.0.1</storm.version>

        <httpclient.version>4.5.2</httpclient.version>

 

        <!-- logging -->

        <slf4j.version>1.7.10</slf4j.version>

        <logback.version>1.1.2</logback.version>

    </properties>


    <dependencies>

        <!-- spring -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-beans</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-web</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-jdbc</artifactId>

            <version>${spring.version}</version>

        </dependency>

 

        <!-- storm -->

        <dependency>

            <groupId>org.apache.storm</groupId>

            <artifactId>storm-core</artifactId>

            <version>${storm.version}</version>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>org.apache.storm</groupId>

            <artifactId>flux-core</artifactId>

            <version>${storm.version}</version>

        </dependency>

 

        <!-- Logging -->

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-api</artifactId>

            <version>${slf4j.version}</version>

        </dependency>

        <dependency>

            <groupId>ch.qos.logback</groupId>

            <artifactId>logback-core</artifactId>

            <version>${logback.version}</version>

        </dependency>

        <dependency>

            <groupId>ch.qos.logback</groupId>

            <artifactId>logback-classic</artifactId>

            <version>${logback.version}</version>

        </dependency>

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>jcl-over-slf4j</artifactId>

            <version>${slf4j.version}</version>

        </dependency>

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>log4j-over-slf4j</artifactId>

            <version>${slf4j.version}</version>

        </dependency>

 

    </dependencies>

</project>

코드는 2가지를 해보려고 한다.

코드실행은 로컬이 아닌 서버에서 동작한다.

 

코드를 보기전에 용어부터 알아보자.

  • Topology : Spout와 Bolt 들간의 흐름을 제어하는 부분! main 함수도 있다~

 

 

 

HelloWorld Sample : https://bcho.tistory.com/991?category=563141

WordCount Sample : https://gyrfalcon.tistory.com/entry/Apache-Storm-2?category=674613

'OpenSource > Apache Storm' 카테고리의 다른 글

초 간단 Apache Storm 맛보기(코딩)  (0) 2020.05.25
초 간단 Apache Storm 맛보기(셋팅)  (0) 2020.05.19

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

초 간단 Apache Storm 맛보기(셋팅)

OpenSource/Apache Storm 2020. 5. 19. 15:42
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

Apache Storm을 셋팅하기 위해서 필요한 것은?

1. Open Jdk

2. Zookeeper

3. Apache Storm

4. Python

셋팅결과!

Jdk와 Python은 서버에 맞게 잘 찾아서 셋팅 해준다. :)

이 포스팅에서는 pass~

 

이제! 이 포스팅에서 다룰 주키퍼와 아파치 스톰! 셋팅을 시작해보자~

 

Zookeeper Setting

  1. download : wget http://mirror.apache-kr.org/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
  2. 압축해제 : tar xvfz  apache-zookeeper-3.5.8-bin.tar.gz
  3. 심볼릭 링크 센스 : ln -s  apache-zookeeper-3.5.8-bin zookeeper
  4. ~/zookeeper/conf 설정
    1. zoo_sample.cfg를 zoo.cfg로 복사 -> cp zoo_sample.cfg zoo.cfg
    2. zoo.cfg 열어서 수정! -> vi zoo.cfg
    3. 아래처럼 dataDir, server.1~3 등을 채워넣으면 된다.

단, bif-dev-1등의 호스트명을 사용하려면 각 서버별로 아래와 같이 설정 해야 한다.

sudo vi /etc/hosts 오픈 후 아래와 같이 설정!

해당 아이피      호스트명

10.111.xx.aaa  bif-dev-1

10.111.xx.bbb  bif-dev-2

10.111.xx.ccc   bif-dev-3

 

위와 같이 설정하지 않으려면 ip로 설정하면 되겠쥬?

그리고! 위에서 설정한 dataDir 아래에 아래와 같이 서버별로 myid라는것을 만들자!

echo 1 > ../logs/zookeeper/myid

해당 설정이 없으면 아래와 같은 오류를 맛보게 될 것이다!

$ ./zkServer.sh start

/home/deploy/util/jdk8u252-b09/bin/java

ZooKeeper JMX enabled by default

Using config: /home/deploy/util/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper ... FAILED TO START

 

설정 후에 다시 주키퍼를 스타트 시키면!

  • bif-dev-1 서버 :  echo 1 > ../logs/zookeeper/myid
  • bif-dev-2 서버 : echo 2 > ../logs/zookeeper/myid
  • bif-dev-3서버 :  echo 3 > ../logs/zookeeper/myid

$ ./zkServer.sh start

/home/deploy/util/jdk8u252-b09/bin/java

ZooKeeper JMX enabled by default

Using config: /home/deploy/util/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

 

ZooKeeper 띄우기 성공!


Apache Storm Setting

  • download : http://storm.apache.org/downloads.html
    • 다운로드 페이지에서 원하는 버전을 가져다가 사용하면 된다.
    • 하지만 이번 포스팅은 현재 업무버전에 맞게 동일한 버전으로 하려고 한다.
      • 버전은 바로 1.0.1 ~!! 두둥탁~ 
      • wget https://archive.apache.org/dist/storm/apache-storm-1.0.1/apache-storm-1.0.1.tar.gz 
  • 압축해제 : tar xvfz apache-storm-1.0.1.tar.gz 로 압축을 해제한 뒤 
  • 센스있게 심볼릭 링크를 걸어준다.
    • ln -s apache-storm-1.0.1.tar.gz storm

아래와 같이 된다.

 

storm.zookeeper.servers:

     - "bif-game-dev-1"

     - "bif-game-dev-2"

     - "bif-game-dev-3"

storm.local.dir: "/home/deploy/logs/storm/data"

nimbus.seeds: ["bif-game-dev-1"]

ui.host: 0.0.0.0

ui.port: 8081

 

설정 후!

동작을 시켜보자~

  1. nimbus
    1. 한 서버에만 올려보자.
      1. bin]$ ./storm nimbus
  2. supervisor
    1. 서버 3대 각각 돌려보자!
      1. bin]$ ./storm supervisor
  3. ui 
    1. 서버 한대에서 돌려보자.
      1. bin]$ ./storm ui 

ip or host:포트 를 통해 접근할 수 있다.

ex) aa.bb.xx.21:8081

 

그리고 위에서 nimbus, supervisor는 뭘까?

nimbus : 마스터 노드에서 실행하는 데몬!

supervisor : 워커 노드에서 실행하는 데몬!

ui : 스톰 ui를 기동! 

 

이제 간단한 코딩을 해보자~

다음편에 계속!..

 

좋은 사이트 :

http://www.corejavaguru.com/bigdata/zookeeper/getting-started-with-zookeeper

https://jdm.kr/blog/218

'OpenSource > Apache Storm' 카테고리의 다른 글

초 간단 Apache Storm 맛보기(코딩)  (0) 2020.05.25
초 간단 Apache Storm 맛보기(셋팅)  (0) 2020.05.19

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

repository does not exist or may require 'docker login' k8s

OpenSource/K8s 2020. 2. 20. 10:12
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

상황은 이러하다.

1. Dockerfile로 이미지를 만들었다.
Dockerfile  +  docker build 명령어 -> 이미지 뿅~
docker build -t xxxx:v0.1 .

2. docker images로 만들어진 이미지를 확인.
3. docker tag로 tag변경 가능.
4. docker push로 docker hub에 push!!
docker push xxxx:v0.1

k8sdev.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
    name: tomcat-deployment
    labels:
        app: tomcat
spec:
    replicas: 1
    selector:
        matchLabels:
            app: tomcat
    template:
        metadata:
            labels:
                app: tomcat
        spec:
           containers:
           - name: tomcat
             image: address.io/teri_epi/hahahoho:v0.1
             ports:
             - containerPort: 8080

kubectl로 kubernets에 적용.
kubectl apply -f k8sdev.yaml

오류 발생|
repository does not exist or may require 'docker login' k8s

원인
docker hub의 레파지토리가 비공개(private)여서 나타나는 현상이었다.

공개로 바꾸고 처리 끝~:)

private일 경우에 docker login관련 어떤 처리를 해줘야 하는 거 같다.
이 내요은 여기에서 다루지 않는다. 구글 신에게 물어보자! :)

 

'OpenSource > K8s' 카테고리의 다른 글

2020.07.16 스터디  (0) 2020.07.16
repository does not exist or may require 'docker login' k8s  (0) 2020.02.20
docker hub login시 error 발생!  (0) 2020.01.29

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

docker hub login시 error 발생!

OpenSource/K8s 2020. 1. 29. 14:40
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

docker login시에  error가 발생 하였다.

Error saving credentials: error storing credentials 
- err: exit status 1, out: `error storing credentials 
- err: exit status 1, out: `The user name or passphrase you entered is not correct.

 

~/.docker/config.json

{
  "auths" : {

  },
  "credSstore" : "osxkeychain",
  "credsStore" : "desktop",
  "stackOrchestrator" : "swarm"
}

 

다른 사람들과 config.json의 내용 또한 달랐다.

해결 방법

  • first rm /usr/local/bin/docker-credential-osxkeychain
  • modify ~/.docker/config.json "credsStore": ""
  • restart docker

참고 : https://github.com/docker/for-mac/issues/2295

'OpenSource > K8s' 카테고리의 다른 글

2020.07.16 스터디  (0) 2020.07.16
repository does not exist or may require 'docker login' k8s  (0) 2020.02.20
docker hub login시 error 발생!  (0) 2020.01.29

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

org.apache.catalina.LifecycleException: Failed to start component

OpenSource/Spring Boot 2019. 5. 10. 13:18
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

JDK8을 사용 중이였는데 오류가 나서 톰캣 7에서 8로 변경 해주니 잘되었다.
servlet-api.jar 버전 문제인것 같다.(참고 : https://okky.kr/article/266796)

jar를 교체하지 않고 7에서 그냥 8로 톰캣을 교체했다. ㅋㅋ

끝~

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Boot + Spring Batch 분석_02

OpenSource/Spring Batch 2018. 10. 23. 19:14
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

2018/10/12 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_01

 저번 분석에서는 Job에 대해서 알아보았습니다. 

이제 Step에 대해 알아보도록 하겠습니다.

설명하고 있는 소스는 https://spring.io/guides/gs/batch-processing/ 를 참고!

// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]
  • Step의 메소드명은 step1
  • 파라미터는 JdbcBatchItemWriter<Person> writer 
  • return은 stepBuilder
  • 내용을 파악하기 전에 SpringBatch의 Flow를 파악해보면 좋을것 같다.
    왜? 나는 chunk, reader, processor, writer를 알아야하는가?에 대한 답변이 될꺼라 생각한다.
  • SpringBatch Flow
  • 이제 하나하나씩 알아가보자.
  • chunk를 보자.
    • 우선 chunk(청크)란 배치선 덩어리 데이터들을 단위별로 묶어서 처리되어지는 수!
      즉, 위에 10이라는 뜻은 
      10개를 모아서 Chuck단위(10)로 트랜잭션을 이루고 있다고 보면 된다.
      트랜잭션 수행이기 때문에 실패 시 
      Chunk단위로 롤백이되고, 이전에 커밋된 트랜잭션까지는 반영이 된다는 뜻이다.
    • <Person, Person> chunk(10)에서 <Person, Person>은 제네릭 타입으로
      각 청크의 input과 output type을 나타낸다. 
    • ItemReader<Person>과 ItemWriter<Person>로 생각하면 된다.
  • reader(reader())를 보자.
    • reader? 뜻 그대로 읽어들이는 것이다. 무엇을? 데이터를~(txt, api, db 등등등)
       @Bean
          public FlatFileItemReader<Person> reader() {
              return new FlatFileItemReaderBuilder<Person>()
                  .name("personItemReader")
                  .resource(new ClassPathResource("sample-data.csv"))
                  .delimited()
                  .names(new String[]{"firstName", "lastName"})
                  .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                      setTargetType(Person.class);
                  }})
                  .build();
          }
      
    • 위의 FlatFileItemReader는 SpringBatch에서 제공해주는 녀석이다.
      json, xml 형태가 아닌 말그대로 flat file을 읽어들인다.
      import org.springframework.batch.item.file.FlatFileItemReader;
      import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
    • FlatFileItemReaderBuilder! 이녀석 또한 Builder Pattern. 
      • name : reader instance명 
      • resource : 근원지 즉, read할 flat file.
      • delimited() : 명시적이지 않을 때 사용!
        DelimitedLineTokenizer를 작성하기위한 FlatFileItemReaderBuilder.DelimitedBuilder의 인스턴스를 리턴합니다. 이 빌더에 의해 구성된 DelimitedLineTokenizer는 lineTokenizer를 통해 명시적으로 구성되지 않은 경우에만 사용됩니다.
      • names : sample-data.csv의 내용과 names에서 선언한 포맷에 맞게 들어오게 되며 이 데이터는
      • fieldSetMapper()를 통해 DTO에 매핑 되어진다.
      • 예를 들어 아래의 데이터 중 Jane, Doe라고 한다면  String[]{"firstName", "lastName"}에 담긴다는 것이고 이것은 fieldSetMapper를 통해 객체에 담기게 된다. 

                  


    • processor(processor)
      • PersonItemProcessor는 ItemProcessor의 구현체이다.
        • Person객체를 input으로 하여 가공한 뒤에 output으로 Person을 리턴한다. 
          @Bean
              public PersonItemProcessor processor() {
                  return new PersonItemProcessor();
              }
          package hello;
          
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          
          import org.springframework.batch.item.ItemProcessor;
          
          public class PersonItemProcessor implements ItemProcessor<Person, Person> {
          
              private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
          
              @Override
              public Person process(final Person person) throws Exception {
                  final String firstName = person.getFirstName().toUpperCase();
                  final String lastName = person.getLastName().toUpperCase();
          
                  final Person transformedPerson = new Person(firstName, lastName);
          
                  log.info("Converting (" + person + ") into (" + transformedPerson + ")");
          
                  return transformedPerson;
              }
          
          }
        • 정리하면 processor의 역할은 read한 것을 가공하여 write에 주는 것이다.


  • writer(writer)
    • 이제 마지막으로 writer입니다.
      여기에서는 데이터베이스 관련 writer중 JdbcBatchItemWriter가 사용되어집니다.
@Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    • JdbcBatchItemWriterBuilder가 사용.
      • itemSqlParameterSourceProvider()
        • 작성자가 사용할 ItemSqlParameterSourceProvider를 구성합니다.
          beanMapped ()가 호출되지 않은 경우에만 사용해야합니다.
        • BeanPropertyItemSqlParmeterSourceProvider
          • SQL구문에서 파라미터에 사용되어지는 명명 중 JavaBean(Person)에 속성에 해당되면 
            공하여준다.
      • sql : sql구문
      • dataSource : @EnableBatchProcessing에 의해 생성.



acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Boot + Spring Batch 분석_01

OpenSource/Spring Batch 2018. 10. 12. 15:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


주저리 

   spring boot를 사용하여 
   spring batch를 해보려는데 막상 spring batch를 잘모르면 제대로 못할것 같은 생각이 들었다.
   springframework를 spring boot기반으로 해볼때도 마찬가지였다.


구성

  • Job과 Step으로 구성.
    • Job
      • 여러개의 Step으로 구성.
        • Step은 ItemReader, ItemProcessor, ItemWriter의 구조이거나 
          이런 전형적인 구조가 아닐 경우 Tasklet 구조.

분석

    2018/09/12 - [OpenSource/Spring Batch] - SpringBatch 예제

    에서 처럼 https://spring.io/guides/gs/batch-processing/
   공식 사이트를 살펴보도록 하자.


org.springframework.boot:spring-boot-starter-batch 디펜던시는 요녀석!

Batch Job을 구성할 때 
Spring Batch는 따로 작성할 필요없이 비즈니스 로직에 집중할 수 있도록 많은 유틸리티를 제공한다.


BatchConfiguration! 이부분은 옛날 Spring Batch에서 xml로 구성되던 녀석이다.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


하나하나씩 보도록 하자. 우선 Factory를 DI 하는 것을 볼수 있다.

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

Factory는 Job과 Step에서 사용!
// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]


그리고 Step에서 사용되어지는 reader, processor, writer도 함께 구성.

    // tag::readerwriterprocessor[]
    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new ClassPathResource("sample-data.csv"))
            .delimited()
            .names(new String[]{"firstName", "lastName"})
            .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }})
            .build();
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    // end::readerwriterprocessor[]


구조는 이러하고..이제 조금 더 자세하게 보도록 하자.

More and More


BatchConfiguration.java

  1. @Configuration : 설정 파일임을 알려준다. @MVC에서 @service @controller와 같다고 보면 된다.
  2. @EnableBatchProcessing : Batch 관련 유용한 유틸을 제공가능케 한다. 영어 고대로 Enable하겠다는 뜻.
  3. 위에서 언급한 내용처럼 Factory를 DI 하여 Job과 Step을 구성한다.
    1. Job은 Step으로 구성하여 만들어지고 Step은 reader, processor, writer를 구성할 수 있다.
  • 어노테이션 @Autowired로 DI 해주는 부분.
    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;
  • Job과 Step을 설정 해주는 부분.
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    } 
    • Job은 아래와 같이 importUserJob이라는 함수명을 가지며, 파라미터로는 listener, step
    • return으로는 JobBuilderFactory를 이용하여 Job을 리턴하는 구조이다.
      • jobBuilderFactory.get은 job builder를 생성하고 JobRepository를 초기화 시킨다.

[ Spring Batch 흐름도]

         

      • 아래를 좀 더 심화있게 이해하려면 builder pattern을 이해해야한다. 
      • 하지만 우선적으로 Spring Batch에 대해서 파악하는게 우선이다. 
      • 이제 돌아와서 incremeter를 보자.
        • JobBuilderHelper Class에 속해있는 method이다. 
        • JobBuilderHelper는 JobBuilder의 부모 클래스이다.
        • 포맷은 아래와 같다.
          • public B incrementer(JobParametersIncrementer jobParametersIncrementer)
          • 파라미터로 JobPrametersIncrementer를 가지는데 이것은 Interface 형태이다.
          • 이 Interface를 구현한 녀석이 위에 사용되어진 RunIdIncrementer Class 이다.
        • 그리고 incrementer 이녀석이 하는 역할은 JobParametersIncrementer 인터페이스의 
          역할을 보면 알수 있다. JobParameters를 취득하기 위한 인터페이스이기 때문이다.
        • JobParameters..! 이녀석을 이해하려면 아래의 그림을 이해해야한다.
        • 동시 다발적으로 돌아가는 Job들의 차이는 어떻게 알수가 있나? Job들 간의 구별? 그 해답은 JobParameters에 있다. 그래서 batch job을 시작할 때 이처럼 JobParameters를 취득한다.
          더욱 더 자세한 내용은 해당 링크를 참조. 

           

        • 그 다음으로 listener.
          • JobBuilderHelper Class에 속해 있는 Method이며, format은 아래와 같다.
            public B listener(JobExecutionListener listener)
          • JobExecutionListener도 Interface이며 지금 설명하는 소스에서는 
            JobCompletionNotificationListener Class에서 extends하고 있다.
          • JobCompletionNotificationListener.java
            package hello;
            
            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;
            import org.springframework.batch.core.BatchStatus;
            import org.springframework.batch.core.JobExecution;
            import org.springframework.batch.core.listener.JobExecutionListenerSupport;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.jdbc.core.JdbcTemplate;
            import org.springframework.stereotype.Component;
            
            @Component
            public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
            
            	private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
            
            	private final JdbcTemplate jdbcTemplate;
            
            	@Autowired
            	public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
            		this.jdbcTemplate = jdbcTemplate;
            	}
            
            	@Override
            	public void afterJob(JobExecution jobExecution) {
            		if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
            			log.info("!!! JOB FINISHED! Time to verify the results");
            
            			jdbcTemplate.query("SELECT first_name, last_name FROM people",
            				(rs, row) -> new Person(
            					rs.getString(1),
            					rs.getString(2))
            			).forEach(person -> log.info("Found <" + person + "> in the database."));
            		}
            	}
            }
          • 위의 소스는 job이 BatchStatus.COMPLETED인가에 대해서 listen하고 있다. 그리고나서 JdbcTemplate를 사용한다.
        • 다음으로 flow.
          • JobBuilder Class에 속해 있는 Method이며, format은 아래와 같다.
            public JobFlowBuilder flow(Step step)
            딱 봐도 job과 step의 연결 & 수행. return으로는 a SimpleJobBuilder.
        • 다음으로 end. 즉, builder를 종료.
        • 다음으로 build() : 호출하여 최종적으로 a job builder를 리턴. 

지금까지 Job 관련 내용들을 살펴 보았습니다.

다음 포스팅에서는 비즈니스 로직을 당담하고 있는 Step에 대해서 알아보도록 하겠습니다.

2018/10/23 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_02




acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

SpringBatch 예제

OpenSource/Spring Batch 2018. 9. 12. 17:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

스프링배치 버전이 낮아서 이참에 스프링부트+스프링배치로 변경해보려고 한다.

"라스트 제다이"가 아닌 "라스트 스프링" ㅋㅋ 

설명에 앞서 주저리를 하자면..요즘 스프링 관련 업무가 없어서..너무 뒤쳐진거 같다..ㅜ.ㅜ..마지막 남은 스프링인가? ㅋㅋ 


예제는 아래 사이트를 참고
  - https://spring.io/guides/gs/batch-processing/ 


결과는 아래와 같다.


위 사이트 내용을 요약해서 보면

간단한 배치 서비스를 만들껀데
이 서비스는 csv파일의 데이터를 가져와서 입맛에 맞게 변경 한 뒤 데이터베이스에 저장하는게 목표이다.

정형적인 배치서비스를 축약한 내용의 소스인것 같아서 선택했다.

데이터를 수집해서 변경 후에 데이터베이스에 저장(insert) or 변경(update)하는 style이 되겠다.

위 소스를 위해서 필요한것은


src/main/java/hello/Person.java  : 데이터를 저장&전달하는 DTO.

src/main/java/hello/PersonItemProcessor.java : 데이터 가공 하는 부분.

src/main/java/hello/BatchConfiguration.java : input / prossessor / output ,  job과 step을 설정 

src/main/java/hello/JobCompletionNotificationListener.java : 배치 완료 후 노티 




acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

mac os에서 kafka-console-consumer 사용하기

OpenSource 2017. 9. 13. 14:23
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



kafka install

brew로 인스톨 해준다.
brew install kafka

명령어를 날리려는데 셋팅 된 위치를 모르겠다..ㅋㅋ

위치는 요기!!
/usr/local/Cellar/kafka/0.11.0.0/bin


명령은!

./kafka-console-consumer --zookeeper xxx.xxx.com:1111/acet-kafka --topic ace-taeha


끝~

'OpenSource' 카테고리의 다른 글

mac os에서 kafka-console-consumer 사용하기  (0) 2017.09.13
mesosphere  (0) 2017.04.28

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

kibana 잘 안띄워 진다면? 확인해보면 좋다!

OpenSource/ElasticSearch 2017. 8. 28. 16:55
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


로컬이 아닌 서버에 kibana를 다운 받고 run을 한 뒤!

웹브라우저로 접근을 하려는데..접근이 fail...

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.

# The default is 'localhost', which usually means remote machines will not be able to connect.

# To allow connections from remote users, set this parameter to a non-loopback address.

server.host: "0.0.0.0" 

원인은 server.host가 주석처리가 되어있었는데 default가 localhost라서..접근이 안되었던 것!!!

docker image와는 다른 default~!!

엄청나게 쉽게 될 줄 알았는데 삽질 함..-_-;;

다른분들은 금방 해결 되길 바라며..포스팅~촤촤촤! ㅎㅎ


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

mesosphere

OpenSource 2017. 4. 28. 11:36
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



https://mesosphere.github.io/marathon/



Marathon은 Mesosphere의 Datacenter Operating System (DC / OS) 및 Apache Mesos 용 프로덕션 급 컨테이너 오케스트레이션 플랫폼입니다.


특징

  • 고 가용성. Marathon은 100 % 가동 시간 동안 리더를 선출 한 액티브 / 패시브 클러스터로 실행됩니다.
  • 다중 컨테이너 런타임. Marathon은 Mesos 컨테이너 (cgroup 사용)와 Docker에 대한 first-class 지원을 제공합니다.
  • Stateful apps(상태 보존 형 앱). Marathon은 영구 저장소 볼륨을 응용 프로그램에 바인딩 할 수 있습니다. MySQL 및 Postgres와 같은 데이터베이스를 실행할 수 있으며 Mesos로 스토리지를 구성한다. 
  • 아름답고 강력한 UI.
  • 제약 조건. 예 : 랙, 노드 등 하나당 하나의 애플리케이션 인스턴스
  • 서비스 검색 및 로드 밸런싱. 몇 가지 방법을 사용할 수 있습니다.
  • Health Checks. HTTP 또는 TCP 검사를 사용하여 응용 프로그램의 상태를 평가.
  • Event Subscripton(이벤트 구독). HTTP 엔드 포인트에 통지를 수신하려면 - 예를 들어 외부 로드 밸런서와 통합.
  • 측정 항목. JSON 형식으로 / metrics에서 쿼리하거나 graphite, statsd 및 Datadog와 같은 시스템에 푸시.
  • 손쉬운 통합과 스크립트 작성을위한 완벽한 REST API 제공.
하다가 중단하게 되어 아쉽지만 여기까쥐..ㅜ.ㅜ.



'OpenSource' 카테고리의 다른 글

mac os에서 kafka-console-consumer 사용하기  (0) 2017.09.13
mesosphere  (0) 2017.04.28

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring WebFlux

OpenSource/Spring 2017. 4. 26. 17:40
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

toby님이 회사에 오셨다.
스프링캠프 2017을 등록 못해서 못갔는데 다행히 좋은 강의를 들을수 있어서 좋았다.

강의자료 : 

Spring WebFlux
 람다식 
 추가 : 구 Spring web reactive 
  •  용도
    • 서비스간 호출이 많은 마이크로서비스 아키텍처에 적합.
    • 비동기 - 논블럭킹 개발방식.
    • 성능을 뛰어나게 만들겠다.
  • 기존 @MVC 방식, 새로운 방식
  • 서블릿 스택과 api에서 탈피
  • 블록킹, 논블록킹
    • 동기, 비동기와는 관점이 다름.
    • 내가 직접 제어할 수 없는 대상을 상대하는 방법
    • 대상이 제한적임
      • IO
      • 멀티 쓰레드 동기화 
  • 함수형 스타일의 콜백 방식

스프링 웹
1. 요청 매핑
2. 요청 바인딩
3. 핸들러 실행
4. 핸들러 결과 처리(응답 생성)

WebFlux
  • Router Function - 1. 요청매핑 (.route())
    • 함수형 스타일 (람다식..)
  • Handler Function - 2,3,4

RouterFunction의 등록 -> @Bean으로 만든다.
and(), andRoute(), nest() 등의 유용 메소드들.
flatMap

장점
  • 모든 웹 요청 처리 작업을 명시적인 코드로 작성.
  • 어노테이션에 의존하는 @MVC 스타일보다 명확
  • 정확한 타입 체크 가능.
  • 함수 조합을 통한 편리한 구성, 추상화에 유리
  • 테스트 작성의 편리함.

단점
  • 함수형 스타일의 코드가 익숙치 않음.
  • 기존 방식 가능

섞어서 사용 가능.
@MVC 요청 바인딩 + return Mono/Flux 사용.

WebFlux와 리액티브 기술
블로킹 IO 사용 X

JPA - JDBC 기반 RDB 연결
현재는 노답. - 블로킹 메소드로 점철된 jdbc api
JDK 10에서 Async JDBC가 등장할 수도(빠른 시간내에 적용)
@Async (적절한 쓰레드풀을 사용)
단, MongoDB, Redis, CouchDB등 Async 가능.

Spring5 함수형 스타일..

ReactiveStreams
RxJava를 비롯한 다양한 리액티브 기수에 적용된 표준 인터페이스
자바9에 Flow api로 포함.

뭘 공부해야하나?
java8 + 함수형 프로그래밍에 익숙해질 것.
Completablefuture와 같은 비동기 작업의 조합, 결합에 뛰어난 툴에 사용법을 익힐 것.

ReactorCore 학습 

열심히 공부하자+ㅁ+ㅋㅋ


'OpenSource > Spring' 카테고리의 다른 글

Spring WebFlux  (0) 2017.04.26
ChainedTransactionManager를 이용한 글로벌트랜잭션  (0) 2013.08.22
Bug  (0) 2013.06.21
@Vaild 처리 시 주의 할 사항!!  (0) 2013.06.21
Spring jmsTemplate 사용하기  (0) 2013.03.26
HornetQ, JMS Client using Springframework and Maven  (0) 2013.03.22

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Study - JPA 소개

OpenSource/Jpa 2016. 11. 28. 19:04
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

주저리 > 

보통 Web Project를할 때 MVC 패턴과 더불어 SQL Mapper인 ibatis, mybatis등을 많이 사용하였습니다.

지금 회사에서도 mybatis가 사용된 프로젝트들이 대다수 입니다.

필드 하나가 추가 되면 dto(vo)를 비롯한 sql등을 수정해주어야하는..

 즉, MVC pattern : View - Controller - Service - Repository(Dao) - SQL까지 전체적인 수정을 요합니다.

이런 노가다적이고 복잡한 것을 JPA에서는 객체모델링을 기반으로 풀어나간다고 합니다.

db 모델링 기반이 아닌 object 모델링!! 

정말 가능한지 한번 알아보겠습니다.


JPA는 무엇인가?

풀어서 알아보면! Java Persistence Api~~자바 진영의 ORM 기술 표준이다.

출처 : https://www.tutorialspoint.com/jpa/jpa_introduction.htm


여기서 ORM이란? Object Relational Mapping 말그대로 관계형 데이터베이스와 객체를 매핑 시켜준다는 것이다.

ORM하면 하이버네이트가 떠오를 것이다.

하이버네이트를 기반으로 새로운 자바 ORM기술 표준이 만들어졌는데 이것이 바로 JPA이다!

그림 - JPA 표준 인터페이스와 구현체

출처 : 책 - 자바 ORM 표준 JPA 프로그래밍

위의 UML을 보면 감이 오는가?


JPA는 왜 사용해야하는가?

1. 생산성

2. 유지보수

3. 패러다임의 불일치 해결

4. 성능

5. 데이터 접근 추상화와 벤더 독립성(Dialect) 

라고 한다. 앞으로 정말 그러한지 알아보도록 하자!



'OpenSource > Jpa' 카테고리의 다른 글

Study - JPA 소개  (0) 2016.11.28

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

ace-t의 Spring Boot 따라잡기(기본 - freeMarker 연동)

OpenSource/Spring Boot 2016. 8. 28. 18:59
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

오랜만에 강좌를 쓰네요^0^ 

오늘은 freeMarker라는 템플릿을 이용하여  view를 만들어보겠습니다. ㅎㅎ

왜 freemarker냐?! 라고 하시면..회사에서 현재 사용하고 있어서라고..후훗


우선 지난번의 강좌를 통해 새롭게 검토하는 겸 따라서 해보겠습니다.

2016/03/22 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(셋팅편)

2016/03/22 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 헬로우월드찍어보기!)

2016/03/23 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - SourceTree에 연결 및 Repository에 올리기)

2016/03/23 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 외부톰캣 연동하기!)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - CouchBase 연동하기)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - logging)

2016/03/24 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 예외처리)


셋팅편을 참고하여 2분만에 샤샤샤~(JPA는 우선 셀렉 하지 마세용~)



압축 되어진 친구를 원하는 디렉토리에 압축을 풀어보면 아래와 같이 되어있습니다.



STS던지 인텔리J던지 원하는 에디터에 연결하여 줍니다. 저는 회사에서 제공해주는 인텔리J에 연결을 해보겠슴돠~

 

그리고나서 헬로우월드 한번 찍어주시고~(위의 링크 참조!)

그리고나서 우리가 원하는 freemarker를 설정해보겠습니다.


1. 위에서 freemarker를 선택하지 않았을 경우!  build.gradle에 아래의 디펜던시를 추가!


compile('org.springframework.boot:spring-boot-starter-freemarker')


2. 우리가 접근하고 싶은 view 를 하나 만들어 봅니다. templates dir에 index.ftl 하나를 만들어 줍니다.

    확장자는 ftl 입니다.


index.ftl의 내용은 아래와 같습니다.

<html>
<h1> hello~ ${message}</h1>
</html>

 




3. 그리고 이 view를 컨트롤할 Controller를 하나 만들어줍니다.


   


    import org.slf4j.Logger;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Controller
@RequestMapping(value = "/")
public class FreeMarkerController {
public static final Logger log = LoggerFactory.getLogger(FreeMarkerController.class);

@RequestMapping(method = RequestMethod.GET)
public String showIndex(Map<String,Object> model){
String msg = "terry~";
model.put("message", msg);
return "index";
}

}


 


서버를 띄운 뒤에 아래와 같이 나오면 성공!


http://localhost:8080/





test 관련

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html


요렇게 간단하게 웹을 구현할 수 가 있었습니다.

앞으로는 더 멋있는 녀석을 구현해보도록 하겠습니다.



 - 다음 이시간에.. -



acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

spring boot 환경 나누기(profiles)

OpenSource/Spring Boot 2016. 7. 18. 10:38
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



TEST Code


@RunWith(SpringJUnit4ClassRunner.class)

@SpringApplicationConfiguration(classes = LineupFantaApplication.class)

public class ServerHolderTest {


    public static final Logger logger = LoggerFactory.getLogger(ServerHolderTest.class);



    @Autowired ServerHolder serverHolder;


//    @Before

//    public void setUp(){}


    @Test

    public void testServerProfiles() throws Exception {

        Map<String,Map<String,String>> servers = serverHolder.getServerInfo();

        Assert.assertThat(servers.size(), is(1));

    }


} 


옛날 spring 방식하고 다르게 C언어처럼 main이 있으니 @SpringApplicationConfiguration(classes = LineupFantaApplication.class) 만 추가해주면 컨텍스트 쭉쭉 올라감! 굿굿!


@Autowired된 친구쪽에서 application.yml 읽어들임!

application.yml은 우리가 사용하게 되는 application.properties와 같은 친구!




@Component

@ConfigurationProperties(locations={"classpath:application.yml"})

public class ServerHolder {


    public Map<String, Map<String, String>> serverInfo = new HashMap<String, Map<String, String>>();

    public Map<String, Map<String, String>> getServerInfo() {

        return serverInfo;

    }

} 


application.yml의 내용은 아래와 같음.

serverInfo:

    - name: lineup

      ip: xxx.xxx.xxx.xxx

---


spring:

    profiles: real

serverInfo:

    - name: lineup

      ip: xxx.xxx.xxx.xxx



사용법은 아래와 같이 원하는 곳에서 사용하면 됨!

protected List<String> getBootstrapHosts() {

        return Arrays.asList(serverHolder.getServerInfo().get("0").get("ip"));

}



profiles는 tomcat같은 경우 vm argument에 이처럼 정보를 넣어서 사용!

-Dspring.profiles.active=real 옵션~안해주면 default 정보

1) 디폴트 : No active profile set, falling back to default profiles: default

2) -Dspring.profiles.active=real 옵션 : The following profiles are active: real


즉, 위의 옵션으로 yml의 정보를 real이냐 default냐 읽어들여서 profiles를할 수가 있다.

참고 사이트 : http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html




acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

log 모니터링을 위한 아키텍처

OpenSource/ElasticSearch 2016. 6. 15. 19:12
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

log 모니터링을 위한 아키텍처



목표는 ansible + elk


 END


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

uses unchecked or unsafe operations.

OpenSource/Spring Boot 2016. 4. 1. 17:38
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



uses unchecked or unsafe operations. 와 같은 워닝이 뜨면 확인해보아야할 것이있다.


아래와 같이 ArrayList 를 하나 선언했다.

ArrayList keyArr = new ArrayList();


위처럼 선언을 하면 uses unchecked or unsafe operations. 라고 warning이 뜬다.


ArrayList<String> keyArr = new ArrayList<String>();  이렇게 해야 경고는 뜨지 않는다.


관련해서 이펙티브 자바책을 한번 보면 좋을것 같다.


  - 끝 -



acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::