'전체'에 해당되는 글 217건

  1. 2015.01.05 CODE(부호) 란?
  2. 2015.01.02 [postgresql] - OIDS 란?
  3. 2014.12.24 [etc] - enum 사용 예
  4. 2014.12.22 [web] - spring mvc
  5. 2014.12.22 [web] 서블릿과 컨테이너
  6. 2014.12.17 DNS Round Robin
  7. 2014.12.17 Load Balancer
  8. 2014.12.17 용어
  9. 2014.12.10 Test Double 정의
  10. 2014.10.24 [Mybtis] - log interceptor
2015. 1. 5. 10:29

출처 : 인사이트/코드/찰스 펫졸드


코드란?

인간 의사소통의 기반이되는 체계를 의미한다.


예시)

- 입으로 소리를 만들어 의사소통을 하는 "말/언어"를 일종의 코드(부호)라 할 수 있다.

- "문자 언어/글"도 의사소통을 위해 사용하기 때문에 코드라 한다.

- 수화

- 모스부호

- ...


Posted by 짱가쟁이

테이블 생성 스크립트

CREATE TABLE TB_USER

(

  username character varying(64) NOT NULL, -- 사용자이름

  password character varying(20), -- 비밀번호

  CONSTRAINT PK_TB_USER PRIMARY KEY (username)

)

WITH (

  OIDS=FALSE

);


COMMENT ON TABLE TB_USER IS '사용자 관리';

COMMENT ON COLUMN TB_USER.username IS '사용자이름';

COMMENT ON COLUMN TB_USER.password IS '비밀번호';


위와 같이 테이블을 생성할 때 OIDS=FALSE란 구분이 보인다.

궁금해서 뒤져본 결과 postgresql은 테이블을 생성할 때 기본키를 설정하지 않으면 내부적으로 기본키를 생성한다고 한다. 이를 OIDS라고 하며 OIDS=FALSE란 의미 그대로 기본키를 내부적으로 생성하지 않겠다는 것이다.


'DBMS > postgresql' 카테고리의 다른 글

WGS84 거리 계산 함수  (0) 2015.01.15
[poostgresql] - postgis 사용하여 반경 검색하기  (0) 2015.01.09
Posted by 짱가쟁이
2014. 12. 24. 16:05

이름이 부여된 열거체(enumeration)을 사용하면 상수를 사용하는 것보다 훨씬 더 유연하고 서술적인 코딩이 가능하다.


- enumexample class

public enum LevelGrade {

LEVEL1 {

public double rate() {

return 1.0;

}

},

LEVEL2 {

public double rate() {

return 2.0;

}

},

LEVEL3 {

public double rate() {

return 3.0;

}

};

public abstract double rate();

}


- JUnit Test Case

public class TestUnit {

LevelGrade grade;

@Test

public void testLEVEL1() {

grade = LevelGrade.LEVEL1;

assertEquals(grade.rate(), 1.0, 0.0);

}

@Test

public void testLEVEL2() {

grade = LevelGrade.LEVEL2;

assertEquals(grade.rate(), 2.0, 0.0);

}

@Test

public void testLEVEL3() {

grade = LevelGrade.LEVEL3;

assertEquals(grade.rate(), 3.0, 0.0);

}

}


출처 : 클린코드

'java > etc' 카테고리의 다른 글

유한상태기계(Finite State Machine, FSM)  (0) 2016.05.24
Domain name to ip address  (0) 2012.05.15
[URL] - FTP 접속 URL  (0) 2012.05.15
[AES] - 256bit 키를 인식하지 못할 때 사용하는 방법  (0) 2011.11.30
[etc] - 테스트 유형  (0) 2010.12.21
Posted by 짱가쟁이
2014. 12. 22. 13:31




Spring MVC

스프링에서 지원하는 서블릿 기반의 MVC 프레임워크


DispatcherServlet(Front Controller)

프레젠테이션 계층의 제일 앞단에서 서버로 들어오는 모든 요청을 먼저 받아서 처리함. 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하여 응답을 전송함


HandlerMapping

클라이언트의 요청 URL과 매핑되는 컨트롤러를 결정함

Controller

URL과 매핑되는 세부 컨트롤러로 요청을 처리한 뒤, 결과를 DispatcherServelet에게 전달


ModelAndView

컨트롤러가 처리한 결과 정보 및 뷰를 선택한 정보를 담음


ViewResolver

컨트롤러의 처리 결과를 생성할 뷰를 결정

View

컨트롤러의 처리 결과 화면을 생성. JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용



Posted by 짱가쟁이



Servlet

웹 페이지를 동적으로 생성하는 서버측 프로그램을 말하며, 흔히 서블릿이라 불린다.


서버측 프로그램

서버에서 실행되는 작은 프로그램.

Ex> JSP -> 컴파일 -> 서블릿 변환 -> 서버에서 구동


Container

서블릿의 Lifecycle을 관장하는 소프트웨어(모듈)을 "컨테이너"라 불린다.


Lifecycle

컨테이너는 클라이언트의 요청을 받으면 URL에 매핑하는 서블릿을 생성하고 생성된 서블릿은 정의된 비즈니스를 수행하고 소멸한다.


Role of Container

Communication 지원

서블릿과 웹서버의 통신을 담당. 컨테이너가 없다고 가정하면, 웹서버의 요청을 대기하는 리스너를 만들어 해당 요청(URL)과 서블릿을 매핑해야 하는 과정을 거쳐야 함. 컨테이너는 이런 복잡한 통신 기능을 API로 제공함.

- Lifecycle 관리

클라이언트의 요청(URL)이 들어오면 해당 URL과 매핑되는 서블릿의 인스턴스를 생성하고, 초기화 메소드를 호출. 서블릿의 수명이 다하면 적절하게 가비지 컬렉션을 수행한다. 즉 서블릿의 탄생과 죽음을 관리한다.


- Multi-Thread 지원

컨테이너는 클라이언트의 요청이 들어오면 서블릿을 처리하기 위한 새로운 쓰레드를 생성하고, 작업이 끝난 쓰레드는 반환하여 다중 요청에 대한 안정적인 동시성을 지원함


- 선언적 보안관리(??)


- JSP 지원





Posted by 짱가쟁이
2014. 12. 17. 13:48

DNS Round Robin


: DNS를 이용해서 하나의 서비스에 여러 대의 서버를 분산시키는 방법.


문제점)

- 서버의 수만큼 글러벌(공인 IP) 주소가 필요.


- 균등하게 분산되는 것은 아님.

: DNS 질의 결과를 캐싱하여 사용하는 경우(시스템, 소프트웨어..) 같은 IP로 요청하기 때문에 균등하게 부하가 분산되지 않는다.

ex) 웹 브라우저, 휴대폰 캐리어 게이트웨이(?)


- 서버 다운을 감지 못함

: DNS 서버는 등록된 아이피를 Round Robin으로 응답하기 때문에 Application Server의 상태를 알 수 없다.


해결방안 1)  AP 서버에 VIP(Virtual IP)를 부여해서 다중화를 구성한다. 각 AP 서버를 Health Check후 이상이 감지되면 VIP를 정상 AP 서버로 인계하는 방식을 사용한다.


해결방안 2) Load Balancer를 도입한다.





'server/Infra' 카테고리의 다른 글

Load Balancer  (0) 2014.12.17
용어  (0) 2014.12.17
Posted by 짱가쟁이
2014. 12. 17. 13:43

DNS Round Robin vs Load Balancer


- DNS Round Robin은 웹 서버마다 공인 IP를 할당하여 운영되는 반면에 Load Balancer는 하나의 IP주소에 대해 요청을 복수의 서버로 분산할 수 있다. DNS Round Robin은 별도의 Failover에 대한 처리가 필요하지만 Load Balancer는 내장된 기능으로 처리된다.


Load Balancer


- 동작

: 로드밸런서는 서비스용 공인IP를 가진 가상적인 서버로서 동작한다. 클라이언트로부터 전송되어 온 요청을 Real Server로 중계함으로써 마치 자신이 AP 서버인 것처럼 동작한다.


- 기능

: 로드밸런서는 여러 대의 Real Server중에 한 대를 선택해서 처리를 중계한다. 이 때, 헬스체크가 실패하는 서버는 선택되지 않는다. 따라서 서버 한 대가 정지해 있더라도 정상적으로 가동하고 있는 서버가 있는 한 서비스가 정지하지 않는다.


- 종류

case 1) L4 switch (Layer 4 - 트랜스포트 계층)

: IP 주소나 PORT에 따라 분산대상 서버를 지정한다.

: Linux의 IP Virtual Server(IPVS) 모듈을 이용해서 구성 가능.


L4 구성안 1) Network Address Translation(NAT)

: L4는 요청이 들어오면 수신지 주소(L4 IP)를 선택된 리얼서버 주소로 변경하여 요청을 전송 후 응답이 도착하면 송신지(리얼서버) 주소를 L4 IP로 되돌려서 클라이언트로 전송한다.


L4 구성안 2) Direct Server Return(DSR)

: L4는 요청이 들어오면 선택된 리얼서버로 패킷을 그대로 전송하고 리얼서버는 요청을 처리 후 클라이언트로 Direct로 응답을 전송한다.

: 로드발랜서의 병목이 되는 것을 걱정하거나 높은 트래픽에 견디는 부하분산환경이 필요할 경우 사용한다.


case 2) L7 switch (Layer 7 - 어플리케이션 계층)

: Layer 4 ~ Layer 7까지 패킷을 분석하여 분산대상 서버를 지정한다.

: Reverse Proxy를 이용해서 구성 가능.


Load Balancer - Scheduling Algorithm


- Round-Robin(rr)

: Real Server를 차례로 선택한다. 모든 서버에 균등하게 처리가 분산된다.


- Weighted Round-Robin(wrr)

: 가중치를 가미해서 Round-Robin이 수행된다. 가중치가 높은 서버일수록 빈번하게 선택되므로 처리


- Least-Connection(lc)

: 접속수가 가장 적은 서버를 선택한다.


- Weighted Least-Connection(wlc)

: 가중치를 가미해서 Least-Connection을 수행한다. 고성능 장비에 가중치를 크게하면 효율이 좋다.


- Shorted Expected Delay(sed)

: 가장 응답속도가 빠른 서버를 선택한다. 그렇다고 해도 서버에 패킷을 날려 응답시간을 계측하는 것은 아니다. 상태가 ESTABLISHED인 접속수가 가장 적은 서버를 선택하는 것일 뿐이다. wlc와 거의 동일하게 동작하지만 wlc에서는 ESTABLISHED 이외의 상태(TIME_WAIT, FIN_WAIT 등)인 접속수를 더한다는 점이 다르다.


- Never Queue(nq)

: Shorted Expected Delay와 동일한 알고리즘이지만 ESTABLISHED 접속수가 0인 서버를 최우선으로 선택한다.










'server/Infra' 카테고리의 다른 글

DNS Round Robin  (0) 2014.12.17
용어  (0) 2014.12.17
Posted by 짱가쟁이
2014. 12. 17. 13:29

Content Delivery Network(CDN)

- 컨텐츠를 전송하기 위한 네트워크 시스템.

- 전송 성능 향상과 가용성 향상을 목적으로 하며, 전 세계에 존재하는 캐시 서버 중에 클라이언트에 보다 가까운 캐시 서버를 선택해서 전송함으로써 성능 향상을 실현하는 것이 구성상의 특징임.


Netfilter

- 리눅스 커널 상에서 네트워크 패킷을 조작하기 위한 프레임워크.

- 패킷 필터링등을 수행하는 iptable나 로드밸런스를 실현하기 위한 IPVS(IP Virtual Server)도 Netfilter의 기능을 이용하고 있다.


Availability(가용성)

- 시스템을 정지시키지 않음을 의미함. '가용성이 높다'라고 하면 '해당 서비스는 거의 멈추지 않는다'라는 의미다.


High Availability(고 가용성)

- 바람직한 정도로 긴 시간동안 지속적으로 운영이 가능한 시스템이나 컴포넌트를 가리킨다.


Single Point of Failure(SPOF)

- 장애가 발생하면 시스템 전체가 정지해버리는 곳. (시스템 급소?)


Round Robin

- 여러 개의 노드에 대해 순서대로 할당하거나 분산하는 것.

- 프로그램/프로세스에게 컴퓨터 자원을 공정하기 부여하기 위해 순서대로 자원을 할당하는 방법.


Scale-out

- 서버를 여러 대 두고 분산함으로써 시스템 전체의 성능을 향상시키는 것.


Scale-up

- 단일 서버의 성능을 높임으로써 시스템 전체의 성능을 향상시키는 것.


Failover

- 다중화된 시스템에서 Active인 노드가 정지했을 때 자동으로 Backup 노드로 전환되는 것.


Failback

- Active 노드가 정지한 후 장애가 극복된 상태에서 원래의 정상 상태로 복귀하는 것.


Health Check(장애 검출)

- 현재 운용장비에서 장애가 발생하고 있음을 검출하는 방법.


- ICMP 감시(Layer 3 - 네트워크 계층)

: ICMP의  echo 요청을 보내서 응답이 돌아오는지를 체크한다. 가장 간단하고 가벼운 방법이지만, 웹서비스가 다운된 경우(아파치가 중지한 경우 등)는 감지할 수 없다. 서비스의 정상 동작 유/무는 감지할 수 없다.


ICMP -  네트워크에서 오류, 경고, 알림에 대한 메시지를 전달하는 목적으로 사용되는 인터넷 프로토콜.


- 포트 감시(Layer 4 - 트랜스포트 계층)

: TCP로 접속을 시험해서 접속할 수 있는지 여부를 체크한다. 웹서비스가 다운된 것은 감지할 수 있지만, 과부하 상태로 응답할 수 없다거나 에러를 반환하는 것은 감지할 수 없다.


- 서비스 감시(Layer 7 - 어플리케이션 계층)

: 실제로 요청 등을 보내서 정상적인 응답이 돌아오는지를 체크한다. 대부분의 이상을 감지할 수 있지만 경우에 따라서는 서버에 부하를 유발할 수도 있다.


Appliance

- 서버나 스토리지 같은 하드웨어에 소프트웨어를 장착해 특정 업무에 최적화된 상태에서 판매되는 통합 장비

- OS나 응용 소프트웨어의 설치, 설정등을 행하지 않고 구입해서 전원을 접속하면 곧 사용할 수 있는 정보 기기.

- 결국 특정 업무에 특화된 하드웨어 장비를 얘기하는 듯.


'server/Infra' 카테고리의 다른 글

DNS Round Robin  (0) 2014.12.17
Load Balancer  (0) 2014.12.17
Posted by 짱가쟁이
2014. 12. 10. 11:10

출처 

 : http://blog.daum.net/aqua0405/5558319

 : http://www.martinfowler.com/bliki/TestDouble.html

 : http://msdn.microsoft.com/ko-kr/magazine/cc163358.aspx



: 테스트를 수행하기 위해서 실제 컴포넌트 역활을 대체하는 기능을 가진 객체나 컴포넌트를 말한다.


: Gerard Meszaros(xunitpatterns.com)가 실제 구성 요소 서버를 대체하기 위한 테스트용 개체를 나타내는 일반적인 이름으로  스턴트맨을 지칭하는 "Stunt Double"에 빗대어 "Test Double"이라는 용어를 사용하자고 제안했다. Test Double 자체는 일반적인 용어로, 특정 구현 상태를 지칭하는 데에는  Dummy/Stub/Spy/Fake/Mock과 같이 다른 이름이 사용된다.



Posted by 짱가쟁이


MybatisLogInterceptor.java

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Properties;


import org.apache.commons.beanutils.PropertyUtils;

import org.apache.ibatis.executor.statement.StatementHandler;

import org.apache.ibatis.mapping.BoundSql;

import org.apache.ibatis.mapping.ParameterMapping;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

import org.apache.ibatis.session.ResultHandler;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


@Intercepts({

@Signature(type=StatementHandler.class, method="update", args={Statement.class}),

@Signature(type=StatementHandler.class, method="query", args={Statement.class, ResultHandler.class})

})

public class MybatisLogInterceptor implements Interceptor {


private static final Logger logger = LoggerFactory.getLogger("mybatis.log");

@Override

public Object intercept(Invocation invocation) throws Throwable {

StatementHandler handler = (StatementHandler)invocation.getTarget();

BoundSql boundSql = handler.getBoundSql();

        

List<Object> columnValues = getColumnValues(handler, boundSql);

String sql = getSql(boundSql.getSql(), getTypes(columnValues));

         

        logger.info("=====================================================================");

        logger.info("sql : \n{}", sql);

        logger.info("=====================================================================");

return invocation.proceed(); // 쿼리 실행

}

@Override

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

@Override

public void setProperties(Properties properties) {

}

private List<Object> getColumnValues(StatementHandler handler, BoundSql boundSql) {

List<Object> columnValues = new ArrayList<Object>();

Object parameter = handler.getParameterHandler().getParameterObject();

List<ParameterMapping> parameterMappingList = boundSql.getParameterMappings();

for(int i = 0;i<parameterMappingList.size();i++) {

try {

if(PropertyUtils.isReadable(parameter, parameterMappingList.get(i).getProperty())) {

Object column = PropertyUtils.getProperty(parameter, parameterMappingList.get(i).getProperty());

columnValues.add(column);

} else {

if(parameter instanceof Map) {

columnValues.add( ((Map<?, ?>) parameter).get(parameterMappingList.get(i).getProperty()) );

} else {

columnValues.add(parameter);

}

}

} catch (Exception e) {

e.printStackTrace();

}

return columnValues;

}

private Object[] getTypes(List<Object> columnValues) {

Object[] object = new Object[columnValues.size()];

for(int i = 0; i < columnValues.size(); i++) {

    object[i] = columnValues.get(i);

   }

   return object;

}    

private String getSql(String sqlStr, Object[] items) {

int seq = 0;

  StringBuffer buf = new StringBuffer();

  int i;

  while ((i = sqlStr.indexOf("?")) >= 0) {

  if(seq == items.length) break; 

 

  buf.append(sqlStr.substring(0, i));

  if (items[seq] instanceof String) {

  buf.append("'" + items[seq] + "'");

  } else if (items[seq] instanceof Integer) {

  buf.append(items[seq]);

  } else if (items[seq] instanceof Long) {

  buf.append(items[seq]);

  } else if (items[seq] == null) {

  buf.append("null");

  } else {

  buf.append(items[seq]);

  }

  sqlStr = sqlStr.substring(i + "?".length());

  seq++;

  }

  buf.append(sqlStr);

  return buf.toString();

  }

}


spring.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >

        <property name="configLocation" value="classpath:/sqlmap/config/mybatis-config.xml"/>

        <property name="dataSource" ref="dataSource"/>

        <property name="plugins">

            <array>

                <bean class="xxx.xxx.interceptor.MybatisLogInterceptor"/>

            </array>

        </property>

</bean>


'framework > ibatis' 카테고리의 다른 글

[ibatis] - 오류  (0) 2010.07.06
[ibatis] - resultMap 초기화 문제  (1) 2010.06.25
Posted by 짱가쟁이