예외처리 관련 참고문서

http://www.nextree.co.kr/p3239/

'JAVA' 카테고리의 다른 글

로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
system32와 systemWOW64  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

로깅(Logging) 관련 참고문서


http://www.nextree.co.kr/p5584/

'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
system32와 systemWOW64  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

프로젝트에서 개발을 하던 중 내가 알던 for문과는 다른 형태의 for문을 쓰는 소스를 보았다.

처음 봤을 땐 역할이 약간 다른 for 문인가 싶었는데, 차장님이 보시더니 성능면에서 좀 더 향상된 for문이라고 알려주셨다.


자세히 알아보기 위해 정리해보았다.


# JAVA - For 문


1. 기존 For문 

   

    - for(초기화; 조건; 증감)

    

for(int i=0; i <100 ; i++) {

     .... 반복 수행 할 로직

 }    



2. 배열에 이용되는 For문 


    - for(변수타입 변수 : 배열)

    - Java 1.5 부터 향상된 for문 제공

    - 배열에 들어있는 값들을 하나씩 왼쪽 변수에 할당한다. 

    - 단, 배열의 자료형과 변수의 타입이 같아야 한다. 

    - 기존 for 문 처럼 조건문으로 size를 주지 않아도, 알아서 배열 크기 만큼 for문을 수행한다. 또, 기존처럼 반복 변수를 따로 선언해줄 필요도 없다.

    - 단, 배열의 값을 가져다 쓸 수 만 있고, 수정해 쓸 수는 없다.

    - 아래 예시는 array 배열 데이터를 object에 담아 insert 쿼리를 수행하는 소스다. 


for (Object object : array) {

mapDao.update("groupId.artifactId.context.mapper.tb_insert", (Map) object);

 }



    - 실제로 향상된 for문이 항상 성능이 더 좋은 것은 아니다. 때에 따라 기존 for문의 속도가 더 빠른 경우도 있다. 

      통상 반복 횟수가 많을 수록 향상된 for문의 성능이 더 좋다고 하지만, 그 정도는 정말 미세한 차이라고 하니 사용하기 쉽고, 가독성이 더 좋은 for문으       로 선택하는게 좋을 것같다.

      


__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
system32와 systemWOW64  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

차장님과 SAP Jco 관련 에러를 해결하다가 systemWOW64 폴더를 처음 보게되었다.

system32는 종종 봐왔지만, systemWOW64는 정말 처음 보는 애였다. ㅎㅎ 


겉보기에는 이름 그대로 systemWOW64는 64bit 프로세스를 처리할 것 같고, system32는 32bit 용을 처리할 것 같아 보였다.

하지만 실은 그 반대라고 차장님이 설명해주셔서 따로 적어놓았다가 이렇게 정리해둔다.


# System32 와 SystemWOW64 차이


64bit Windows 운영체제에서 파일을 위치시킬 때, 

64bit용 DLL은 system32에, 32bit용 DLL은 systemWOW64에 위치시킨다.

(C:\Windows\System32, C:\Windows\System32)


왜 헷갈리게 이렇게 교차로 match되어 들어갈까?? 


궁금해서 그 이유를 찾아보다가 MS에서 naming 쪽을 담당했던 직원의 인터뷰 자료를 찾게 되었다.

이름 안에 WOW가 들어가는 것도 정말 WOW 였다.....ㅎㅎ


—And what about System32 is that yours?

—Yep. I thought, "these files are 32 bit files. So I'll put them here."

—And that was pretty successful?

—Yes. I did such a good job naming it System32, that nowadays it contains all the 64 bit files as well.

—Then what happens to the 32 bit version of the 64 bit files. Where do they go?

—Well they can't go in System32, because on a 64 bit machine, System32 is where the 64 bit files go. So if we're running a 32 bit executable we lie to the executable and tell it that "System32" points at another folder, called SysWOW64 and that's where we stick the 32 bit files.

—Why is there a 'WOW' in the middle of the name?

—I was typing System64 and half way through I just thought: "WOW, nature is beautiful!"

—And the 32 bit files, they go in SysWOW64, since the 64 bit files are in System32?

        —Yep. (Laughing) Oh I took a lot of meth that day, my friend. 



이와 마찬가지로 Program Files(x86) 폴더도 32bit 용 파일들이 위치하는 곳이다.  그냥 Program Files 폴더에는 64bit 용 파일들이 위치하고 ㅎㅎ



예전에는 정말 폴더들도 아무 생각없이 봤었는데 요새는 한 번씩 생각하게 된다 ㅎㅎ 

얘는 무슨 역할을 하는 애지?? 



많이 궁금해하고, 많이 배워야지 :) 


'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

프로젝트 할 때 SAP 과 연동 작업이 필요해서 이와 관련된 환경을 셋팅했다.

다음에 또 같은 환경을 쓸 때 참고하려고 sap jco 연동 방법 정리해 둔다~~


1. SAP Jco란?


   - Java에서 SAP을 연동하여 시스템을 구축할 때 사용되는 SAP JAVA Connector.

   - Java에서 SAP의 데이터를 가져오기 위해 SAP Jco 사용



2. 필요 파일


   - sapjco.jar

   - sapjco.dll



3. 환경 셋팅


    ** 주의: sapjco 관련 파일은 사용자의 OS 환경에 맞게 다운받아 설치해야 한다. 32bit 환경인데 64bit용 jco 파일을 설치하면 당연히 에러 ^^


   (1) sapjco.dll 파일을 C 드라이브 > Windows > System32 아래로 넣어준다. 




   (2) sapjco.jar 파일은 maven 사용 시, pom 파일에 추가해주고 

       maven 사용하지 않는 경우,  프로젝트 우클릭 > properties > Java build path > libraries > add external jars 해서 추가해주면 된다.

       (아래 사진 systemPath 태그에는 로컬 파일 경로를 명시해주었다)



      --> maven 사용 시 중앙 리파지토리에 sapjco3.jar 파일을 등록하여 받아 쓰는 것도 가능하지만,

           그렇게 설정하면 sapjco3.jar 파일에 버전정보가 붙은채로 땡겨오게 되고, 버전정보가 붙으면 maven build 시 jar 파일을

           정상적으로 인식하지 못하는 에러가 발생했다. 그래서 우선 maven build 시 로컬 경로로부터 jar파일을 가져다 쓸 수 있도록

           설정하여 사용했다.



 (3) SAP 연결 정보 설정


     - 내가 한 프로젝트의 경우 연결할 SAP 서버 정보를 properties 파일에서 관리했다.

       properties 파일에는 아래와 같은 정보가 필요하다.


 sap.client =

 sap.host = 

 sap.language = ko

 sap.systemnumber =

 sap.user =                ....접속 계정 정보

 sap.password =           ....접속 계정 정보


 #connection pool 설정

 sap.pool.capacity =        ....허용 pool 갯수

 sap.pool.limit =           ....최대 허용 pool 갯수



    - context-common.xml 파일 내 위에 설정한 properties 파일에 대한 설정을 해주었다.

<util:properties id="globalProperties"

location="classpath:/property/global_test.properties" />              // global_test.properties 라는 파일에 sap 연결정보를 설정


<!-- Properties 초기화 -->

<bean class="groupdId.artifactId.cmm.sapjco.JcoConnection">                // 위의 globalProperties 파일을 참고하여 JcoConnection class 초기화

<constructor-arg>

<ref bean="globalProperties" />

</constructor-arg>

</bean> 


 



(4) SAP 연결 정보 및 connection 얻기


     - Properties 클래스는 HashTable<Object, Object> class 를 확장하고 있는 클래스로, key, value 형태의 properties 값들을 받는 역할을 한다.

     - properties 파일에 정의해 놓았던 sap 연결 정보들을 key, value 형태로 Properties 클래스에 셋팅해준다.

     - 앞에서 초기화 했던 JcoConnection class에서 globalProperties 파일을 통해 sap 연결정보 get!


 public JcoConnection(Properties jcoProperties)

    {

    try

    {

    Properties connectProperties = new Properties();

   

    connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, jcoProperties.getProperty("sap.host"));

    connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, jcoProperties.getProperty("sap.systemnumber"));

    connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, jcoProperties.getProperty("sap.client"));

    connectProperties.setProperty(DestinationDataProvider.JCO_USER, jcoProperties.getProperty("sap.user"));

    connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, jcoProperties.getProperty("sap.password"));

    connectProperties.setProperty(DestinationDataProvider.JCO_LANG, jcoProperties.getProperty("sap.language"));

    connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, jcoProperties.getProperty("sap.pool.capacity"));

    connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, jcoProperties.getProperty("sap.pool.limit"));

   

    File destCfg = new File(jcoProperties.getProperty("sap.host")+".jcoDestination");


    FileOutputStream fos = new FileOutputStream(destCfg, false);

    connectProperties.store(fos, "for tests only !");

    fos.close();

   

    destination = JCoDestinationManager.getDestination(jcoProperties.getProperty("sap.host"));

                repository = destination.getRepository();

            

    }catch (Exception e)

    {

    // 

    }

    } 



       

(5) RFC Function 얻기

     - SAP으로부터 필요한 데이터를 주고받기 위해 SAP에서 제공하는 함수를 가져온다.


 public JCoFunction getFunction(String functionStr) {

JCoFunction function = null;

try {

function = repository.getFunction(functionStr);

} catch (Exception e) {

throw new RuntimeException("Problem retrieving JCO.Function object.");

}

if (function == null) {

throw new RuntimeException("Not possible to receive function. ");

}


return function;

}

    



(6) RFC Function 실행


public void execute(JCoFunction function) {

try {

JCoContext.begin(destination);

function.execute(destination);

} catch (JCoException e) {

//

} finally {

            try {

                JCoContext.end(destination);

            } catch (JCoException e) {

               //

            }

        }




(7) 서버 기동 시 SAP 연동 


    + 연동 관련 로그 정보 추후 추가 예정




__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.



'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
system32와 systemWOW64  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

Eclipse 설치 후, 최적화를 위하여 eclipse.ini 파일을 수정하려 한다.


eclipse 툴을 다운로드 받으면 찾을 수 있는 eclipse.ini 파일은 eclipse 툴 구동 시 읽어들이는 초기 설정 내역이 담겨 있는 파일이다.


현재 사용하고 있는 eclipse.ini 파일 내 설정은 아래와 같다.


  1  #C:\Sample\jdk\jdk170_79\jre\bin\server\jvm.dll

  2  -vm

  3  C:/Sample/jdk/jdk170_79/bin/javaw.exe

  4  -vmargs

  5  -Dosgi.requiredJavaVersion=1.7

  6  -Xverify:none

  7  -XX:+UseParallelGC

  8  -XX:-UseConcMarkSweepGC

  9  -XX:+AggressiveOpts

 10  -XX:PermSize=256M

 11  -XX:MaxPermSize=256M

 12  -XX:MaxNewSize=256M

 13  -XX:NewSize=256M

 14  -Xms1024m

 15  -Xmx1024m

 16  -Dfile.encoding=UTF-8

 17  -Duser.name=wonnyyyy



각 라인 별 설정 내역을 짚고 넘어가려한다. 나중에 이 부분 설정을 건드려야 할 때 꼭 도움이 되길! ㅎ_ㅎ


1) #C:\Sample\jdk\jdk170_79\jre\bin\server\jvm.dll

      - 우선 1번 라인 설정은 주석처리 되어 있는 상태인데, 3번 설정을 통해 JVM을 찾을 수 없을 때 1번 설정을 사용한다. 

      - 이클립스 시작 중 "Java was started but returned exit code=1" 에러가 발생하는 경우, -vm 옵션의 value 값을 1번과 같이 바꿔준다. (path to jvm.dll)

        (차장님이 3번 설정이 바라보는 곳이 결국 1번이라고 하셨는데, 시간날 때 한 번 찾아서 정리해봐야겠다.)



2)  -vm

    C:/Sample/jdk/jdk170_79/bin/javaw.exe

      - 2~3번 라인에서는 -vm 옵션을 통해 eclipse가 사용할 JDK 경로를 설정한다. 

      - '-vm' 옵션과 그의 value 값인 path는 별도 라인에 명시되어야 한다. 

      - value 값인 path는 Java home 디렉토리가 아니라, Java executable 까지에 대한 path를 명시해주어야 한다.(exact path to javaw.exe)

      - '-vm' 옵션은 '-vmargs' 옵션보다 먼저 수행된다. ('-vmargs' 옵션이 수행된 후에는 바로 JVM이 실행된다)

      - 당연한거지만, 32bit 용 eclipse.exe에서는 32bit 용 JVM 이 사용되어야 하고, 64bit 용 eclipse.exe에서는 64bit용 JVM이 사용되어야 한다. 

  

3) -vmargs

    -Dosgi.requiredJavaVersion=1.7 

      - 4번 라인에서는 해당 eclipse 실행을 위한 최소 Java 버전을 명시하고 있다. (eclipse 툴 버전별로 최소 요구 Java 버전 확인 할 것)

      - 참고로 '-vmargs' 옵션은 JVM의 operation을 커스터마이징 하기 위한 설정이다. 설정 옵션들 중 가장 마지막에 오게 하기.


4) -Xverify:none

      - 초기 구동 시 클래스의 유효성 검사를 skip 하겠다는 뜻. 구동 시간이 빨라진다.


5) -XX:+UseParallelGC

      - 병렬 GC 사용 설정. 병렬 처리로 인한 처리 속도 향상. 


6)  -XX:-UseConcMarkSweepGC

      - 병행 Mark sweep GC 수행을 통해 이클립스 GUI 의 응답속도 향상. (mark sweep GC는 GC 수행 방법 중 하나..자세한 설명은 별도 검색)


7)  -XX:+AggressiveOpts

      - 컴파일러의 소수점 최적화 기능 설정....이라는데 무슨말인지 잘 이해가 안된다.


8)  -XX:PermSize=256M

      - permanent generation의 크기 설정. 즉, 클래스와 메서드를 위한 공간. JDK 7 기준, permanent generation 공간은 GC가 일어나지 않는다.


9)  -XX:MaxPermSize=256M

      - permanent generation의 최대 크기 설정(클래스와 메서드를 위한 공간). OOM 발생 시 이부분을 늘려주는 것을 권장. 메모리의 최소와 최대 값을

        같게 설정하면 힙메모리 영역의 변경이 없어 속도를 향상시킬 수 있다. 


10) -XX:MaxNewSize=256M

     -XX:NewSize=256M

        - new generation의 크기 설정. 즉, 새로 생성되는 객체들을 위한 공간. 어플리케이션 내 새로 생성되는 객체들은 주로 생성 후 얼마 지나지 않아

          사용하지 않게 되는 경우가 많다. 때문의 new generation 영역의 크기가 너무 크면 GC 호출이 잘 일어나지 않으며, 호출 시간도 오래 걸리게 된다.

          사이즈 조절 주의!


11) -Xms1024m

     -Xmx1024m

        - Xms는 eclipse가 사용하는 최소 heap memory 크기

        - Xmx는 eclipse가 사용하는 최대 heap memory 크기 

        - 메모리의 최소와 최대 값을 같게 설정하면 힙메모리 영역의 변경이 없어 속도를 향상시킬 수 있다. 

        - heap size를 1024m 로 설정하면, eclipse가 컴퓨터 상의 메모리 중 1024m를 자기 영역으로 확보하므로, 다른 작업들을 하고 있을 경우,

          메모리가 부족할 수 있다.  상황에 따라 메모리 크기를 적절하게 설정해주어야 한다.

        - 권장 사이즈

            1G 이하 메모리의 컴퓨터: -Xms256m -Xmx256m

            2G ~ 3G 메모리의 컴퓨터: -Xms512m -Xmx512m

            4G 이상 메모리의 컴퓨터: -Xms1024m -Xmx1024m



12) -Dfile.encoding=UTF-8

        - JVM을 통한 입출력으로 변환되는 데이터는 이 옵션을 통해 지정된 언어로 인코딩 된다. 위의 설정과 같이 UTF-8로 지정하면

          명시적으로 UTF-8 charset을 사용하게 된다.    

        - eclipse에서 다루는 파일들의 기본 문자셋 지정하는 옵션



** 설정 완료 후, eclipse 에서 window > preferences > general > show heap status 클릭하면 eclipse 우측 하단에서 

    ini 파일에서 설정했던 heap size를 확인할 수 있다.





이 설정파일 내용을 정리하다보니 JVM 메모리 구조를 정확히 알아놔야겠다는 생각이 든다.. 다음에 정리해놔야지 이부분!


__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


  - http://androidhuman.com/514

  - https://wiki.eclipse.org/Eclipse.ini

  - http://differentcolor.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-STS-%EC%84%A4%EC%A0%95



▶ 리팩토링(Refactoring) 


1. refactoring 이란?

     * 리팩토링은 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법으로, 소프트웨어 시스템을 변경하는 프로세스다.

     * 디자인을 먼저 한 후 코드를 만드는 것이 아니라 일단 돌아가는 코드를 작성하고, 그 후에 그 코드가 더 좋은 구성을 갖도록 바꾼다는 것.

     * 여러 곳에 산재된 중복 코드 정리 

     

 2. refactoring 하는 이유?

     * 코드 간결성 및 가독성 증대

     * 무엇인가 소스의 변경이 필요할 때(기능 추가나 삭제,수정 작업이 일어날 때) 소스의 리팩토링은 포장이사처럼 편하게 작업하도록 도와준다.

     * 리팩토링은 소스의 중복된 부분을 모듈화 시켜준다. 모듈화는 입출력이 명확하기 때문에 이식성을 높여준다. 

     * 리팩토링을 통해 시스템 복잡도를 줄일 수 있다. 

     

 3. 활용

     * coffeeList 조회 결과 coffee1 값이면 아메리카노, coffee2 값이면 카페라떼를 반환해주는 로직

     * 기존: OriginalImpl.java 클래스 내 메소드 selectMenuList(), selectMenu(), updateMenu() 등에 소스 반복

     * 활용: 여러 메소드 내에 반복되는 소스를 리팩토링 하여 하나의 메소드로 생성(convertCoffee(resultMap))

                            

@Service("originalService")

public class OriginalImpl implements OriginalService {


    public static final String AMERICANO = "coffee1";

    public static final String CAFELATTE= "coffee2";

    public static final String AMERICANO_VAL = "아메리카노";

    public static final String CAFELATTE_VAL= "카페라떼";

    

    // 메뉴리스트 조회

    public List<Map<Stirng, Object>> selectMenuList() throws Exception {

   

        ......


        List<Map<Stirng, Object>> resultList= originalDaoImpl.selectMenuList();

        String coffee= resultList .get("coffee").toString();

        

        if(coffee.equalsIgnoreCase(AMERICANO)) {

            coffee = AMERICANO_VAL;

        } else if (coffee.equalsIgnoreCase(CAFELATTE)) {

            coffee = CAFELATTE_VAL;

        } else {

            throw new DataFormatException(); 

        }


        resultList.put("coffee", coffee);


        ......


    }

      

    // 메뉴 조회

    public Map<String,Object> selectCoffee() throws Exception {


        ......

     

     Map<String,Object> resultMap =  originalDaoImpl.selectMenu();


     String coffee= resultMap .get("coffee").toString();

         

        if(coffee.equalsIgnoreCase(AMERICANO)) {

            coffee = AMERICANO_VAL;

        } else if (coffee.equalsIgnoreCase(CAFELATTE)) {

            coffee = CAFELATTE_VAL;

        } else {

            throw new DataFormatException(); 

        }


        resultList.put("coffee", coffee);


        ......


    }



   // 메뉴 업데이트

    public Map<Stirng, Object> updateMenu() throws Exception {

         ......


     // 메뉴 업데이트 후 메뉴 조회 서비스 (업데이트 반영)

     Map<String,Object> resultMap =  originalDaoImpl.selectMenu();


     String coffee= resultMap .get("coffee").toString();

         

        if(coffee.equalsIgnoreCase(AMERICANO)) {

            coffee = AMERICANO_VAL;

        } else if (coffee.equalsIgnoreCase(CAFELATTE)) {

            coffee = CAFELATTE_VAL;

        } else {

            throw new DataFormatException(); 

        }


        resultList.put("coffee", coffee);


        ......


   }



위의 코드에 주황색으로 표시 된 부분이 여러 method에서 반복되고 있는 소스다. 


반복되는 소스는 시스템 복잡도를 높일 뿐만 아니라 소스에 변경사항이 발생하는 경우 해당 소스를 포함하고 있는 각 메소드 마다

일일이 수정해줘야하는 번거로움이 생긴다. 


이러한 문제를 해결하기 위해 아래와 같이 리팩토링을 한다.


   * 반복되는 소스 전체 선택 후 우클릭 > Refactor > Extract Method 선택

   * Method 명 설정









 // extract method 결과 - convertCoffee(Map<String, Object> resultMap) 생성

   private void convertCoffee(Map<String, Object> resultMap) throws DataFormatException {

       String coffee= resultMap .get("coffee").toString();

     

       if(coffee.equalsIgnoreCase(AMERICANO)) {

     coffee = AMERICANO_VAL;

} else if (coffee.equalsIgnoreCase(CAFELATTE)) {

             coffee = CAFELATTE_VAL;

        } else {

     throw new DataFormatException(); 

}


        resultMap.put("coffee", coffee);

 } 



 // 메뉴리스트 조회

    public List<Map<Stirng, Object>> selectMenuList() throws Exception {

        ......


        List<Map<Stirng, Object>> resultList= originalDaoImpl.selectMenuList();

        resultList = convertCoffee(resultList);

        ......

   }



// 메뉴 조회

   public Map<String,Object> selectCoffee() throws Exception {

        ......

     

       Map<String,Object> resultMap = originalDaoImpl.selectMenu();

       resultMap = convertCoffee(resultMap);

        ......

   }



 // 메뉴 업데이트

    public Map<Stirng, Object> updateMenu() throws Exception {

         ......


     // 메뉴 업데이트 후 메뉴 조회 서비스 (업데이트 반영)

     Map<String,Object> resultMap =  originalDaoImpl.selectMenu();

     resultMap = convertCoffee(resultMap);

        ......

   }



convertCoffee 라는 method를 생성함으로써 각 method에서는 얘를 호출하여 coffee 명을 가져올 수 있게 된다.


기존 코드보다 훨씬 간결해진 모습을 확인할 수 있다. (주황색 부분이 파란색 부분으로 변경됨!)


나같은 경우도 처음에는 각 method마다 동일 소스를 계속 반복하여 사용했었다..'재활용성'에 대한 개념이 아예 없었다. 

다행히 리팩토링은 처음부터 적용하려는 의도로 나온 애가 아니라, 소스코드 작성 후 코드 품질 최적화를 위해 

적용할 수 있는 부분에 쓰는 애다. ㅎㅎ  물론 미리 알고 썼더라면, 리팩토링하는 시간도 줄었겠지만.... 앞으로 잘쓰면 되지~~


처음엔 반복되는 코드를 작성했었더라도 이제 리팩토링 개념과 효과를 알았으니 내 코드 최적화를 위해 

리팩토링을 요리조리 잘 써먹어야 겠다. 


이번 포스팅에는 리팩토링의 정말 기본 내용만 담고 있지만, 앞으로 리팩토링 해보면서 좀 더 깊이 있게 쓰게되면

리팩토링 2.0 버전으로 새 글 리포팅해야겠다 :) 


__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.


  - http://belong2jesus.tistory.com/62

  - http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039161606&type=det&re= 

  

'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
system32와 systemWOW64  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26

+ Recent posts