Synchronized로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

Synchronized로 검색한 결과
등록일:2008-06-02 15:31:15
작성자:
제목:좋은 자바 프로그램을 만들기 위해서


좋은 자바 프로그램을 만들기 위해서..

 

자바스터디 네트워크

조대협 (bwcho@javastudy.co.kr)

 

좋은 자바프로그램을 만들기 위해서 라는 기사 의뢰를 받았을 때, 곤란하더군요. 좋은 자바프로그램을 만들어 본적도 없고, 쉽게 보기조차 힘든 데, 좋은 자바프로그램을 만들기 위한 내용을 여러분께 소개하자고 하니 약간 막막한 기분이 없지 않더군요.

 

사실 좋은 프로그래밍을 하기위해서는 몇가지 팁이나 테크닉 보다는, IT 관련 기술의 전반적인 이해와, 함께 정확한 고객 요구사항의 분석과 시스템 설계가 필요합니다. 그 외에 필요한 것이 프로그래밍을 하는데 필요한 몇가지 테크닉이 되겠지요.

 

 오늘의 주제가 좋은 자바 프로그램이기 때문에, 퍼포먼스와 코딩에 관련된 몇가지 테크닉을 소개한 후에, 테크닉 이외에, 자바프로그램에서 뿐 아니라, 모든 프로그래밍을 하는데 필요한 전반적으로 알아둬야할 기반 지식에 대해서 소개하도록 하겠습니다.

 

● 좋은 자바프로그래밍을 하기 위한 기법

좋은 자바프로그래밍을 하기위해서 해야할일이라면 끝이 없겠지만, 오늘은 주로 자바 프로그램의 퍼포먼스에 관련된 내용들을 살펴보도록 하겠습니다.

 

Performance?

보통 Performance를 이야기 하면, 프로그램의 실행 속도를 생각하는 경우가 많습니다. 그러나 Performance는 좀 더 포괄적인 의미로, 대략 아래와 같은 내용들을 포함하고 있습니다.

 

-          계산 속도

-          메모리 사용량

-          Startup Time

-          확장성

-          체감 속도

 

첫번째로 계산속도 란, 우리들이 흔히 이야기하는 Performance를 이야기 합니다. 어떤 작업을 수행하는 데, 실제로 사용되는 CPU 점유율과, CPU 사용시간을 이야기 합니다. 메모리 사용량은, 프로그램이 사용하는 RAM의 사용량을 이야기 합니다.

 

 Startup Time, 체감속도는 사용자 입장에서 봤을 때, 크게 느껴지는데요. Startup Time은 프로그램 시작 버튼을 눌러서, 실제로 프로그램이 실행될 때 까지 걸리는 시간을 이야기 하며, 체감속도는 실제로 사용자가 느끼는 속도를 이야기 합니다. 웹사이트에서 request 버튼을 눌러서부터, response가 떨어질 때 까지의 시간으로, 이런 체감 속도를 줄이기 위해서 많은 테크닉들이 제공이 되고 있습니다.

 

확장성이란, 시스템이 많은 user heavy load 환경 아래서 얼마나 안정적으로 작동하는 가에 대한 이야기입니다. 보통 워드 프로그램을 만들 때, 1~10 page문서에 사용하는 데에는 큰 문제는 없지만, 10,000 page 상당에 해당하는 문서에도 제대로 작동하는가, 또 웹 게시판을 만들 때, 10,000 record 까지는 보통 다 문제없이 작동하지만, 100,000 record 환경에서도, 적당한 response time등을 유지하는가? 등이 이 범주에 속한다고 이야기 할 수 있습니다.

 

 여기까지 대략 Performance가 단지 속도에 대한 이야기가 아니라는 것을 이해하시면 됩니다. 지금부터는 실제로 Performance를 향상 시키기 위한 기법에 대해서 알아보도록 하겠습니다.

 

1) IO Performance 향상 시키기

 

컴퓨터가 작동하는데 있어서, 속도가 가장 많이 소요되는 부분은 전자적인 부분(Electronic Part)보다는 실제로 모터를 구동시키고 움직이는 기계적인 부분 (Mechanical Part)입니다. 이 부분이 우리가 흔히들 이야기 하는 IO 부분입니다. IO 부분의 속도를 향상 시킴으로써, 전체적으로 큰 속도향상을 볼 수 있습니다. Buffered 이용한 속도향상 방법과, transient 키워드를 이용한, Serialization에서의 속도향상을 소개하도록 하겠습니다.

 

1-1) Buffer를 이용한 IO 속도 향상

 

Java에서 IO를 하기 위한 기본적인 클래스로는 java.io.InputStream java.io.OutputStream 두가지가 있습니다. 이 두 클래스를 이용하여 파일을 복사하는 예제를 보도록 하져.

import java.io.*;

 

public class BasicIo{

 

             private void copyby_basic(String src,String des) throws IOException{

                           InputStream in = null;

                           OutputStream out = null;

                          

                           try{

                                        in = new FileInputStream(src);

                                        out = new FileOutputStream(des);

                                        int ch = 0;

                                        while(true){

                                                     ch = in.read();

                                                     if(ch == -1) break;

                                                     out.write(ch);

                                        }// while

                                        in.close();

                                        out.close();

                           }finally{

                                        if(in!=null) in.close();

                                        if(out!=null) out.close();

                           }//try-finally

 

             }// copyby_basic

 

public static void main(String args[]){

             long startTime = 0;

             long endTime = 0;

             //BasicIo bio = null;

            

             try{

                           //bio = new BasicIo();

                     startTime = System.currentTimeMillis();

                          //bio.copyby_basic("dummy.wmv","dummy_basic.wmv");

                          endTime = System.currentTimeMillis();

                          System.out.println("Elapsed time :"+(endTime-startTime));

             }catch(Exception e){e.printStackTrace();}

 

}// main

 

}// class BasicIo

 

가장 원시적인 방법으로 Linux(P-3 1000GHz Dual, 2GB MM,UW HDD 10,000RPM)에서 테스트해본결과 약 5M정도의 파일을 copy하는데, 109749 ms가 소요되었습니다.

단순하게 in=new FileInputStream(src), out = new FileOutputStream(des)에서 BuffredStream을 사용만 해주면, 5794 ms로 줄어듭니다. 20배에 가까운 속도차이가 나게 됩니다.

 거기에 지금은 int block단위로 읽고 있는데, 여러분도 잘 아시다싶이, 하드에는 BLOCK단위로 STREAM이 저장되기 때문에, 일정 BLOCK단위로 읽고 쓰는게 훨씬 속도가 빠릅니다. 고로, int 단위로 읽는 것이 아니라 byte[] buffer단위로 읽도록 소스를 고치면

 

             private void copyby_basic(String src,String des) throws IOException{

                           InputStream in = null;

                           OutputStream out = null;

                           byte[] buffer = new byte[1024]; // 버퍼 선언

                          

                           try{

                                        in = new BufferedInputStream(new FileInputStream(src));

                                        out = new BufferedOutputStream(new FileOutputStream(des));

                                        while(true){

                                                     int read = in.read(buffer); // 버퍼 단위로 읽는다.

                                                     if(read == -1) break;

                                                     out.write(buffer,0,read);

                                       

                                        }// while

                // 아랫 부분 생략

속도는 517 ms, 1/10로 줄어듭니다.

 

내용을 정리해보면,아래 표와 같습니다.

IO 조합

파일 복사 속도 (ms) 5M파일 복사

InputStream/OutputStream

109749

BufferedStream

5794

BufferedStream + buffer

517

일반 IO를 사용하는 것이랑, 버퍼를 사용하는 것이랑 대략 200배에 해당하는 속도 차이가 납니다. 파일크기가 커질 수 록 훨씬 더 큰 차이가 나겠지요? 이제부터는 IO사용하실때 꼬옥 BufferedStream buffer 사용하시는거 잊지 마시기 바랍니다.

 

1-2) transient 사용하기

 

자바의 큰 특징중의 하나는 Serialization을 이용한 객체의 직렬화 입니다. 참 편리한 기능이지만, 그만큼 자원을 많이 먹는 기능이기도 합니다.

특히 객체를 파일로 저장할 때, 저장할 필요가 없는 것까지 Serialization을 이용하면 저장하게 되는데, 저장할 필요가 없는 부분에 transient 선언을 해주면, 그 내용을 serialization이 되지 않습니다. 특히 MVC모델에서 View(Presentation Layer)와 같이 UI에 관련되는 부분은 굳이 파일로 저장할 필요가 없지요. 주로 Model(Data Layer)에 해당하는 데이터 부분만 저장하면 되는데요. 아래 예제를 보고 설명하도록 하져.

 

 

public class StudentObject implements Serializable{

             private String studentId;

             private String studentName;

             private JPanel pannel;

             private JButton btn;

            

             // Constructor

             public StudentObject(String id,String name){

                           this.studentId = id;

                           this.studentName = name;

             }

             : (중략)

}// class StudentObject

 

StudentObject 의 객체를 Serialization해주면, 실제로 쓸떼 없는 UI Class (JPanel,JButton)객체들까지도 같이 파일에 저장이 되어버립니다. 우리는 studentId studentName만 필요하다고 가정해도 말이져, 이런 경우에는 pannel btn 객체는 Serialization 하지 않는다는 것을 알려줄 필요가 있는데, 이때 transient 키워드를 사용하게되구요. Transient 키워드를 사용한 후에는 객체를 file에서 읽어온후에 생성될 때, 그값을 초기화할 수 있도록 도와 줘야 합니다. 아래 StundentTransientObject 클래스를 보면 Constructor 부분과, readObject 부분에, initTransient 메소드를 콜하는게 보이지요? 데이터값이외의 transient 키워드 처리가 되어 있는 데이터들을 초기화 해주는 부분입니다.

 

public class StudentTransientObject implements Serializable{

             private String studentId;

             private String studentName;

             private transient JPanel pannel;

             private transient JButton btn;

            

             // Constructor

             public StudentObject(String id,String name){

                           this.studentId = id;

                           this.studentName = name;

                           initTransient();

             }

            

             void initTransient(){

                           //JPanel JButton을 초기화 한다.

                           : (중략)

             }

            

             void readObject(ObjectInputStream in)

                           throws IOException,ClassNotFoundException

             {

                           in.defaultReadObject();

                           initTransient()

             }

}

 

 

이렇게 transient 처리를 해준 object object 하나로만 큰 차이가 없지만, 이런 객체가 100 1000개가 모였을 경우에는 큰차이가 나는데요. Student Object 100개 생성해본 결과 입니다.

 

Action

No transient

Using transient keyword

Save to file

990 ms

110 ms

Load from file

3,680 ms

1,040ms

File Size

91.7K

1.6K

 

2) 효율적인 메모리 사용하기

 

속도 만큼 중요한 점중의 하나는 메모리 사용량입니다. 만약 SW RAM 사이즈보다 크게 되면, 시스템은 Virtual Memory를 사용하게 될테고, 결국 HDD IO가 발생하게 되어서 속도가 급속도로 떨어지게 됩니다. 좋은 자바프로그램이란, 효율적으로 메모리를 관리해주도록 하게 해줘야 합니다.

 

보통 자바개발자들이 GC (Garbage Collection)을 만능으로 생각하고 계시는 분이 많은데요. GC가 오히려 자바 개발자들의 발목을 잡는 경우가 많습니다. Full GC의 경우에는 시스템이 클 수 록 그 시간이 많이 걸리기 때문에, 외부에서 봤을 때 Full GC중에는 시스템이 정지된 것 처럼 보이는 경우도 있구요. 가끔은 그런 것을 서버가 다운된걸로 착각해서 연동 시스템이 오작동 하는 경우도 종종 있습니다. (Cluster 상에서 node a Full GC중에, 그와 통신하는 node b, node a가 다운된것으로 판단하고, node a와의 통신을 단절 시키는 경우..)

 

또한 GC가 비사용중인 메모리를 모두 수거할 것으로 생각하시는데, 의외로 그렇지 않은 경우가 있습니다. 잘못된 변수 선언으로, 계속해서 객체가 메모리상에 잡혀있어서 결국에는 Memory Leak이 생겨서 시스템 메모리를 무한정으로 잡아먹는 경우가 생기는데, 이를 예방하기 위해서는 객체의 사용이 끝난후에는 아래와 같이 꼬옥 그 객체의 reference null로 지정해주는게 효과적인 GC를 도울 수 있는 길이 됩니다.

 

MyObject obj = new MyObject();

:

:

// 사용이 끝난후

obj = null;

 

GC (Garbage Collection)는 자바프로그래밍을 하는데 제법 중요한 점이 많으니까는 시간을 내서 따로한번 체크해보시는 것이 좋겠군요.

 

2-1) 메모리 사용량 측정

 

자아 그럼 우선, 현재 나의 자바프로그램이 사용하고 있는 메모리 사용량을 측정하는 방법에 대해서 알아보도록 하겠습니다.

 

자바에 java.lang.Runtime 클래스를 이용하면, 현재 사용중인 메모리 양을 쉽게 알 수 있습니다. Runtime.totalMemory() 메소드는 현재 실행중인 자바프로그램을 위해 잡혀있는 heap size이고, Runtime.freeMemory() heap중에서 현재 사용되지 않고 비어있는 메모리양을 나타냅니다.

 고로, Runtime.totalMemory()-Runtime.freeMemory()를 하면 현재 사용중인 Memory HeapSize를 알 수 가 있습니다.

 이 메소드들을 이용하면, 각 단계별로 메모리 사용량이나, 대략적으로, Java Application이 사용하는 Heap size를 측정할 수 있으며, Memory Leak등의 모니터링이 가능합니다.

 

이렇게 Java 프로그램의 대략적인 Heap 사용량이 측정이 되었으면, Java 실행시에, 미리 최소와 최대 Hip Size를 미리 정해줄 수 있는데, 대략 이 프로그램이 32m 정도의 hip 메모리를 사용한다면 java hotspot ms32m mx32m JavaClass 해주면, 실행 처음부터 32m의 메모리를 확보하고 실행이 됩니다. JVM heap size를 줄이거나 늘이는데 드는 시간이나 action이 없어져서 좀더 안정적이고 빠른 실행이 가능하게 됩니다.

 

이렇게 해서 측정해보면, 대부분의 메모리와 시간은 Object,Class,Thread 등을 로딩하는데 사용이 되는데, 이를 각각줄이게 되면, 자바 프로그램의 메모리 사용 효율성을 향상 시킬 수 있습니다.

 

일단 Thread의 경우, DB Connection Pooling 처럼, Thread Pooling하여 재사용함으로써, Loading time등을 효과적으로 control할 수 있습니다만, 일반 개발자가 개발하여 사용하기에는 어렵기 때문에(안정성등에 문제가 많습니다.). 미리 개발되어 있는 코드를 참조하셔서 개발 또는 구입하여 사용하시기 바라며, 여기서는 Object Class에 대해서만 살펴보도록 하겠습니다.

 Class의 메모리 사용량을 줄일것이냐? Object의 메모리 사용량을 줄이느냐를 결정하는데는 중요한 Factor가 있습니다. 프로그램이 Client 소프트웨어냐, Server 소프트웨어냐에 따라 그 사용량이 틀리게 되는데.

 


Server side software


Client side software

 

두 그림을 비교해보도록 하죠. 왼쪽 그림은 서버 프로그램인데, 서버의 경우, 다수의 클라이언트로부터, 접속을 처리하기 때문에, 같은 종류의 Object가 많이 생성이 됩니다. 그러나 클라이언트 프로그램의 경우에는 객체보다는 각 종류의 클래스가 로딩되어야 되기 때문에, 한 클래스에 대한 객체수가, 서버프로그램보다 비교적 적게 됩니다. 그래서, 서버 프로그램쪽에는 Object의 사이즈에, 반대로 클라이언트 프로그램쪽에는 Class Loading에 신경을 쓰는게 좋습니다.

 

2-2) 효과적인 Object Memory 관리

 

효과적인 Object Memory 관리를 하기 위해서는, 일단 가장 좋은 방법으로는 Object에 포함된 데이터 타입을 효율적으로 사용하는데 있습니다.

 

public class IntPoint{

    int x,y,z;

}

public class LongPoint{

 int lx,ly,lz;

}

 

어떤 3차원 좌표값을 저장하기 위한 클래스가 위와 같이 있다고 봅시다. IntPoint Class의 경우 하나의 좌표를 저장하는데 int 3, 12byte의 용량이 소요가 되고, LongPoint Class의 경우 24byte가 소요가 됩니다. 10 Point를 사용하는 3차원 Rendering Program이 있을 때, 1,200,000byte의 메모리가 차이가 나게 됩니다. 단 하나의 데이터 타입으로 한경우인데, 좀더 그 크기나 데이터 양이 늘어나게 되면, 그 차이는 좀더 확연히 나타나게 되겠지요? 대략적인 데이터의 크기를 예측하고, 적절한 데이터 타입을 사용하는 것 부터가, Object Memory size를 줄이는데 큰 도움이 됩니다.

 

각각의 Object 사이즈를 측정하는 방법을 한번 집고 넘어가도록 하지요. 각각의 Object를 재기 위해서는 System.gc();라는 메소드를 사용하면 편리합니다. 아래와 같은 순서로 진행을 하면되는데요.

1.     System.gc(); 를 콜해서, 현재 메모리를 깨끗이 비운다.

2.     Runtime.totalMemory(),freeMemory() 를 이용하여, 현재 메모리 사용량을 구합니다.

3.     Object 사이즈를 재고자 하는 Object new를 이용하여 1,000개 정도 생성합니다.

4.     System.gc();를 콜해서 메모리를 다시 정리합니다.

5.     Runtime.totalMemory(),freeMemory() 를 이용하여, 현재 메모리 사용량을 구합니다.

6.     2에서 구한 메모리크기에 5에서 구한 메모리크기를 뺀후에, 그것을 1,000으로 나누면 한 Object의 메모리 크기를 구하실 수 있습니다.

 

이렇게 객체 사이즈를 측정 해보면 또한 재미있는 사실을 알 수 있는데요. 똑같은 객체라도 JVM Version에 따라서, Object Size가 틀려집니다. javax.swing.JTable Object의 경우 JDK 1.2.2에서 약 26000 byte, JDK 1.3에서는 4000 byte (대략 6배 이상이 차이가 납니다.) 그러니까는 최신 JDK를 사용하는 것도 하나의 방법이 될 수 도 있겠지요? ^^

 

2-3) 효과적인 Class Loading 관리

클래스는 크기를 줄이는 것보다, 로딩 시간을 줄이는 접근이 필요합니다. 불필요한 클래스 로딩을 막고, 적절한 시간에 클래스를 로딩하는 방법이 필요합니다. 워드 프로그램을 생각해보도록 합시다.. doc,hwp,html 문서를 읽을 수 있는 워드 프로그램이 있고, 각각의 doc,html,hwp 를 읽어서 파싱하는 클래스가 크다고 가정합시다.

 

public Document openDocument(Sting filename,String ext){

 if(ext.equals(doc)) return new Document_MSWORD(filename);

 else if(ext.equals(hwp)) return new Document_HWP(filename);

 else if(ext.equals(html)) return new Document_HTML(filename);

}// open Document

 

파일을 오픈하는 로직은 위와 같이 됩니다. , doc 파일만 오픈할때도, hwp,html 파일을 오픈하는 클래스가 로딩되어 버리는 메모리상, 속도상의 낭비가 있게 되지요. 그래서 필요할 때 마다 파일오픈 클래스를 로딩해버리는게 방법이 될 수 있습니다. 동적 클래스로딩 기법을 이용하여, 클래스를 변경하면, 아래와 같이 됩니다.

 

public Document openDocument(Sting filename,String ext){

 if(ext.equals(doc)) return (Document)Class.forName(MSWORDDoc).newInstance();

 else if(ext.equals(hwp)) return (Document)Class.forName(HWPDoc).newInstance();

 else if(ext.equals(html)) return

 (Document)Class.forName(HTMLDoc).newInstance();

}// open Document

이렇게 하면 필요할 때 마다 클래스를 로딩하기 때문에, 메모리 사용은 효율적이지만, 실행중에, 클래스를 로딩해야하는 속도쪽에 trade off가 발생을 하게 되고, 또한 JIT 컴파일러에 의한 속도 최적화를 기대하기가 어렵게 됩니다. 그렇지만 사용빈도가 적은 대형 클래스를 로딩할 때는 매우 유용한 방법이 됩니다.

 

이렇게 덩치가 큰 클래스를 핸들링 하는 것 이외에도, 덩치가 작은 클래스 (예를 들어, EventListener 등등)등의 메모리 사용량과 로딩 타임을 줄이기 위해서는 작은 클래스는 되도록이면 큰 클래스 하나로 통합하는 것이 좋은데, 이는 여러 디자인 패턴들이 많이 나와 있으니 참고하시기 바랍니다. 특히 UI 프로그래밍에서 많은 효과를 기대할 수 있습니다.

 

 이렇게 클래스의 로딩타임등을 최적화할 때, 먼저 각 클래스의 로딩 시점등을 미리 체크해볼 수 가 있는데요. Java vm실행시 java verbose 옵션을 이용하면, 각 단계별로 로딩되는 class들의 이름을 볼 수 가 있습니다. 참고하세요.

 

3) 몇가지 TIP

 

앞에 간단하게 메모리와, 속도를 최적화할 수 있는 몇가지 기본적인 기법에 대해서 소개해드렸습니다. 별로 어렵지 않고, 간단하기는 하지만, 많은 도움이 될 수 있는 기법들이니까 정리해놓으시면 도움이 되실거구요. 이외에 몇가지 팁을 더 소개하도록 하겠습니다.

 

3-1) Synchronized 사용을 되도록이면 배제한다.

- 동기화 작업은 동시에 작동중인 다른 Thread의 수행을 저지하기 때문에, 필요하지 않는 동기화 작업은 사용하지 않는게 좋습니다. , 동기화 부분은 에러 발생 가능성이 아주 많기 때문에, 무리해서 까지 동기화 작업을 배제하시면 안됩니다.

 

3-2) 불필요한 try-catch 문장을 자제한다.

- try-catch 문장의 경우에는 if 문등을 이용한 에러 검출보다, 속도가 매우 느리게 됩니다. 프로그램의 논리성이나 가독성은 올라가는 반면에, 그만큼 속도는 감소가 되겠지요. 필수 사항은 아니며 권장 사항입니다. Performance를 중요시한다면, 불필요한 try-catch 문장 사용 하시기전에 한번 더 생각해보시기 바랍니다.

 

3-3) StringBuffer를 활용한다.

- 이미 많은 자바 개발자들이 알고는 있지만 잘 활용하지 않는 부분이 바로 StringBuffer입니다. String연산이 많은 경우에는 String 보다는 StringBuffer를 사용하시는게 속도향상에 도움이 됩니다.

 

 

※ 빼먹지 말아야할 것!!

 

이렇게 Performance에 대해서만 이야기 하다보면, 본래 목적에 벗어나는 경우가 종종 있습니다. 속도 향상이나, 메모리 사용의 효율성을 높이기 위해서, 프로그램의 재사용성이나 떨어지고, 코드의 복잡성등이 올라는 경우가 매우 많은데, Performance가 먼저나 재사용성이나 소프트웨어 구조가 먼저냐 ? 라고 붙는다면, 저는 소프트웨어의 구조와 재사용성에 비중을 두고 싶습니다. 수정요!!

 

전체 프로그램에서 세세한 부분의 튜닝으로 조정될 수 있는 Performance향상은 그리 크지 않습니다. 실제로 몇몇 큰 로직이나, 특정 부분만의 튜닝으로도 큰 Performance 향상을 얻을 수 있습니다만, Performance 향상에만 치우쳐진 프로그램은 가독성이 떨어지거나, 소프트웨어 설계 구조가 열악하여 추후에 유지보수 하기가 어려운 경우가 많습니다.

 

Performance 향상도 프로그래밍을 하는데 있어서 하나의 Factor로만 생각을 하시고, 너무 매달리거나 연연해서 원래의 소프트웨어 개발 목적에서 벗어나지 말기 바랍니다.

 

 


 

● 좋은 자바프로그래밍을 하기 위한 전략

 

지금까지 설명드린 내용은, 단순히 자바 프로그래밍할때, 염두해두면 좋은 몇가지 단순한 팁에 불구 합니다. 단지 자바 개발자만이 아니라, 개발자라면 누구나 갖추고 있어야할 몇가지 프로그래밍 전략에 대해서 정리해보았습니다. 간단한 내용이기는 하지만, 충분히 공감을 하실것이라고 생각하구요.. 한번 더 정리한다는 마음으로 읽어보시기 바랍니다.

 

1) 목표를 확실히 하라

 

세상의 모든일이 그렇듯이, 소프트웨어를 개발하는 작업 역시, 목표를 확실히 잡는것이 중요합니다. 개중에 프로젝트를 진행하다보면, 볼 수 있는데요. 쇼핑몰을 예를 들어보도록 하죠. 쇼핑몰은, 물건을 팔아서 수익을 남길 수 있는 것이 궁극적인 목적입니다. 그 목적에 부합한 시스템을 설계하고, 목표로 잡아서 개발해야 하지만, 종종, 개발자의 아집이라고 할까요? 아님 욕심이라고 할까요 새로운 기술을 접목시켜 보고자 하는 욕심이나, 경영진의 의도에 따른 신기술(CRM 등등) 적용이 우선시 되어, 실제로 활용되지 못하는 기술이나 솔루션 적용을 목표로 두고, 원래 목적과 벗어나는 경우가 많습니다. 아무리 좋은 솔루션이나 기술이라도, 제대로 활용을 하지 못하면 소용이 없습니다.

 

게임을 만드는데는 재미가, 기업 홈페이지를 구축하는데는 회사의 이미지와 마케팅이, 그리고 기업용 Application 제작에는 수익증대와 효과적인 자원 관리에 있습니다. 그 목적을 성취시키지 못하면 아무리 좋은 기술과, 문서화, 안정성등을 가지고 있어도, 좋은 소프트웨어라고 볼 수 없습니다.

 

2) 목표 개발환경을 체크하라. (네트워크 환경 문제..)

 

많은 개발자들이 놓치고 넘어가는 부분중에 하나인데요, 목표 환경을 설정하는것이 매우 중요합니다. 사용자가 제작된 소프트웨어를 어떤환경에서 사용할지를 염두해두고 개발하는것은 매우 중요한 일입니다. 보통 하드웨어 환경은 대부분 체크를 하시고 개발을 하시는데 반면, 네트워크 환경을 체크하시는 개발자는 별로 많지 않더군요.

 

 국내의 경우, 초고속 인터넷 환경이 발달하여, 큰문제는 없지만, 아직까지 인터넷환경이 제대로 세팅되지 않은 중국같은 경우에는, 특정 소프트웨어의 네트워크 모듈때문에, 국내에서는 잘 작동하던 소프트웨어가 latency 등의 이유로 제대로 작동하지 않는 경우가 많습니다. 국내에서도 LAN 환경이 10M, 100M냐에 따라서도 서버간의 통신에서는 문제를 미치는 경우가 많습니다

 

 특히 자바개발자가 주의해야할점은 JVM Version인데, 많은 경우 이 JVM에서 생각하지도 못했던 오류가 일어나는 일이 많습니다. 꼭 사용자가 사용할 JVM Version을 체크하고, 테스트 결과를 리포팅하는 것이, 추후에 일어날 수 있는 문제를 예방할 수 있습니다.

 

3) 개발에도 순서와 절차가 있다. 개발 방법론

 

어느정도 개발을 하신분들은 다 느끼시겠지만, 개발에도 순서와 절차가 있지요. 소프트웨어공학론이니, 개발방법론이니, 모두 이 부분에 속하는데, 이미 알고 계시는 이야기는 넘어가도록 하고, 이 부분에서 가장 중요한것은, 어떤 패턴은 사용하고, refactoring을 하고, uml을 이용해서 diagramming을 하는게 아닙니다. 딱 두가지만 이야기 하도록 하겠습니다.

 

 첫번째는, Analysis 입니다. 얼마나, 고객의 요구사항은 제대로 분석해내고, risk 요소에 대한 분석과 대책을 어떻게 세웠느냐에 따라, 그 프로젝트의 성공과 실패가 갈린다고 해도 과언이 아닙니다. 보통 이 분석단계가 주먹구구식으로 이루어 지는 경우가 매우 많지요. 그리고, 국내에서는 이상하게, 기법들이 분석보다는 설계 단계에 치우쳐져 있는듯한 느낌이 듭니다. 고객이 요구하는 바를 제대로 catch해 내지 못하면 개발이 끝난 후에도, 다시 코드를 수정하는 일이 많아져서, 결국은 누더기 같은 소프트웨어가 되버리지요. 어느 정도 개발을 해보신 분들은 대부분 공감을 하실거라 생각합니다.

 

 두번째는, 이것도 목적에 부합하라는 이야기와 비슷할 수 도 있겠는데요. 방법론을 선택하는데 있어서, 알맞은 방법론을 선택하라는 이야기 입니다. 5인정도의 프로젝트의 팀에서 RUP와 같이 큰 방법론을 적용할 필요가 없겠지요? 반대로, 100인 정도의 팀에서 XP를 적용한다면, 아무래도 문제가 있을겁니다. 정보공학방법론,OOAD,OSP,XP,RUP,SSADM등 방법론은 정말 많습니다만, 자신의 팀과, 프로젝트 환경에 알맞은 방법론을 시대의 주류에 휩쓸리지말고 선택하는것도, 좋은 소프트웨어를 만드는 첫걸음이 아닐가 생각합니다.

 

4) 개발 능력은 필수, 멀티 플레이어 개발자가 되자.

 

프로그래밍을 하시면서 많이들 느끼실테지만, 요즘은 개발능력, 코딩 능력 하나로만은 어렵다는 생각이 듭니다. 적어도 두가지 이상의 분야를 체득해야 성공적인 개발자로 거듭날 수 있다고 생각이 되는데요.

 

그중에서도 domain expert(특정 비지니스 프로세스에 대한 전문가) 적인 능력을 가지고 계신분은 해당 업무를 개발하는데, 훨씬 이득이 있는 것으로 생각이 됩니다. 병원 업무 개발하는 사람은 병원 업무를 잘알고, ERP 쪽에서 일하시는분은 회사 돌아가는 프로세스를 알고 있으면 도움이 되겠지요?

 

 또한 domain expert 이외에도, 기획 능력이나, 디자인 능력, 경영 능력, 팀관리 능력, 세일즈 능력등등의 두가지 이상의 능력을 가지고 있는 개발자 분들이, 요즘 유난히 눈에 띄는것을 볼 수 있습니다.

 

 개발은 기술일 뿐이고, 그 기술을 뒷받침해주고, 좀더 빛나게해주는 무언가가 필요하다는 생각이 절실하군요..

 

5) 전반적인 바탕 지식을 튼튼히 하자. 데이터베이스,WAS 등등

 

두말할 필요 없겠지만, 내가 자바 개발자라고 해서, 자바만 알아서는 안되겠지요? 제대로된 자바 프로그래밍을 하기 위해서는 JVM 구조를 알면 도움이 되고, JVM을 제대로 알려면 System Programming을 알아야 이해가 되겠지요? DBMS 프로그래밍을 하려면 DBMS SQL 이 어떻게 사용하면 효율적인지도 알아야 겠구요.. 그래서 보통 개발자들이 갖추어야할 4대 기술을 System Programming,Network,Database,Software Engineering 을 꼽습니다.

 

 따져 보면, IT 기술의 거의 모든 분야라고 할 수 있겠는데요. 거의 모든 분야가 필요한게 사실이기도 하지요 흔히들 개발자들 사이에서 내공이 튼튼하다라는 말을 쓰는데, 이러한 기술들이 내공이 아닌가 싶습니다. 개발언어도 물론 특징과 공부해야할것은 많지만, 이런 내공이 튼튼하다면, 좀 더 쉽게 접근할 수 있다고 생각합니다.

6) 예제 코드를 많이 보자.

 

각종 벤더에서 발표되는 example 코드나, 서적의 소스코드들을 보면 정말 잘 짜여진 코드들이 많습니다. 이런 코드들을 보고 있노라면, 저도 다시 참 많은것을 배우게 되는데요. 코딩룰에서 부터, 주석 달기, 패턴 등등. 끝이 없더군요 자신이 안다고 단순히 넘어갈것이 아니라, 예제 코드들은 한번쯔음 살펴보는것이 좋을 것이라고 생각되구요. ! 국내 몇몇 기초 서적들의 코드들은 다소 문제가 있는 코드들이 많기 때문에, 주의하셔서 보는것이 좋을것 같네요. 한번 잘못들여진 습관은 꽤 오래갈 수 있거든요..