2012년 6월 16일 상암동 누리꿈 스퀘어 비즈니스센터 4층에서 제 1회 자바카페 오픈 세미나가 열렸습니다.

사실 이 세미나는 처음에 안갈려고 했습니다. 한 세션에 1시간 정도 밖에 주어지지 않았고, 세션 주제도 제가 딱히 원하는 주제들은 아니었습니다. 그런데 어찌하다보니 친구따라 강남가는 꼴로 듣게 되었네요.ㅎ


시간표는 아래와 같습니다.




이번 포스팅은 세션의 각 내용에 대해서는 자세히 이야기하지 않겠습니다. 너무 세세하게 다루면 글 내용이 심히 길어질 것 같고, 각 세션에서 제가 느낀 점 정도만 이야기하고 발표자료를 여기에 첨부하겠습니다.^^



기조 연설

먼저 자바 회장님의 기조연설이 있으셨습니다. 현재 자바카페는 13년이나 된 오프라인 위주의 커뮤니티라고 하구요, 이번이 첫 오픈 세미나라고 합니다.

이 분이 하신 이야기 중에 "사람에 기반한 프로그래밍"이라는 이야기가 있었는데,, 무언가 생각을 하게끔 만드네요.

겉으로보기엔 간단하게 꺼낸 말 같지만, 저 말을 세상에 꺼내놓기 전까지 얼마나 많은 생각이 있었을지.. 그리고 듣는 우리가 바로 이해하기 힘든 속 뜻은 무엇일지 충분히 곱씹어보며 생각할 가치가 있는 말인 것 같습니다.





기조 연설하시다가 현재 외국에 나가 계신 부회장(위 사진)이라고 하셨나? 그 분이 영상을 찍어서 축사를 보내주셨다고 하며 그 동영상을 틀어주시더군요.ㅎㅎㅎ 그 먼 곳에서 영상을 만들어서 인사하고 싶은 열정과 엉뚱함에 박수를 보냅니다.ㅎ

Session 1. 키워드로 정리해보는 IT 트랜드

어찌어찌 기조연설을 마치고, 첫번째 세션이 시작되었습니다. 

첫 세션은 자바 카페 회장님이신 유현석님의 "키워드로 정리해보는 IT 트랜드"였는데요, 일단 내용으로 치자면 대충은 알고 있는 내용들이었는데 그럼에도 불구하고 배울 점은 충분히 있더군요.


빠르게 변화하는 IT의 트랜드를 잡기 위해 참고해야할 사이트도 알려주셨구요, 가트너(gartner)에 나온 hype-cycle이라는 IT 사이클을 보여주는 그래프도 대략 어떻게 읽어야하는지 알 수 있었습니다. 가트너에서 제공하는 사이클 그래프라면 어느정도 신뢰할 수 있지 않을까요?

저도 다음에 시간이 된다면 이 hype-cycle 그래프를 제대로 살펴볼려고 합니다.^^

Session 2. 안드로이드 애플리케이션이 Unit Test를 만날 때

두번째 세션은 유동환 님의 세션이었는데요, 유닛 테스트 자체는 이미 사용해봤고, 안드로이드 유닛 테스트도 안드로이드 개발자 사이트에 친절히 잘 나와있어서 그렇게 크게 도움이 되지는 않았던 것 같습니다. 

다만 한가지 신기했던게 있었는데요, UI 테스트를 자동화 해주는 Robotium이라는 테스트 프레임웍입니다. 현재 구글 코드에서 아파치 라이센스로 개발중이더군요. 

이 Robotium을 이용하면 화면의 버튼을 누르는 등의 테스터가 직접해야 할 일을 테스트 케이스만 작성하면 알아서 되더라구요. 정말 편하고 좋은 프레임웍인 것 같다는 생각이 들었는데,,




위의 코드를 보면 뭔가 느낌이 오시나요?

testPreferenceIsSaved() 메서드가 하나의 테스트 메서드인데요,

안의 코드를 보면 대부분 스트링이나 숫자같은 상수를 이용합니다. 즉, 특정 클래스의 메서드를 테스트 케이스에 작성하는 것이 아니라, 메서드 이름이나 버튼 이름 인자 등을 저렇게 상수로 입력해야합니다.

이 방법에서 생길 수 있는 문제점은 특정 메서드가 변경되거나 버튼의 인덱스가 바뀌는거나 id가 바뀌는 등.. 여러가지 변화가 있을 수 있는데, 그러할 경우에 저 텍스트들은 리펙토링이 되지 않아 정말 큰 어려움을 겪을 것 같습니다.

Session 3. 안드로이드 파편화

다음 세션은 최치환 님의 안드로이드 파편화였는데요, 이 부분은 사실 워낙 오래 전부터 나왔던 이야기이고 해결 방법도 이미 다 알고 있는 내용들이라 저한테는 별 의미없는 세션이었습니다.

발표자 분은 열심히 준비하셨겠지만, 자료들에 대해 신뢰를 할 수는 없었습니다.

왜냐하면 많은 자료들이 출처가 불분명했고, 언제적 자료인지도 확실히 알 수 없었기 때문이죠.

이런 걸 보면서 저도 발표 준비할때 레퍼런스를 확실히 해야겠구나~ 하는 생각이 들었습니다.

휴식 시간

휴식 시간에는 작은 게임을 했습니다. ㅎ 

빙고 게임이었는데요, 25칸의 게임판에 1~100까지의 숫자 중 원하는 숫자를 넣어놓고 시작했습니다.

숫자는 프로그램 만들어서 돌릴 줄 알았는데,, 의외로 그냥 앞에서 마음대로 부르시더라구요.ㅎㅎㅎ



결과는 참패입니다.ㅠ_ㅠ

총 세번의 게임을 했는데,, 어떻게 이렇게 내가 적은 숫자는 안부르는지......

저는 이런 경품 행운은 없나봅니다.ㅠ_ㅠ


Session 4. Introduction to Google Guava

네번째 세션은 김흥래 님의 구글 구아바에 관련된 내용이었습니다. 

구글 구아바는 아파치 Commons 라이브러리를 JDK 버전에 맞게 업그레이드하고, 추가적으로 필요한 유틸리티 컴포넌트가 있는 라이브러리라고 합니다. 실제로 들어보니 정말 써보고 싶은 생각이 들더군요. 

원래 자바 자체가 기본적으로 개발이 쉽다고 느껴졌었는데, 이런 유틸리티 라이브러리를 함께 사용한다면 개발 시간을 훨씬 단축시킬 수 있을 것 같습니다.

Session 5. Spring Data JPA

다섯번째 세션은 이재일 님의 JPA 세션이었는데요, 와.. 이건 제가 도저히 알아들을 수가 없었습니다. 일단 이 세션을 이해하려면 스프링 프레임웍을 어느정도 사용해봐야 이해가 될 듯 하더군요... 저는 스프링을 아~~~~~~주 약간 공부하다가 말아서 도저히 이해할 수가 없었습니다.^^;;

Session 6. Javascript Module

여섯 번째 세션은 이항희 님의 자바스크립트 모듈화에 관련된 내용이었는데요, 이 분은 실력은 뛰어나실 거 같은데 첫 발표라고 하시더라구요..
첫 발표라서 A4용지에 출력해오신 내용을 보고 읽으셔서 조금 안타까웠습니다.ㅠ_ㅠ
자바 스크립트에서 클래스를 만들고, 메서드나 필드의 공개 여부를 결정하고 네임스페이스를 사용하는 등에 관한 내용을 발표해주셨습니다.
제가 어느정도 자바스크립스를 쓸 줄 알아서 어느정도 내용을 이해할 수 있었는데, 자바스크립트에서는 원래 클래스를 지원해주지 않고 function으로 클래스처럼 만들어서 하는 방식이라 많이 헷갈리더군요..;;
그 방식에 익숙해 질려면 많이 써봐야 할 듯...ㅎ

Session 7. Spring Framework 주요 구성원리

마지막 세션은 조효은 님의 스프링 프레임웍에 대한 내용이었습니다.
이 분은 강사 출신답게 발표를 엄청 잘하시더라구요, 사실 발표라기보다는 학교 수업듣는 기분이었습니다.ㅎㅎ
스프링 프레임웍이 생기게된 배경을 차례대로 설명해 주셨는데,, 역시 제가 서버쪽 자바를 하는게 아니라서 내용을 이해하기에는 많은 어려움이 있었습니다.ㅠ_ㅠ





이렇게 총 7개의 세션을 들었는데요, 반정도는 도움이 됐고, 반은 저에게 거의 무의미한 세션이었던 것 같습니다.

그래도 반이나마 건졌으니 많이 건졌다 생각합니다.ㅎ

마지막에 경품 추천 시간이 있었는데, 제 번호는 근처만 오더군요.ㅠ_ㅠ

1등이 아이패드였는데..ㅠ_ㅠ 


제 후기는 이 정도로 끝내도록 하구요, 세션의 자세한 내용은 pdf 파일 첨부하겠습니다.^^

(자바 카페 측에 업로드해도 된다고 허락받고 올립니다.)


01.[유현석]키워드로 정리하는 IT트렌드.pdf


02.[유동환]안드로이드App이UnitTest를만날때.pdf


03.[최치환]자바카페 세미나 안드로이드 파편.pdf


04.[김흥래]Introduction to Google Guava.pdf


05.[이재일]Introduce Spring Data JPA.pdf


06.[이항희]Javascript Module.pdf


07.[조효은]Spring 프레임워크 중요 구성원리.pdf




저작자 표시 비영리 변경 금지
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon 양수 2012.06.20 13:51 신고 Address Modify/Delete Reply

    가고 싶었는데...
    정리까지 해주노~
    멋지노 ㅋ

    • BlogIcon Code-Moon 2012.06.21 10:58 신고 Address Modify/Delete

      스프링쪽은 전혀 알아들을 수가 없어서~ㅠ_ㅠ
      정리는 대충했지만 발표자료 올렸으니 그거 보세요~ㅎ

  2. BlogIcon 양수 2012.06.21 18:13 신고 Address Modify/Delete Reply

    응 봤어~
    스프링 이론 좀 어렵긴 하지 ㅋ
    내용은 기본적인 이론에 + 샘플까지 상세히 설명되있네
    Mybatis는 첨봤어~ ㅎ
    직접 봤으면 더 좋았을텐데.. 뭐 여튼 아쉬운 대로 잘봤어~ㅎ


멀티 쓰레드(multi-thread) 기반의 프로그래밍을 하게 되면 중요한 것이 바로 원자성의 보장이다.

그렇다면 원자성이 무엇인가?

원자성이란 여러개의 쓰레드가 있을 때 특정 시점에 어떤 메소드를 두개 이상의 쓰레드가 동시에 호출 못한다는 것이다.

간단한 예를 들어보자.
class Job implements Runnable {
   public void run() {
      while(true) {
         go();
         stop();
      }
   }
   public void go() {
      /* 매우 중요한 작업이다 */
   }
   public void stop() {
      /* 그냥 일반적인 작업이다. */
   }
}

위의 Job 클래스를 보면 run()메소드에서 go()와 stop()메소드를 무한 호출하고 있다.
그런데 여기에서 go()메소드가 아주 중요한 메소드라고 하자.

메인 클래스에서 Job객체를 이용해서 여러개의 쓰레드를 만들었고, 각 쓰레드를 수행시켰다고 하면 각 쓰레드는 start()메소드를 언제 호출했든지에 상관없이 멀티 쓰레드 정책에 따라 수행될 것이다.

그런데 잘 생각해보면 1번 쓰레드에서 go()메소드를 수행하는 중에 2번 쓰레드가 go()메소드를 수행할 수도 있다.
그렇게 되면 우리가 예상치 못한 문제가 발생할 수 있는 부분이라고 가정하자. (그런 상황은 여러가지 상황이 있을 수 있다. 특히, 서로 다른 쓰레드의 go()메소드에서 같은 변수의 값을 변화시키는 부분일 경우를 생각해 보면 된다.)

어쨌든 go()메소드가 그렇게 중요한 부분이라서 절대로 함수 호출이 끝나기 전에 또 다시 go()메소드가 호출되는 일이 없어야 한다면, 이런 경우가 바로 원자적으로 수행되어야 하는 부분이다.

그래서 이러한 부분을 원자적으로 (atomic) 수행되는 것을 보장해 주는 것이 바로 synchronized 키워드이다. 그래서 go()메소드의 선언 부분을 다음과 같이 바꿔주면 된다.

public synchronized void go() 



신고
Posted by Code-Moon

댓글을 달아 주세요

자바를 이용해서 프로젝트를 진행하면 사용하는 클래스에 대해서는 거의 모르는 게 없게 된다.

하지만 프로젝트를 할 때에는 잘하다가도 손 놓으면 잊어버리게 되는 것 중 하나가 바로 쓰레드를 사용하는 것이다.

그래서 오늘은 쓰레드를 사용하는 방법에 대해 정리해 보자.

먼저 쓰레드를 사용하기 위해서는 Runnable 인터페이스와 Thread 클래스가 필요하다.

Thread 클래스는 새로운 작업을 맡게되는 일꾼이라고 생각하면 되고, Runnable 인터페이스를 구현하는 객체가 실질적인 일이 되겠다.
또 Runnable 인터페이스를 구현하는 클래스는 run()함수에 쓰레드에서 작업할 일을 넣으면 된다.

그렇다면 간단한 예제를 살펴보도록 하자.

public class Job implements Runnable  {
   public void run() {
      System.out.println("new job");
   }
}

class Main {
   public static void main(String[] args) {
      Runnable job = new Job();
      Thread thread = new Thread(job);
      thread.start();
   }
}


정말 간단한 예제이다. Job이라는 클래스는 Runnable 인터페이스를 구현하는데 run()함수에서는 "new job"이라는 문자열을 한번 출력하게 되어 있다.
Main클래스를 보면 Runnable을 구현한 Job객체를 만들고 이를 Thread 객체의 인자로 넣어 주었다.
그리고 그 쓰레드를 시작하기 위해 thread.start()를 해주었다.
여기서 주의할 것은 Thread객체의 start()메소드를 호출하지 않으면 쓰레드가 절대로 수행되지 않는다는 것이다.
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:18 신고 Address Modify/Delete Reply

    제목에 오타. 수정하면 이 댓글은 지워주삼 ㅋ

자바에서는 객체를 손쉽게 저장하거나 전송할 수 있는데, 이를 가능하게 하는 기술이 바로 직렬화입니다.

원래 객체는 힙 안에 존재하게 되는데 직렬화를 하게 되면 그 모양이 약간 변형되게 됩니다. 이렇게 하게 되면 자바에서 저장 및 전송에 아주 편리하고 유리하다는 장점이 있지만, 동시에 다른 프로그램에서는 이를 분석하기 힘들다는 단점이 있습니다. (물론 직렬화를 통해 어떤식으로 변형이 되는지 그 원리만 잘 알고 있다면 다른 프로그램에서도 얼마든지 읽고 쓰는 것이 가능할 것입니다.)


1.Serializable
직렬화를 하기 위해서는 저장하거나 전송할 객체에 Serializable이라는 인터페이스를 구현해 주어야 합니다. 이 Serializable 인터페이스는 구현할 메소드가 하나도 없기 때문에 그냥 implements Serializable만 써주면 됩니다.

아래의 코드가 Serializable을 구현한 Car클래스입니다.
public class Car implements Serializable {
   /* Car 클래스의 내용 */
}


위와 같이 Serializable을 구현해 줘야 그 객체를 직렬화해서 저장하거나 전송이 가능하지, 구현하지 않을 경우에는 런타임 에러가 발생할 것입니다.

객체가 직렬화되면 그 객체 내부에 있는 모든 객체들도 직렬화되게 됩니다. 그런데 Car객체 내부에 있는 다른 객체가 있다 하더라도 전송이나 저장하기 싫은 변수도 있을 수 있습니다. 이럴 경우에는 transient라는 키워드를 사용하면 됩니다.
예를 들어 Car 클래스에 비밀번호를 담고 있는 password 변수가 있어서 이는 전송하고 싶지 않다고 하겠습니다. 그러면 아래와 같이 코드를 작성할 수 있을 것입니다.

public class Car implements Serializable {
   transient private String password;
   /* Car 클래스의 내용 */
}
위와 같이 코드를 작성하면 직렬화를 하더라도 password의 내용은 직렬화되지 않게 됩니다. 이 transient 키워드는 primitive 변수에도 사용이 가능하고, non-primitive변수에도 사용이 가능합니다.


2.스트림(Stream)
자바에서는 여러종류의 스트림(Stream) 클래스가 있는데 이 스트림 클래스를 이용해서 직렬화된 객체를 파일로 저장하거나 전송하는 등 여러가지 작업을 할 수 있는 것입니다.

다음의 코드는 car객체를 data.dat라는 파일에 넣기 위한 코드입니다.
Car car = new Car();
try {
   FileOutputStream fos = new FileOutputStream("data.dat");
   ObjectOutputStream oos = new ObjectOutputStream(fos);
   oos.writeObject(car);
   oos.close();
} catch(Exception e) {
}

코드를 잘 보면 먼저 FileOutputStream 객체를 생성합니다. 이는 파일에 출력하기 위한 스트림입니다.
그리고 ObjectOutputStream 객체인 oos를 생성하는데 이는 객체를 연결하는 스트림이라 생각하면 되겠습니다.
oos가 객체를 저장할 수 있게 하는데 혼자서는 파일이나 소켓에 넘기는 것이 불가능합니다. 그래서 oos를 생성할 때 fos를 인자로 넣음으로써 객체를 파일에 저장할 수 있도록 하는 것입니다.
그러고나면 oos.writeObject(car)를 하게 되는데 이렇게 하면 실제로 파일에 car객체를 저장하는 것입니다. 저장이 끝나면 oos를 닫아줘야 합니다. oos를 닫아주면 그 아래에 있는 fos는 자동으로 닫히기 때문에 신경쓰지 않아도 됩니다.

이를 그림으로 살펴보면 아래와 같습니다.
사용자 삽입 이미지
위 그림에서 보면 car객체를 data.dat라는 파일에 넣기 위해서 먼저 ObjectOutputStream을 거치고 그 다음에 FileOutputStream을 거쳐서 data.dat파일에 들어간다는 것을 알 수 있습니다.

아래의 코드는 data.dat라는 파일에서 car객체에 값을 읽어보는 코드입니다.
Car newCar = new Car();
try {
   FileInputStream fis = new FileInputStream("data.dat");
   ObjectInputStream oos = new ObjectInputStream(fis);
   ois.readObject(car);
   ois.close();
} catch(Exception e) {
}

코드는 크게 바뀐 부분이 없습니다. Ouput대신에 모두 Input으로 바뀌었고, 객체를 쓸 때에는 writeObject()라는 메소드가 사용되었는데 객체에서 읽어올 때에는 readObject()라는 메소드가 사용됩니다.

이에 대한 그림도 아래에 나와 있습니다.
사용자 삽입 이미지
위의 그림을 잘 보면 data.dat라는 파일에서 newCar라는 객체에 불러오는데, 먼저 FileInputStream에서 ObjectInputStream을 거쳐서 newCar에 불러 온다는 것을 알 수 있습니다.


신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon 하늘빠 2010.08.17 16:42 신고 Address Modify/Delete Reply

    좋은 글 잘 보았습니다.
    해설이 넘 명쾌하네요.

    • BlogIcon Code-Moon 2010.08.18 19:37 신고 Address Modify/Delete

      오~ 명쾌하다는 칭찬을 해주시다니^^
      감사합니다.
      글 솜씨가 없어서 다른 분들이 이해를 못하실까봐 내심 걱정했었는데, ^^

  2. 창민 2010.09.17 14:06 신고 Address Modify/Delete Reply

    너무 잘쓰셨네요. 이토록 깔끔한 글이라니.. ㅎㅎ
    블로그에 담아갑니다.

  3. 불꽃란 2013.05.27 14:10 신고 Address Modify/Delete Reply

    좋은 설명 감사합니다
    퍼갈게요 ^^

스택과 힙

프로그래밍/JAVA 2010.01.06 14:43 |

1. 스택(Stack)
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다.


2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.


*만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까?
객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, float, boolean ...)가 아닌 변수에는 객체 자체의 값이 들어가는 것이 아니라 객체에 대한 reference가 들어가게 된다.

즉, 아래 그림과 같은 경우 현재 walk()메소드가 수행되고 있고, walk()메소드에서는 car라는 객체를 사용하게 되는데 이때 car객체는 힙에 생성되어 있고, walk()에서 사용하는 car변수는 힙에 있는 객체의 레퍼런스를 이용하는 것이다.
스택 &

신고
Posted by Code-Moon

댓글을 달아 주세요

티스토리 툴바