'ITWeb/개발일반'에 해당되는 글 490건

  1. 2016.04.11 [Java] Build Executable Jar + Local Dependency Jar on Intellij
  2. 2016.04.06 [Git] git fetch --tags
  3. 2016.03.31 [Kafka] 재미로 본 Elastic Stack과 Kafka 매칭
  4. 2016.03.31 [Node.js] Node.js + Express + EJS + PM2 초간단 구성하기 on OSX
  5. 2016.03.24 [Intellij] Intellij + SpringMVC + Tomcat
  6. 2016.03.24 [GIT] Git force pull branch to local.
  7. 2016.03.22 [Redis] Master/Slave, Sentinel 구성 부터 Jedis 예제까지.
  8. 2016.03.09 [Mysql] create database syntax example.
  9. 2016.03.09 [Maven] 간단 Profile을 이용한 서비스 환경 구성
  10. 2016.03.03 [Java] 외부 프라퍼티(XML) 파일 설정 정보 읽기

[Java] Build Executable Jar + Local Dependency Jar on Intellij

ITWeb/개발일반 2016. 4. 11. 19:09

예전 글에 일부 설명이 있는데 오늘 삽질한 내용으로 기록해 봅니다.


local 에서 systemPath를 이용해서 dependency 를 설정해 준 경우 manifest 파일에 classpath 로 등록이 되지 않는 문제였습니다.

해결 방법은 아래 코드에 <manifestEntries />를 이용해서 추가해 주었습니다.


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<index>false</index>
<manifestEntries>
<Class-Path>lib/system-path-jar-0.0.1.jar</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>


아래 글 참고해서 보세요.

  1. 2015.12.05 [JAVA] executable jar 생성 시 pom.xml build 설정.
  2. 2015.09.22 [Maven] Executable jar + Assembly 를 이용한 tar 묶기.


:

[Git] git fetch --tags

ITWeb/개발일반 2016. 4. 6. 17:05

참 별거 아닌데 이런것도 기록을 하고 있습니다. ㅡ.ㅡ;


remote tag 소스를 보려고 하다 intellij 에서 tag 명 넣었더니 못찾아서 땡기 왔습니다.


$ git fetch --tags


:

[Kafka] 재미로 본 Elastic Stack과 Kafka 매칭

ITWeb/개발일반 2016. 3. 31. 18:16

그냥 재미로 한번 매칭해 봤습니다.

크게 의미는 없으니 재미로 봐주세요.


Kafka)


Elastic Stack)



 Elastic Stack

 Kafka

 logstash, beats

 producer

 elasticsearch cluster

 cluster (broker + zk)

 logstash

 consumer

 index

 topic 

 shard

 partition

 document id

 offset 

 index.number_of_replicas

 --replication-factors

 index.number_of_shards

 --partitions


저는 이해하기 쉬운데 저만 그런가요??


:

[Node.js] Node.js + Express + EJS + PM2 초간단 구성하기 on OSX

ITWeb/개발일반 2016. 3. 31. 11:23

imac osx에 node.js 를 이용한 웹서비스 구성 테스트 입니다.

기존에 잘 작성된 문서들이 많아서 그냥 참고해서 그대로 따라해 보았습니다.

다만, 구성 하면서 springmvc 와 비교를 해보면서 전통적인 웹 개발 방법보다 어떤 장점을 갖는지 이해하고자 하였습니다.


  • Node.js
  • Express
    • 설치 참고 사이트
    • global 로 설치 해야 하는 경우와 그렇지 않은 경우로 나눠서 설치 하며 기준을 명시 해 두어야 합니다.
    • 설치 (전역 모듈로 설치 합니다.)
      • $ npm install express
      • $ npm install -g express
    • path 설정

      #!/bin/bash
       
       
      if [ -f ~/.bashrc ]; then
        source ~/.bashrc
      fi
       
      JAVA_HOME=`/usr/libexec/java_home`
      MAVEN_HOME=/Users/jeonghoug/Dev/apps/maven
      MYSQL_HOME=/usr/local/mysql
      NODE_PATH=/usr/local/lib/node_modules
      PATH=$NODE_PATH:$NODE_PATH/npm/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin:
      $MYSQL_HOME/bin:$PATH
       
      export PATH
      export NODE_PATH
      export JAVA_HOME
      export MAVEN_HOME
      export MYSQL_HOME
    • 설치된 경로

      # global 옵션을 주지 않고 설치하게 되면 아래와 같이 해당 계정 아래 생성 됩니다.
      $ pwd
      /Users/jeonghoug/node_modules/express
    • 로컬 설치된 express 삭제 하고 global 로 설치 합니다.

      $ npm uninstall express
      $ sudo npm install -g express
    • express 를 이용한 HelloWebServer 테스트
      • $ mkdir HelloWebServer; cd HelloWebServer; vi app.js
      • 참조 샘플 : http://pyrasis.com/nodejs/nodejs-HOWTO

        var express = require('express')
          , http = require('http')
          , app = express()
          , server = http.createServer(app);
         
        app.get('/', function (req, res) {
          res.send('Hello /');
        });
         
        app.get('/world.html', function (req, res) {
          res.send('Hello World');
        });
         
        server.listen(8000, function() {
          console.log('Express server listening on port '
             + server.address().port);
        });
      • global 옵션 설치 후 실행

        $ node app.js
        module.js:327
            throw err;
            ^
        Error: Cannot find module 'express'
            at Function.Module._resolveFilename (module.js:325:15)
            at Function.Module._load (module.js:276:25)
            at Module.require (module.js:353:17)
            at require (internal/module.js:12:17)
            at Object.<anonymous> (/Dev/workspace/HelloWebServer/app.js:1:77)
            at Module._compile (module.js:409:26)
            at Object.Module._extensions..js (module.js:416:10)
            at Module.load (module.js:343:32)
            at Function.Module._load (module.js:300:12)
            at Function.Module.runMain (module.js:441:10)

         

        • 위와 같이 에러가 발생 하며, 이유는 -g 옵션으로 설치된 경로는 /usr/local/lib/node_modules/express 로 설치가 되지만, 소스코드 상에 require('express') 에서는 상대 경로 찾기 때문에 모듈을 찾지 못하는 오류가 발생 합니다.
        • require('express') 를 require('/usr/local/lib/node_modules/express') 로 변경 후 실행 하면 정상 동작 합니다.
        • 또는 $ npm install express 로 local 설치 하고 실행 하면 정상 동작 합니다.
    • global 옵션으로 설치한 모듈에 대해서 'cannot find module' 에러 발생 시 해결 방법
      • 기본적으로 node 에서 사용하는 환경 변수 설정 중 path 설정이 안되어 있어 발생 하게 됩니다.

        #!/bin/bash
         
         
        if [ -f ~/.bashrc ]; then
          source ~/.bashrc
        fi
         
        JAVA_HOME=`/usr/libexec/java_home`
        MAVEN_HOME=/Users/jeonghoug/Dev/apps/maven
        MYSQL_HOME=/usr/local/mysql
        NODE_PATH=/usr/local/lib/node_modules
        PATH=$NODE_PATH:$NODE_PATH/npm/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin:$MYSQL_HOME/bin:$PATH
         
         
        export PATH
        export NODE_PATH
        export JAVA_HOME
        export MAVEN_HOME
        export MYSQL_HOME
      • 위와 같이 NODE_PATH 환경 변수 설정을 해주게 되면 관련 에러가 발생 하지 않게 되며 global 모듈을 사용할 수 있게 됩니다.

      • 위와 같이 path 설정 후 발생하는 문제 점

        $ npm install
        module.js:327
            throw err;
            ^
        Error: Cannot find module '/usr/local/lib/node_modules/npm/bin/
        node_modules/npm/bin/npm-cli.js'
            at Function.Module._resolveFilename (module.js:325:15)
            at Function.Module._load (module.js:276:25)
            at Function.Module.runMain (module.js:441:10)
            at startup (node.js:139:18)
            at node.js:968:3

         

        • 위에서 보는 것과 같이 NODE_PATH 설정 후 npm install을 하게 되면 npm 의 기본 경로가 중복으로 설정되어 동작하는 문제가 있어 아래와 같이 수정 합니다.

          #!/bin/bash
           
           
          if [ -f ~/.bashrc ]; then
            source ~/.bashrc
          fi
           
          JAVA_HOME=`/usr/libexec/java_home`
          MAVEN_HOME=/Users/jeonghoug/Dev/apps/maven
          MYSQL_HOME=/usr/local/mysql
          NODE_PATH=/usr/local/lib/node_modules
          PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$MYSQL_HOME/bin:$PATH
           
          export PATH
          export NODE_PATH
          export JAVA_HOME
          export MAVEN_HOME
          export MYSQL_HOME
  • Express Generator
    • EJS 템플릿
    • 설치하기
      • $ sudo npm install -g express-generator
    • 샘플코드 참고 사이트
    • ejs 템플릿 생성하기

      $ express --ejs
         create : .
         create : ./package.json
         create : ./app.js
         create : ./public
         create : ./public/images
         create : ./public/stylesheets
         create : ./public/stylesheets/style.css
         create : ./routes
         create : ./routes/index.js
         create : ./routes/users.js
         create : ./views
         create : ./views/index.ejs
         create : ./views/error.ejs
         create : ./bin
         create : ./bin/www
         install dependencies:
           $ cd . && npm install
         run the app:
           $ DEBUG=ExampleEJS:* npm start
         create : ./public/javascripts
    • package.json
      • 본 서비스에서 사용 또는 설치 되어야 할 모듈을 모두 정의해 둡니다.
        • maven 으로 비교 하면 dependency 기능과 비슷합니다.
      • 정의가 끝나면 $ npm install 을 통해 설치를 합니다.
    • app.js
      • 본 서비스 또는 어플리케이션에 대한 global 설정을 하게 됩니다.
      • 여기서 URI 등록 작업이 이루어 지며, SpringMVC 에서 @Controller 내 @RequestMapping 과 같은 기능을 처리 합니다.
      • routes 를 등록하여 사용이 가능 하며, routes/*.js 에서 MVC 구성을 하면 됩니다.
    • bin/www
      • http server를 생성 하며 설정 정보를 기록 합니다.
    • views/*.ejs
      • jsp 나 jstl 과 같은 역할을 하는 view 파일들이 위치 합니다.
      • 실시간 수정이 가능 합니다.
    • routes/*.js
      • spring mvc 에서 controller, bo, dao 와 같은 역할의 파일들이 위치 합니다.
      • 수정 내용 반영을 위해서는 재시작을 해야 합니다.
    • public/*
      • static file 들이 위치 합니다.
    • ExampleEJS

      // views/index.ejs
      <!DOCTYPE html>
      <html>
        <head>
          <title><%= title %></title>
          <link rel='stylesheet' href='/stylesheets/style.css' />
        </head>
        <body>
          <h1><%= title %></h1>
          <% for (var i = 0; i < 5; i++) { %>
          <p>Welcome to <%= title %></p>
          <% } %>
        </body>
      </html>
       
      // routes/index.js
      var express = require('express');
      var router = express.Router();
       
      /* GET home page. */
      router.get('/', function(req, res) {
        res.render('index', { title: 'Express' });
      });
       
      module.exports = router;
  • PM2
    • 참조사이트
    • 설치
      • $ sudo npm install -g pm2
    • 실행
      • 기존에 $ node app.js 로 실행을 했다면, $ pm2 start app.js 로 실행이 가능 합니다.


:

[Intellij] Intellij + SpringMVC + Tomcat

ITWeb/개발일반 2016. 3. 24. 17:29

요즘 한참 web 개발을 안하다 보니 까먹고 산다고나 할까요.

그래서 기억을 돕기 위해 기록 합니다.


프로젝트 생성)

Intellij -> File -> New -> Project -> Maven -> maven-archetype-webapp


Spring MVC 추가)

Current Project -> Mouse Right Click -> Add Framework Support -> Spring MVC


Tomcat 연동)

연동 전에 다운로드를 먼저 받아 놓아야 합니다.

Run -> Edit Configures -> + -> Tomcat Server -> local -> Name 등록


실행은 그냥 Run 으로 등록한 Name 실행 하면 됩니다.


여기서 재밌는 사실 하나!

controller 만들고 jsp 만들어서 "Hello World" 변수 넘겨줘서 찍어 보면 동작 하지 않는 문제가 있습니다.

이것은 바로 servlet-api 의 version 문제 인데요.


위와 같이 spring mvc 프로젝트 생성 하시면 web.xml 에 아래와 같이 선언 됩니다.

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>


보이시죠 servlet-api 가 2.3 입니다.

근데 제가 선언한건 2.5 ㅡ.ㅡ;

이럴 경우 화면에 변수 출력이 정상적으로 되지 않고 그냥 ${message} 와 같이 출력이 됩니다.

그래서 아래와 같이 수정했습니다.


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

참 별거 아니지만 모르면 별거가 되는 것이고 알면 별거 아닌게 되고 그렇죠. ^^


:

[GIT] Git force pull branch to local.

ITWeb/개발일반 2016. 3. 24. 14:12

그냥 기억을 돕기 위해 기록해 봅니다.


$ git fetch --all

$ git reset --hard origin/master

$ git pull origin master


:

[Redis] Master/Slave, Sentinel 구성 부터 Jedis 예제까지.

ITWeb/개발일반 2016. 3. 22. 16:17

필요해서 구성해본 내용을 정리 합니다.

복습 차원에서 기록 하는 것이라 별 도움이 안될수 있습니다.


Redis 공식 사이트)


Redis 다운로드)


Redis 설치 on OSX)

# 다운로드 받은 후 tar 압축 해제 후 make 했습니다.

$ make

    LINK redis-check-dump

    CC redis-check-aof.o

    LINK redis-check-aof


Hint: It's a good idea to run 'make test' ;)

# 필요 하신 경우 make install 하시면 됩니다.


Redis Configure 참조)

- maxmemory 설정은 32bits 운영체제에서 최대 3GB 이며, 64bits 에서는 리소스 만큼 가능 하다고 합니다.

- expire 설정을 해주는 것 보다 그냥 LRU 설정을 사용하라고 합니다. (근데 이건 서비스 특성과 성능 테스트 후 결정 하는게 좋아 보입니다.)

- redis LRU 알고리즘이 완벽하지 않다(Redis LRU algorithm is not an exact implementation.)는 공식 문서의 설명이 있습니다. 그래서 maxmemory-samples 라는 설정을 하는 것 같습니다.

(http://redis.io/topics/lru-cache)

- 단순 휘발성 데이터에 대한 cache 용도 일때는 rdb, append 모드를 disable 하는게 좋습니다.

- sentinel 설정은 master, slave 구성 시 failover 지원을 하기 위함 입니다. (client 에서는 JedisSentinelPool 을 사용하세요.)

- master election 시 민주적으로 하기 위해 quorum 구성을 합니다.


Redis Master 설정)

daemonize yes

pidfile /redis-server/master/pidfile/redis.pid

port 6379

tcp-backlog 511

bind 127.0.0.1

loglevel debug

logfile /redis-server/master/log/redis.log

maxmemory 64MB

maxmemory-policy allkeys-lru

maxmemory-samples 5

appendonly no

save ""

requirepass redispassword


Redis Slave 설정)

daemonize yes

pidfile /redis-server/slave/pidfile/redis.pid

port 6479

tcp-backlog 511

bind 127.0.0.1

loglevel debug

logfile /redis-server/slave/log/redis.log

maxmemory 64MB

maxmemory-policy allkeys-lru

maxmemory-samples 5

appendonly no

save ""

slaveof 127.0.0.1 6379

masterauth redispassword


Redis Sentinel Quorum 설정)

Sentinel 1)

port 26379

dir "/tmp"

sentinel monitor redis-master 127.0.0.1 6379 2

sentinel auth-pass redis-master redispassword

sentinel down-after-milliseconds redis-master 30000

sentinel parallel-syncs redis-master 1

daemonize yes

pidfile "/redis-server/sentinel1/pidfile/sentinel.pid"

logfile "/redis-server/sentinel1/log/sentinel.log"


Sentinel 2)

port 26479

dir "/tmp"

sentinel monitor redis-master 127.0.0.1 6379 2

sentinel auth-pass redis-master redispassword

sentinel down-after-milliseconds redis-master 30000

sentinel parallel-syncs redis-master 1

daemonize yes

pidfile "/redis-server/sentinel2/pidfile/sentinel.pid"

logfile "/redis-server/sentinel2/log/sentinel.log"


Sentinel 3)

port 26579

dir "/tmp"

sentinel monitor redis-master 127.0.0.1 6379 2

sentinel auth-pass redis-master redispassword

sentinel down-after-milliseconds redis-master 30000

sentinel parallel-syncs redis-master 1

daemonize yes

pidfile "/redis-server/sentinel3/pidfile/sentinel.pid"

logfile "/redis-server/sentinel3/log/sentinel.log"


Redis Master/Slave/Sentinel 실행)

$ src/redis-server /redis-server/master/conf/redis.conf

$ src/redis-server /redis-server/slave/conf/redis.conf

$ src/redis-server /redis-server/sentinel1/conf/sentinel.conf --sentinel

$ src/redis-server /redis-server/sentinel2/conf/sentinel.conf --sentinel

$ src/redis-server /redis-server/sentinel3/conf/sentinel.conf --sentinel


Jedis 공식 사이트)


Jedis 샘플 코드)

- JedisSentinelPoolTest 참조



:

[Mysql] create database syntax example.

ITWeb/개발일반 2016. 3. 9. 15:30

뭘 이런걸 기록하는지 모르겠지만 나이 먹으면 이런것도 자꾸 까먹습니다.


참고문서)


기본 Syntax)

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

예제)

mysql> create database 생성할데이터베이스명 default character set utf8 collate utf8_general_ci;


:

[Maven] 간단 Profile을 이용한 서비스 환경 구성

ITWeb/개발일반 2016. 3. 9. 10:32

개발과 운영 또는 test, qa, stage 등 다양한 개발 및 서비스 환경이 있을 수 있습니다.

그렇다 보니 RDBMS를 사용하는 경우 연결 정보를 다르게 가져가야 하는데요.

이럴경우 maven profile 기능을 이용해서 구성이 가능 합니다.

기억력에 의존할 나이가 넘었으므로 기록해 보겠습니다.

(구글링 해보시면 자세하게 정리된 문서 많이 나와 있습니다.)


참고문서)

http://maven.apache.org/guides/introduction/introduction-to-profiles.html


저는 간단하게 development 환경과 production 환경 두 가지만 설정 하도록 하겠습니다.


pom.xml 설정)

<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>development</env>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>production</env>
</properties>
</profile>
</profiles>

<build>
<resources>
<resource>
<directory>src/main/resources/${env}</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources/${env}</directory>
</testResource>
</testResources>
</build>


빌드 옵션)

$ mvn clean package -P development


디렉토리 구성)

src/main/resources/development

src/main/resources/production


※ src/test 는 여기에 구성하지 않았습니다. ^^;


:

[Java] 외부 프라퍼티(XML) 파일 설정 정보 읽기

ITWeb/개발일반 2016. 3. 3. 16:30

외부에 존재하는 properties 파일이나 xml 파일에서 설정 정보를 읽고 싶을 경우가 있습니다.

그래서 기록해 봅니다.


import java.io.*;

import java.util.Properties;


Properties properties = new Properties();

InputStreamReader isr = null;


try {

  isr = new InputStreamReader(new FileInputStream("/server/config/config.properties"), "UTF-8");

  properties.load(isr);

} finally {

  if (null != isr) {

    try {

      isr.close();

    } catch (IOException ex) {}

  }

}


System.out.println(properties.getProperty("프라퍼티명"));


xml을 읽고 싶을 경우 

properties.loadFromXML(InputStream in);

을 이용하시면 됩니다.


: