티스토리 툴바

블로그 이미지
당신이 행복했으면 좋겠습니다. 늦깍이낭만파

카테고리

분류 전체보기
Programming
Database
여행
관심사
문화활동
생각
IT trend
Total14,545
Today4
Yesterday11

공지사항

엄청 오랜만에 포스팅하네요 ㅎㅎ;;;
그만큼 나태해졌음에 반성 좀 해야겠어요 에잇! ㅎㅎ

ValueStack은 이름처럼 스택입니다. 
사용자는 URL을 통해 서버에 무엇을 요구합니다. 그럼 서버는 요구에 맞추어 반응을 합니다. 액션이 취해지죠.
스트러츠에서는 이러한 요청에 따라 반응해야하는 행위를 Action 이라고 합니다.

스트러츠 개발시 사용자요청에 어떤 Action이 이루어져야하는지를 xml에 기록해야합니다.
xml에는 본래 Action이 취해지기전과 취해진 후에 어떤 일을 해야할지에 대한 interceptor 개념을 기술할 수 있습니다.

여러 interceptor들이 존재하는데, 개발의 편의성을 주기 위해서
일일이 request의 parameter들을 셋팅하지 않아도 되도록 도와주는 interceptor도 있습니다.
ValueStack 에는 Action이 취해질 액션인스턴스(객체)가 저장됩니다.
parameter들은 이 ValueStack의 액션들의 프로퍼티(변수) 들을 찾아서 top-down 방식으로 셋팅이 되게 됩니다.

ValueStack을 테스트해보시면 아마 이해가 더 손쉬우실 것입니다.
아래는 샘플 예제입니다.


 
package com.munsuTest.test;

import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;

class Person{
	String name;
	int salary;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", salary=" + salary + "]";
	}
}
class Dog{
	String name;
	String kind;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getKind() {
		return kind;
	}
	public void setKind(String kind) {
		this.kind = kind;
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", kind=" + kind + "]";
	}
}

public class TempTest {
	public static void main(String[] args) {
		Person person = new Person();
		Dog dog = new Dog();
		
		ValueStack valueStack = new OgnlValueStack();
		valueStack.push(dog);
		valueStack.push(person);
		
		valueStack.setValue("name", "munsu");
		valueStack.setValue("kind", "jindo");
		valueStack.setValue("salary", 500000);
		valueStack.setValue("name", "superdog");
		System.out.println(person);
		System.out.println(dog);
		
		System.out.println(valueStack.findValue("name"));
		System.out.println(valueStack.findValue("kind"));
		System.out.println(valueStack.findString("name"));
		System.out.println(valueStack.findString("salary"));
	}
}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 늦깍이낭만파

java : POJO란?

Programming/JAVA / 2011/12/19 16:57
Plain Old Java Object.
여러 프레임워크 기술서적에 빠지지 않고 나오는 단어 POJO...
그냥 툭 까놓고 얘기하자면
프레임워크에 종속되지 않는 (의존성없는) 클래스를 지원한다는 것입니다.

이해하기 어려웠고, 지금도 저렇게 정의해놓은 것이 맞는 것인지, 저걸 말하는 것이 맞는 것인지 애매하네요 -_-

여튼 제 추측은 EJB가 문제다. 편하게 작업하려고 이것저것 끼워넣었다...
따라서 처음 개발에 진입하기도전에 온갖 환경설정에 진이 빠지고...
어떤 모듈을 구현할라 치면 이미 모듈과 모듈끼리 의존이 얽히고 얽혀서
따로 구현하여 끼워넣지 못하고 반드시 상속을 받던가 하여서 구현을 해주어야 하는데
처음엔 편하던것이 너무나 광범위하게 편하려다보니 오히려 역행한 꼴이 난 것이 EJB.
그래서 EJB가 가진 장점을 살리되, 객체지향적인 프로그래밍을 가능하게 하기 위해 탄생한 것이
수년전부터 쓰이는 스트럿츠라던가, 스프링같은 프레임워크.

이런 프레임워크가 가진 장점 중 하나가 객체지향적인 프로그래밍이 가능하기 위한 POJO 지원

쉽게 작성하려했는데 왜 이러나 적다보니 이렇게 됐네요^^;

정리.
POJO 란 프레임워크에 종속적이지 않은 객체.
(과거의 그것이든, 현재의 그것이든. java는 한번 작성된 코드는 어디에서든 쓸 수 있어야죠) 


 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 늦깍이낭만파
TAG POJO
구성, 위임 등은 headfirst OOA&D 에서 자주 상기되던 개념입니다.
구성이라는 것은 클래스가 다른 클래스를 인스턴스 변수로 가진다는 의미로 보실 수 있으며
위임은 클라이언트 코드에서 구성하고 있는 인스턴스 변수 객체(말이 어렵네요. 참조객체라고 하면 쉬울까요 ㅎㅎ;)
를 통하여 메소드 호출 등을 말하는 것입니다.

아마 수개월전에 headfirst OOA&D 학습하면서 끄적였던 것 같은데 이 주제를 다시 또 다루는 이유는
요즘 보고 있는 책에서 꽤 강하게 주장하고 있어서 적습니다.
서적 이름은 thinking in java라는 서적인데,
모두 읽은 것은 아니지만 headfirst java + OOA&D 느낌이 좀 있네요. headfirst 시리즈가 쉬운 용어들과 재밌는 사진들을
이용해서 거부감을 좀 줄였다면 이 서적은 상당히 전문용어들을 사용하면서 약간 무겁게 다가오네요.
두껍기도... 아주 두껍구요 ㅎㅎ;

OOA&D 에서도 기술되었듯이 상속보다는 구성을 이용하라고 하는데, 이 서적도 함께 요구하고 있습니다.
OOA&D에서는 그냥 '분리' 라고 표현하였다면 이 서적에서는 '완전한 분리' 라고 강하게 표현하네요.

thinking in java에서 다형성과 인터페이스(8, 9장) 에 대해서 이야기하면서 나오는 부분입니다.
"상속과 구성 중 어느 것을 사용할지 분명히 하지 않으면, 구성을 먼저 고려하는 것이 더 좋은 방법이다.
 구성은 상속 구조의 설계가 수반되지는 않지만 실행시 동적으로 타입을 선택할 수 있으므로 유연하다
 이에 반하여 상속은 컴파일할 때 정확한 타입을 알아야 한다."

예를 들자면 이러합니다.
class ABC { public void isABC() }
class A extends ABC{
   public void isABC(){ print("a"); }

class B extends ABC{
   public void isABC(){ print("b"); }
}
class Stage{
   private ABC abc = new A();
   public void change(){ abc = new B(); }
   public void play(){ abc.isABC(); }

class Test{
   public static viod main(String[] args){
      Stage stage = new Stage();
      stage.play();
      stage.change();
      stage.play();
   }


서적의 예제를 ... 베껴놓았습니다 -_-;;;
Stage 클래스는 A, B의 부모클래스인 ABC클래스를 구성하고있습니다.
처음 Test에 의해서 객체가 생성이 될때 인스턴스 변수 abc는 A 객체가 생성되면서 초기화 되는군요. 
그리고 play 메소드가 호출이 되는데 이때는 위임을 통해서 A 객체의 isABC() 메소드를 호출합니다.
그럼 당연히 a가 출력되겠네요. 

하지만, 곧 stage 객체의 클라이언트가 change() 메소드를 호출하였고 인스턴스 변수는 B객체를 참조하게되었네요.
그리고 play() 메소드가 호출되면 B객체의 isABC() 메소드를 호출하게 됩니다.

예전에도, 요즘도, 그래서 뭐 어쩌라고.... 라는 생각을 사실 자주 했었드랬죠.
그런데 문득 이런 생각을 하게 되었습니다. (각종 서적에서 했던 말을 이제사.... 알겠습니다. 라고 답변했네요...)
처음에 A객체의 프린트를 위해서
class AA extends A{
   public void isABC(){ print("a"); }
}
라고 AA 클래스를 또 상속을 통해서 작성하였다면 어떨까요.
나중에 클라이언트 코드에서 B가 필요할 경우엔? 다시 또 BB를 만들어주어야 하나요?
상당히 억지스럽지만 이러한 코드도 보일 뿐더러
아예 A, B 를 바로 가져다 쓰는 경우가 있다고 합니다.
편의상 가능한 말이지만.... C가 생기고 D가 생기고 하게되면 언젠가는 클라이언트 코드들을 죄다 찾아서
작업해줘야하는 번거로움이 생기게 됩니다.

흠.... 진정 구성과 상속, 위임 등에 대해 그 필요성과 철학을 이해하고 작성했나 모르겠네요.

thinking in java 의 도입부분에선 간단하게나마 C, C++, java에 대해 소개해줍니다.
프로그래밍언어구조론 나름 열심히 들었다고 생각했는데 얼떨떨했네요.
유명한 것은 알고 있었지만 책이 원체 두꺼워 손이 잘 안가고 있었는데 기회가 닿아 좀 읽어보니
프로그래밍 자체를 처음 접하는 분에게는 추천해드리기 별루고,
프로그래밍을 조금은 접해보셨던 분들께는 추천하고픈 책입니다. 

적다보니 책얘기가 대부분같네요.
참, 위에 작성한 예제는 State 패턴이라고 합니다!

 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 늦깍이낭만파