SPOF (Single Point Of Failure)
load balancer,web server, database 등의 시스템을 구성하는 요소 중에서 이중화 구성이 되지 않아 장애가 발생하면 시스템 전체에 영향을 주는 요소를 말한다. 단일 고장점이라고도 표현함. 예를 들어 웹 서버가 이중화 되어 있지 않아 웹 서버가 중단되면 서비스 전체가 중단되므로, 이 때 웹 서버가 SPOF가 된다.
SPOF (Single Point Of Failure)
load balancer,web server, database 등의 시스템을 구성하는 요소 중에서 이중화 구성이 되지 않아 장애가 발생하면 시스템 전체에 영향을 주는 요소를 말한다. 단일 고장점이라고도 표현함. 예를 들어 웹 서버가 이중화 되어 있지 않아 웹 서버가 중단되면 서비스 전체가 중단되므로, 이 때 웹 서버가 SPOF가 된다.
NAT (Network Address Translation)
private network 내의 서버를 에서 public network에 있는 서버에 접근할 때, private network로 통신하는 IP address 와 public network로 통한하는 IP address 를 상호 변환하는 것으로, public network의 IP address 하나로 여러 개의 private IP addresss를 운용할 수 있도록 하는 기술이다.
NFS (Network File System)
네트워크를 통해 파일을 공유하기 위한 시스템. 공유 파일을 저장하는 NFS 서버와 원격으로 파일에 접근하는 NFS 클라이언트로 구성된다. 여러 대의 NFS 클라이언트에서 한 대의 NFS 서버에 접근할 수 있어 여러 대의 클라이언트에서 파일을 공유할 수 있다.
Proxy / Reverse Proxy
조직이나 기업의 네트워크에서 외부 네트워크에 접속할 경우, 내부의 클라이언트가 직접 외부와 통신하지 못하도록 하고 클라이언트를 대신하여 외부의 서버와 통신하는 서버를 proxy 라고 한다. 반대로 외부에서 들어오는 통신을 받아 내부 서버의 접속을 대신하는 하는 서버를 revservse proxy 라고 한다. 접속 장소의 정확한 위치를 감추거나, 통신 데이터를 필터링(filtering)할 수 있는 잇점이 있다.
import java.util.Calendar; public class DuplicatedCodes { private static long timeInMillis; /** * 정수형 및 실수형 연산 처리 속도를 비교하는 테스트 프로그램 * * @param args */ public static void main(String[] args) { long elapsedTime; timeInMillis = Calendar.getInstance().getTimeInMillis(); int intSum = 0; // 정수형 변수를 100만번 더한다. for (int i = 0; i < 1000000; i++) { intSum += 100; } elapsedTime = Calendar.getInstance().getTimeInMillis() - timeInMillis; System.out.println("정수형 : " + elapsedTime + "밀리초"); timeInMillis = Calendar.getInstance().getTimeInMillis(); float floatSum = 0; // 실수형 변수를 100만번 더한다. for (int i = 0; i < 1000000; i++) { floatSum += 100.0; } elapsedTime = Calendar.getInstance().getTimeInMillis() - timeInMillis; System.out.println("실수형 : " + elapsedTime + "밀리초"); } }
눈에 잘 띄는 중복 코드는 아래와 같다.
elapsedTime = Calendar.getInstance().getTimeInMillis() - timeInMillis;
리팩토링을 실시하기 전에 '중복된 코드를 리팩토링 해야 하는 이유는 무엇인가?' 라는 질문에 답해보자.
중복된 코드를 리팩토링하는 것은 다음과 같은 장점을 가지고 있다.
반면에 다음과 같은 단점도 있다. (과유불급, 지나치면 모자르니만 못하다.)
중복된 코드를 제거하는 방법은 반복적인 코드 블럭을 함수(function or method)로 변경하는 것이다.
앞서 제시한 예제에서 중복된 코드를 리팩토링한 결과는 다음과 같다.
import java.util.Calendar; public class DuplicatedCodes { private static long timeInMillis; /** * 정수형 및 실수형 연산 처리 속도를 비교하는 테스트 프로그램 * * @param args */ public static void main(String[] args) { timeInMillis = Calendar.getInstance().getTimeInMillis(); int intSum = 0; // 정수형 변수를 100만번 더한다. for (int i = 0; i < 1000000; i++) { intSum += 100; } System.out.println("정수형 : " + calcElapseTime() + "밀리초"); float floatSum = 0; // 실수형 변수를 100만번 더한다. for (int i = 0; i < 1000000; i++) { floatSum += 100.0; } System.out.println("실수형 : " + calcElapseTime() + "밀리초"); } /** * 경과 시간을 계산한다. * * @return 경과된 시간을 밀리초(millseconds) 단위로 반환한다. */ private static long calcElapseTime() { long currentTimeMillis = Calendar.getInstance().getTimeInMillis(); long elapsedTime = currentTimeMillis - timeInMillis; timeInMillis = currentTimeMillis; return elapsedTime; } }
위와 같이 코드를 변경했을 때, 어떤 효과를 기대할 수 있을까? 혹은 무엇이 좋아진 것일까?