반응형

오늘은 심심해서 애들도 가르킬겸 용어정리에 대해서 고민하는 시간을 가졌다.

자바의 리팩토링(refactoring) 용어에 대해서 이해하고 샘플 코드를 통해 좀 더 자세히 알아 보도록 하자.


자바에서 리팩토링이란? (사전적 의미)

리팩토링은 SW의 구조 또는 로직을 변경하여 기존 코드 대비 더 이해하기 쉽고 유지보수하기 편리하게 만드는 행위를 말합니다.

즉, 새로 만드는 신규 코드에 대해서는 해당 용어가 적합하지 않고 유지보수 또는 고도화 프로젝트에서 기존에 짜여진 코드를 수정할 때 보다 더 깔끔하게 만드는 것을 리팩토링이라고 한다.

그럼 리팩토링을 왜 할까?
(개인적인 생각)

1) 코드가 매우 더티할 경우 : 가독성이 너무 낮아서 겨우 이해했어도 다음번호 또 봐도 이해 안갈때 깔끔하게 만든다.

2) 불필요하게 너무 길 경우 : 라인을 줄여서 가독성을 높이는게 좋은데 OOP 관점으로 짜지 않고 C처럼 짰을때 이다.

3) 좋은 메소드가 나왔을 경우 : JDK가 버전 업되면서 Deprecated 되거나 기존의 로직을 대체할 수 있는 메소드가 나온 경우

4) 업무 확장을 위해 재사용 할 경우 : 기존에 특정 프로세스에 국한되어 쓰던 로직이 재사용이 빈번하게 이루어 져야 하는 경우 분리작업을 할 수 있음.

자 그럼 예제를 한번 들어서 확인 해볼까?? 

public class Calculator {
    public int add(int num1, int num2) {
        return num1 + num2;
    }

    public int subtract(int num1, int num2) {
        return num1 - num2;
    }

    public int multiply(int num1, int num2) {
        return num1 * num2;
    }

    public int divide(int num1, int num2) {
        if (num2 != 0) {
            return num1 / num2;
        } else {
            System.out.println("Cannot divide by zero!");
            return 0;
        }
    }
}

위 코드를 보자.  divide 메소드에서 num2 변수가 0인지 아닌지 비교하는것은 로직으로는 크게 문제 없다. 근데 좀 더티할 뿐만 아니라 저렇게 비교하는 로직이 다른 기능에도 많다고 가정 한다면?? 

public class Calculator {
    public int add(int num1, int num2) {
        return num1 + num2;
    }

    public int subtract(int num1, int num2) {
        return num1 - num2;
    }

    public int multiply(int num1, int num2) {
        return num1 * num2;
    }

    public int divide(int num1, int num2) {
        if (isNotZero(num2)) {
            return num1 / num2;
        } else {
            handleDivideByZero();
            return 0;
        }
    }

    private boolean isNotZero(int num) {
        return num != 0;
    }

    private void handleDivideByZero() {
        System.out.println("Cannot divide by zero!");
    }
}

위 처럼 isNotZero와 hadleDivideByZero 메소드를 구현해서 재사용 가능하게끔 하는 것이다.

대략 이해 가셨나용?

리팩토링은 정답이 없습니다. 단지... 리팩토링을 하는 대상의 실력이 정답입니다.

 

끝~

반응형
반응형

오라클 Java가 유료가 되었다는 말은 상당히 오래전 부터 거론되었던 말입니다.

요즘에는 OPENJDK 를 많이 사용하고 있으며 , 레거시 시스템은 JDK1.8이하로 타 사이트에서 많이 사용하고 있기 때문에 라이센스 규정에 대해서 명확히 알아볼 필요가 있습니다.

오라클은 두 가지 버전의 Java(Oracle JDKOracle OpenJDK)를 제공합니다. Oracle JDK(Java Development Kit)는 상용 제품이며 사업용으로 제품에 탑재하여 사용하려면 라이센스가 필요합니다. 반면에 Oracle 오픈JDK는 자바 SE 플랫폼의 무료 오픈 소스 입니다.

제품으로써 Oracle JDK를 사용하는 경우 Oracle에서 라이센스를 구입해야 합니다. 그러나 개발 및 테스트 목적으로 오라클 JDK를 무료로 사용할 수 있습니다. Oracle은 Oracle JDK를 개발 및 테스트에서 무료로 사용할 수 있는 Oracle Java SE용 Oracle Technology Network License Agreement라는 별도의 라이센스를 제공합니다.

오라클 OpenJDK를 사용하는 경우 자유-오픈 소스 라이선스인 GNU GPL(General Public License)로 출시되므로 어떤 목적으로든 라이선스를 구입할 필요가 없습니다.

OpenJDK, Adapt OpenJDK과 같은 자바 SE 플랫폼의 다양한 무료 오픈소스 상품있다는 것도 알아두기 바란다.



공식 OpenJDK : OpenJDK 프로젝트에서 제공하는 OpenJDK의 공식 빌드입니다. 이들은 오라클에 의해 출시되며 자바 SE 플랫폼의 참조 구현이다.

타사 OpenJDK : 타사 공급업체, 조직 또는 개인이 만들고 유지 관리하는 OpenJDK 입니다. 타사 OpenJDK 의 몇 가지 예로는 AdoptOpenJDK, Amazon Corretto, and Red Hat OpenJDK 가 있습니다.

Customized OpenJDK : 조직 또는 개인이 특정 요구 사항을 충족하도록 사용자 정의하거나 수정한 OpenJDK 입니다. Customized OpenJDK에는 추가 기능, 최적화 또는 버그 수정이 포함될 수 있습니다. 크게 안정적인 제품은 아닙니다.

LTS OpenJDK : 이러한 빌드는 오랜 기간동안 유지보수가 지원되는 OpenJDK 빌드입니다. LTS 빌드는 안정적이고 안정적인 릴리스가 필요한 엔터프라이즈 및 프로덕션 사용 사례에 적합합니다.

이러한 유형의 OpenJDK마다 릴리스 일정, 지원 정책 및 라이센스 조건이 다를 수 있습니다. 각 빌드의 특성을 이해하고 요구 사항에 가장 적합한 것을 선택하는 것이 중요합니다.

반응형
반응형

웹 취약점 점검을 위해서 OWASP ZAP 프로그램을 설치하려고 하면 아래와 같은 에러가 뜹니다.

위와 같은 에러의 해결법을 찾아보도록 하겠습니다.

"The install4j wizard could not find a Java (TM) Runtime Environment" 오류 메시지는 실행하려는 설치 프로그램이 시스템에 JRE(Java Runtime Environment)를 설치해야 하지만 찾을 수 없음을 의미합니다.

이 문제를 해결하려면 시스템에 JRE를 설치해야 합니다. 다음을 수행할 수 있습니다:

JRE가 이미 설치되어 있는지 확인합니다:
Windows의 경우 "제어판"으로 이동하여 설치된 프로그램 목록에서 "Java"를 찾습니다. Mac에서 "시스템 기본 설정"으로 이동한 다음 "Java" 아이콘을 클릭합니다. JRE가 이미 설치되어 있으면 최신 버전인지 확인하고 설치 프로그램을 다시 실행해 보십시오.

JRE 설치:
Oracle 웹 사이트에서 JRE의 최신 버전을 다운로드할 수 있습니다. 운영 체제(Windows 또는 Mac) 및 아키텍처(32비트 또는 64비트)에 맞는 올바른 버전을 다운로드해야 합니다. JRE를 다운로드했으면 설치 관리자를 실행하고 지침에 따라 설치합니다.

JAVA_를 설정합니다HOME 환경 변수:
JRE를 설치한 후 JAVA_를 설정해야 할 수도 있습니다JRE의 위치를 가리키는 HOME 환경 변수. 이렇게 하려면 다음 단계를 수행하십시오:

Windows의 경우: 제어판으로 이동한 다음 "시스템 및 보안"을 클릭하고 "시스템"을 클릭합니다. 왼쪽의 "고급 시스템 설정"을 클릭한 다음 "환경 변수" 버튼을 클릭합니다. 시스템 변수에서 "새로 만들기"를 클릭하고 변수 이름으로 "JAVA_HOME"을 입력하고 변수 값으로 JRE 설치 경로를 입력합니다.



 

 

반응형
반응형

Spring 3.0 기반의 MVC 에서는 여러가지 Resolver를 통해서 각 페이지를

 

호출할 수 있도록 지원해주고 있다. 하지만, Resolver를 2개 이상 사용하기 위해서는

 

여러가지 번거로움이 있다. 특히 eGov (전자정부 F/W)을 활용하여 개발하였을때에는

 

Mulit Resolver를 구현하기 위해서는 별도 Java파일로 Custom Resolver를 구현해주어야 한다.

 

(1) Multi Resolver를 구현하기 위해 별도 Java File 생성함.

package com.bizdebn.common.resolver;

import java.util.Locale;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.view.AbstractUrlBasedView;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

/**
 * <pre>
 *   CustomViewResolver 구현체 Class
 *   UrlBasedViewResolver 에서는 특정 surfix에 매칭되는 URL Pattern이 아니면 Exception을 발생하는 문제가 있음.
 *   다중 View Resolver를 구현하기 위해서 Exception이 아닌 null을 반환하여 p:order값에 따른 여러
 *   ViewResolver를 호출할 수 있도록 Customizing함.
 * </pre>
 *
 * @author sungrangkong
 * @since 2013. 10. 16.
 * @version 1.0
 */
public class CustomViewResolver extends UrlBasedViewResolver implements Ordered {

 /**
  * <pre>
  * UrlBasedViewResolver의 loadView 를 오버라이딩 함.
  * 기존 loadView에서는 surfix의 확장자에 매칭되는 URL이 없으면 Exception 호출하기 때문에
  * 타 Resolver가 호출되지 않음. 따라서, null을 리턴하도록 수정함.
  *
  * 해당 코딩기법은 e-gov framework Q&A 에서 권고하는 사항을 확인함.
  * </pre>
  *
  * @author sungrangkong
  * @since 2013. 10. 16
  * @version 1.0
  */
 protected View loadView(String viewName, Locale locale) throws Exception {
  AbstractUrlBasedView view = buildView(viewName);
  View viewObj = (View) getApplicationContext().getAutowireCapableBeanFactory().initializeBean(view, viewName);
  if (viewObj instanceof JstlView) {
   JstlView jv = (JstlView) viewObj;
   if (jv.getBeanName().indexOf(".jsp") != -1) {
    return null;
   }
  }
  return viewObj;
 }
} 

 

설명 : 위코드를 보고 잠시 설명하도록 하자. 기존에 eGov에서 많이 사용하는 UrlBasedViewResolver는

InternalResourceViewResolver 를 상속받아 구현한 Resolver이다.

InternalResourceViewResolver의 특징은 만약 prefix와 surfix에 매칭되는 URL이 아닌경우에는 Exception

을 발생시키게 된다. 이러한 문제때문에 multi resolver를 선언하였을 경우에는 우선순위에 따라 아래의

Resolver가 실행이 안되는 문제점이 발생된다. 위 소스에서는 Exception을 발생시키는 해당 메소드인

loadView 메소드를 단순 null값을 반환하는 로직으로 오버라딩 한 것이다.

 

(2) Spring MVC 설정파일 수정

  <!-- CustomView Resolver 설정(다중View를 사용하기 위해, 확장자가 JSP인경우 NULL을 리턴하도록 구현함) -->
    <bean class="com.bizdebn.common.resolver.CustomViewResolver" p:order="1"
      p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
    
<!-- UrlBasedViewResolver 설정(확장자가 html인 데이터도 보여줄 수 있도록 다중 뷰 구현함) -->  
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2"
      p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/jsp/" p:suffix=".html"/>

 

설명 : 위 설정파일을 보게 되면 우선순위 값인 p:order 값이 1인 CustomViewResolver가 먼저 동작하게 된다.

만약 매칭되는게 없다면 (1) 에서 오버라딩한 메소드 내부에서 null을 반환하기 때문에 p:order가 2인 UrlBasedViewResolver

가 구동되게 된다.

 

 

실제 삼성에서 만든 Anyframework 또한, 위와 같은 작업을 해주어야 한다고 guide에 나와있는것을 확인하였다.

eGov또한 Q&A게시판을 통해 조회한 결과 위와 같은 작업을 해주어야 한다고 한다.

 

Spring MVC가 편한건 사실이지만, 저러한 잡다한 설정으로 인해 결국, Struts2로 마음이 가게되는게 사실이다.

 

그럼 이상 랑이의 공부는 끝!!

 

 

- 2013.10.20 밤에 공부중인 랑이의 글 -

반응형

+ Recent posts