Whiteship's Note


OSAF 2.0 준비중

OSAF : 2010.06.23 17:05


최근에 계속 포스팅 했던 [회사일]을 하면서 다른 프로젝트에서도 사용할 수 있는 코드들을 별도 패키지에 모아뒀습니다. 

Generic 사용 극대화

이전과 마찬가지로 Generic 사용을 극대화해서 DAO, Service, Controller를 만들고 PersistentEnum을 활용하는 GenericPEFormatter도 만들어 뒀고, GenericExcelView까지 있습니다.

REST 스타일 URL 지원

스프링 3.0 최신 버전과 하이버네이트를 사용했으며 URL은 REST 스타일로 만들어 놨습니다. 따라서 GenericController만 상속받으면 기본적인 CRUD 기능을 RESTful URL로 제공해줍니다.

계층 구조

기본적인 계층 구조(DAO, Service, Controller) 형태기 때문에 적응하기 쉬울 겁니다. 스프링 Roo 스타일로 만들까 했지만. AsepctJ를 공부헀었는데도 잘 적응이 안되더라구요.ㅋ

no-iframe

참.. 화면이 이전처럼 iframe으로 나눠진게 아니라 통짜 구조입니다. 화면을 나누는건 JQuery layout 플러그인을 사용했구요.  iframe보다 편합니다.

그리드

그리드도 jqGrid를 사용해서 이전에 쓰던 그리드(뭔지도 기억안남)보다 기능도 많고 더 좋습니다.

상속

단점은.. Spring Roo 처럼 완전히 비침습적인 프레임워크가 아닌지라.. 상속을 사용해야 합니다. DAO, Service, Controller, Enum 들이 OSAF 코드를 상속 받아야 합니다.

코드 생성

코드 생성 기능은 없습니다. 만들라면 만들겠지만 귀찮기도 하고 손으로 직접 만들면서 사용법을 익히는게 좋을 것 같아서 만들지 않았습니다.

바로 시작

프로젝트를 다운받아서 라이브러리 형태로 넣을 필요없이 프로젝트를 받아서 바로 자신의 웹 프로젝트로 사용할 수 있게끔 배포할 계획입니다. 

기본 모델 제공

바로 실행할 수 있는 프로젝트에 Member, Right, Code, CodeCat 같은 기본 도메인을 제공합니다. 자주 쓰는 도메인 코드를 가진 상태에서 시작하세요. Generic류 코드를 어떻게 쓰는지, OSAF 태그파일을 사용해서 화면 코드를 작성하는 방법을 쉽게 볼 수 있습니다.
top

TAG OSAF 2.0

[OSAF 테스트 가이드 초안] 서비스 통합 테스트

OSAF : 2009.09.01 19:40


서비스 통합 테스트

(테스트할 메서드 내에서 new를 이용하여 객체를 생성하는 등) 의존성을 목킹하기 까다로운 상황 또는,
사용하는 DAO의 기능을 충분히 테스트 했으며, DAO 실행 시간이 오래 걸리지 않을 경우
굳이 목킹하여 단위테스트를 작성할 필요 없이 통합 테스트를 작성 할 수 있습니다.

테스트 하지 않을 것

서비스 단위 테스트와 동일합니다.

테스트 할 것

  • 서비스 단위 테스트에서 하지 않은 테스트

테스트 코드 작성 방법

  • 스프링 @Test 설정 추가
  • 테스트 클래스 이름

서비스 단위 테스트와 겹치지 않도록 테스트할 클래스 이름 뒤에 Test를 붙여줍니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testApplicationContext.xml")
@Transactional
public class PurYearPlanServiceImplTest {

@Autowired PurYearPlanServiceImpl service;

...
}
  • 테스트 작성하기
	@Test
public void update() {
PurYearPlan entity = new PurYearPlan();
service.add(entity);
assertThat(entity.getAmount(), is(new BigDecimal(0)));

entity.addDetail(makeNewDetailWithPriceAndQty(10, 7));
service.update(entity);
checkPriceQtyAndAmount(entity, 10, 7, 70);

entity.addDetail(makeNewDetailWithPriceAndQty(20, 3));
service.update(entity);
checkPriceQtyAndAmount(entity, 15, 10, 150);
}

private void checkPriceQtyAndAmount(PurYearPlan entity, int price, int qty, int amount) {
assertThat(entity.getPrice(), is(new BigDecimal(price)));
assertThat(entity.getQty(), is(new BigDecimal(qty)));
assertThat(entity.getAmount(), is(new BigDecimal(amount)));
}

private PurYearPlanDetail makeNewDetailWithPriceAndQty(int price, int qty) {
PurYearPlanDetail detail = new PurYearPlanDetail();
detail.setPrice(new BigDecimal(price));
detail.setQty(new BigDecimal(qty));
return detail;
}

생각해 볼 것

  • 서비스 단위 테스트와 통합 테스트 구분이 좀 애매 하다.

무조건 단위 테스트를 하기로 하고,
단위 테스트가 정 불편한 어떤 이유(그 이유를 정리해둬야겠다)를 가진 것들만 통합 테스트를 하는것이 좋치 않을까?

  • 서비스 단위 테스트와 통합 테스트의 성능 차이는 꽤 크다.

그런면에서도 통합테스트 보다는 단위 테스트가 더 좋아보인다.
쌓이고 쌓이고 쌓이다보면 빌드 하는데 엄청 오래 거릴 것이다.

  • 테스트 작성 및 이해가 비교적 쉽다

목킹을 하지 않기 때문인지, 목킹 코딩에 익숙치 않아서 인지,
목킹을 하면 역시 가독성도 떨어지고 테스트 작성이 완만하지 않다.
그럼 다시 반대로 통합 테스트를 기본으로 하고 복잡하고 오래 걸리는 DAO를 사용할 경우에만 단위 테스트로 옮길까?

top


[OSAF 테스트 가이드 초안] 서비스 단위 테스트

OSAF : 2009.09.01 19:34


서비스 단위 테스트

DAO를 사용하지 않는 부분을 테스트 하거나,
테스트 하려는 부분에서 사요하는 DAO 기능이 충분한 테스트를 거치지 않았거나,
테스트에서 사용하는 DAO가 아직 제대로 구현되지 않았거나,
실행이 오래 걸리는 DAO를 사용할 경우에
DAO를 목킹(mocking)하여 서비스 계층의 코드만 단위 테스트 할 수 있습니다.

테스트 하지 않을 것

DAO쪽으로 단순 위임하는 코드는 테스트하지 않습니다.

	public PurYearPlanDetail getPurYearPlanDetailById(int detailid) {
return dao.getPurYearPlanDetailById(detailid);
}

테스트 할 것

  • 서비스 인터페이스에 새로 추가하고 구현한 메서드
  • OSAF의 GenericService에서 상속받은 것을 재정의한 메서드

OSAF의 GenericService에서 상속 받은 것 중에서 재정의한 메서드를 테스트 합니다.

	public void update(PurYearPlan entity) {
super.update(entity);
entity.calcAll();
}
  • 비즈니스 로직

서비스에 포함되어 있는 복잡한 비즈니스 로직을 테스트 합니다.

	public void addPurYearPlanDetail(int yearplanid, PurYearPlanDetail detail) {
detail.calcAmount();
get(yearplanid).addDetail(detail);
}

public String getAutoGeneratedCode(Date year) {
String currentCode = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
String syear = formatter.format(year);

String previousCode = dao.getCurrentCode(year);
if (previousCode != null) {
Integer currentNo = Integer.valueOf(previousCode.substring(4)) + 1;
currentCode = (currentNo / 10) > 0 ? syear + currentNo.toString()
: syear + "0" + currentNo.toString();
} else {
currentCode = syear + "01";
}
return currentCode;
}

테스트 코드 작성 방법

  • Mockito 러너 추가

MockitoJUnitRunner를 추가합니다.

  • 테스트 클래스 이름

테스트 대상인 클래스 이름에 UnitTest를 붙여줍니다.

@RunWith(MockitoJUnitRunner.class)
public class PurYearPlanServiceImplUnitTest {

}
  • 의존성 Mocking

@Mock을 사용해서 의존하는 인터페이스에 대한 목 객체를 만들고, @Before를 붙인 setUp 메서드에서 테스트 객체에 주입해 줍니다.
@Mock을 이용하면 mock(PurYearPlanDao.class); 같은 코드를 호출하지 않아도 MockitoJUnitRunner에 의해 자동으로 목 객체가 생성됩니다.

@RunWith(MockitoJUnitRunner.class)
public class PurYearPlanServiceImplUnitTest {

PurYearPlanServiceImpl service;
@Mock PurYearPlanDao mockDao;

@Before
public void setUp() {
service = new PurYearPlanServiceImpl();
service.setDao(mockDao);
}
...
}
  • 테스트 작성

테스테에 필요한 객체들을 정의하고 테스트 이후에 변경되는 값의 현재 상태를 확인합니다.
Mockito의 stub()을 사용하여 목 객체가 어떻게 동작해야 하는지 정의해 줍니다.
그런 다음 테스트 하려는 메서드를 실행합니다.
마지막으로 비즈니스 로직이 제대로 수행되었는지 여러 객체의 상태들을 확입합니다.

	@Test
public void addPurYearPlanDetail() throws Exception {
PurYearPlan yearPlan = new PurYearPlan();
int yearplanid = 1;
yearPlan.setId(yearplanid);
PurYearPlanDetail detail = new PurYearPlanDetail();

when(mockDao.get(yearplanid)).thenReturn(yearPlan);

service.addPurYearPlanDetail(yearplanid, detail);
assertThat(yearPlan.getDetails().size(), is(1));
}

생각해 볼 것

  • 목킹을 사용하는 여러 가지 경우를 좀 더 구체적으로 작성해야겠다.
top


[OSAF 테스트 가이드 초안] DAO 통합 테스트

OSAF : 2009.09.01 18:32


어렴풋이 생각은 해봤었는데, 이번 기회에 정리해 보네요. 매우 주관적이며 OSAF 프레임워크를 사용하는 경우에 해당하는 가이드이기 때문에 통용될리는 없다고 생각합니다. 하지만 적어도 저한테는 이렇게 하는 것이 타당해 보이며, 조금만 응용하면, 다른 프레임워크 또는 별도의 프레임워크가 없는 경우에도 어느정도 적절할 것으로 보입니다. 그럼.. 차근차근 정리해 보겠습니다.

DAO 통합 테스트

DAO 테스트는 항상 데이터베이스를 필요로 하기 때문에 통합 테스트로 볼 수 있습니다.

테스트하지 않을 것

  • 프레임워크 코드

OSAF의 GenericDao로부터 상속받은 코드와 하이버네이트 코드는 테스트하지 않습니다.

테스트 할 것

  • 하이버네이트 도메인 모델 검증

도메인 모델에 맵핑 정보가 제대로 설정되었는지 확인합니다.
OSAF GenericDao가 제공하는 save로 도메인 모델을 저장해보는 것으로 확인합니다.

	@Test
public void crud() throws Exception {
Code code = new Code();
code.setCodeCate(CodeCate.CAR_TYPE);
code.setName("BLK");

cd.save(code);
}
  • DAO에서 재정의하는(overriding)하는 addRestrictions 메서드

해당 메서드에서 정의하는 검색 조건과 정렬 옵션에 따른 쿼리가 제대로 동작하는지 테스트 합니다.

	protected Criteria addRestrictions(Criteria c, CodeParams params) {
CriteriaUtils.ilike(c, "name", params.getName(), MatchMode.ANYWHERE);
CriteriaUtils.conditionalEq(c, "codeCate", params.getCodeCate());
c.addOrder(Order.asc("codeCate"));
return c;
}
  • DAO 인터페이스에 별도로 추가한 메서드의 구현체

OSAF에서 상속받지 않은 코드로, DAO 인터페이스에 추가하고, DaoImpl 클래스에서 구현한 메서드도 테스트가 필요합니다.

//DAO 인터페이스
public interface CodeDao extends GenericDao<Code, CodeParams> {
public List<Code> findByCodeCate(CodeCate codeCate);
}

//DAO 인터페이스 구현체
@Repository
public class CodeDaoImpl extends GenericDaoImpl<Code, CodeParams> implements CodeDao{

...

@SuppressWarnings("unchecked")
public List<Code> findByCodeCate(CodeCate codeCate){
return super.getSession().createCriteria(Code.class).add(
Restrictions.eq("codeCate", codeCate)).list();
}

}

테스트 코드 작성 방법

  • 스프링 @Test 선언

애노테이션 추가: DAO 테스트에 스프링 테스트 러너, 설정 파일 위치, 트랜잭션을 설정합니다.

테스트 설정 파일 위치: 테스트용 스프링 설정파일은 test 폴터 밑에 위치한 testApplicationContext.xml을 사용합니다.

트랜잭션 설정: OSAF의 DAO는 트랜잭션 당 세션을 유지하기 위해 getCurrentSession()을 사용하고 있기 때문에 @Transactional을 반드시 추가해야 합니다.

테스트 클래스 이름: 테스트할 DAO 구현체 이름뒤에 Test를 붙여서 작명합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/testApplicationContext.xml")
@Transactional()
public class CodeDaoImplTest {

}
  • DBUnitSupport 클래스 상속.

DBUnit을 편하게 사용할 수 있도록 DBUbnitSupport 클래스를 상속 받습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/testApplicationContext.xml")
@Transactional()
public class CodeDaoImplTest extends DBUnitSupport{

}
  • 테스트 데이터를 적성합니다.

XML 테스트 데이터가 필요한 경우 테스트 클래스와 동일한 패키지에 두어 접근성을 높여줍니다.
XML 테스트 데이터는 다음과 같이 작성합니다.

<dataset>
<code id="1" name="test" codeCate="10" />
<code id="2" name="test" codeCate="10" />
<code id="3" name="test" codeCate="20" />
<code id="4" name="test" codeCate="20" />
</dataset>
  • 테스트를 작성합니다.

테스트 데이터가 필요한 테스트는 DBUnitSupport에서 상속받은 insertXmlData();
또는 inserXlsData(); 메서드를 이용하여 테스트 데이터를 넣어줍니다.

	@Test
public void search() throws Exception {
insertXmlData("testData.xml");
CodeParams params = new CodeParams();
OrderPage orderPage = new OrderPage();

params.setName("te");
assertThat(cd.search(params, orderPage).size(), is(4));

params.setName("");
params.setCodeCate(PersistentEnumUtil.valueOf(CodeCate.class, 20));
assertEquals(2, cd.search(params, orderPage).size());
}

생각해볼 것

  • 테스트 데이터베이스와 실제 데이터페이스가 다르다

배포용으로는 MySQL을 사용하면서 테스트할 때는 HSQL을 사용한다. 과연 제대로 테스트 했다고 볼 수 있을까?



top


OpenSprout Nexus 이용하여 스프링 3.0 라이브러리 추가하기

OSAF : 2009.04.13 10:11


참조:
Spring 3.0 (4) - Maven에서 Spring 3.0 최신버전 사용하기
Spring3.0 (5) - 스프링 모듈의 의존관계
Maven의 version range를 사용할 때 주의할 점

일단 사부님이 관리 중인 OpenSprout Nexus를 메이븐 settings.xml나 프로젝트의 pom.xml에 등록해 주세요.

<repository> 
    <id>spring-latest</id> 
    <name>Spring Latest by OpenSprout</name> 
    <url>http://www.opensprout.org/nexus/content/repositories/spring-latest</url> 
</repository> 

다음으로 스프링 번들 리파지토리도 등록해주세요.

<repository> 
    <id>com.springsource.repository.bundles.external</id>  
    <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name> 
    <url>http://repository.springsource.com/maven/bundles/external</url> 
</repository>

이제 준비는 끝났습니다. 본격적으로 스프링 3.0 라이브러리를 추가하면 됩니다. 추가하는 방법은 두 가지가 있을 수 있습니다. 모든 라이브러리를 직관적으로 명시해주는 방법과 추이적 종속성을 이용하여 반드시 명시해야 할 것만 명시하는 방법이 있습니다.

사용자 삽입 이미지
원본 이미지: http://toby.epril.com/?p=598

사부님이 그린 그림을 보면 빨간색 박스로 표시한 라이브러리만 추가하면 파란색으로 칠한 모든 라이브러리를 추이적으로 가져올 거라는 것을 알 수 있습니다. 따라서.. pom.xml에 다음과 같이 설정하면 스프링 라이브러리 중에 필요한 것은 대부분 가져옵니다.

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.web.servlet</artifactId>
            <version>[3.0.0.BUILD-00000000000000,9.9.9.BUILD]</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.aspects</artifactId>
            <version>[3.0.0.BUILD-00000000000000,9.9.9.BUILD]</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.orm</artifactId>
            <version>[3.0.0.BUILD-00000000000000,9.9.9.BUILD]</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.test</artifactId>
            <version>[3.0.0.BUILD-00000000000000,9.9.9.BUILD]</version>
        </dependency>

버전 범위 표시를 저렇게 한 이유는 세 번째 참조 글에서 확인할 수 있습니다.

이렇게 해서 가져온 라이브러리들을 M2Eclipse 플러긴의 Dependency Graph 또는 Dependency Hierarchy로 확인할 수 있습니다.

사용자 삽입 이미지
사용자 삽입 이미지

스프링 3.0이 어떤 제 3 라이브러리(어떤 버전을) 사용하는지 궁금하다면

http://spreadsheets.google.com/pub?key=ppDRa3Yit-05zS2cqWYFlNA

사부님이 작성하신 위 문서를 참조하시면 됩니다.

나이스!! 이제는 드디어 스프링 3.0 개발을 시작합니다~
top


Why OSAF 1. 테스트 코드를 익힐 수 있습니다.

OSAF : 2008.11.10 22:04


OSAF를 공개한지 한 달이 아직 안 됐습니다. 10월 23일에 공개했었죠. 지금까지 약 200에 가까운 다운로드를 기록하고 있지만, 전혀... 아무런... 반응이 없다는 것에는 가히 놀라울 뿐입니다. 그냥 제가 쓴 글의 댓글 몇 개 정도 뿐의 관심이 저에게 한 편으로는 아쉬움으로 또 다른 한 편으로는 오기로 다가옵니다.

완전 최첨단 프레임워크인 OSAF에 왜 이렇게 관심이 없을까. 고민을 많이 했습니다. 어렵나? 메이븐 떄문인가? 그거 없어도 되는데. 문서가 부족하긴 부족하고. 그래도 어떻게 이렇게 조용할 수가 있지. 홈피 디자인이 좀 구리긴 한데.. 그거 때문인가? ㅋ. OSAF 발음이 너무 어려운가? 별에 별 생각을 많이 했습니다. 당연히 기운도 빠집니다. OSAF를 공개한 건 어쩌면 OSAF에게 못씁짓을 한 건 아닌지 말이죠.(Max님의 '어디가서 밥은 먹고 다녀야 할텐데..' 라는 댓글이 생각납니다.)

긍정적으로 생각하기로 했습니다. 언젠가는 빛을 보겠지. 열심히 계속 가꾸다 보면 언젠간 알아주겠지. 하고 말이죠. 그래서 OSAF가 여러분에게 어떤 도움을 줄 수 있을지 생각하고 알려드리기로 했습니다. 그 중 첫 번째가 바로 테스트 코드입니다.

OSAF의 테스트 커버리지는 60%가 조금 넘습니다. (앞으로 차차 올릴 예정입니다.) 60%의 테스트 커버리지는 전부 OSAF 개발팀에서 직접 작성한 테스트 코드입니다. 어딘가에서 배껴온 코드가 절대로 아닙니다. 테스트는 초기에 JUnit과 EasyMock을 사용해서 작성 했었습니다. 물론 스프링 테스트 기능도 사용하고 있죠. 배포 직전에는 EasyMock을 Mockito로 교체하여 비슷한 테스트를 보다 깔끔하고 직관적이며 적은 수의 코드로 대체할 수 있었습니다. DBUnit을 확장하여 OSAF가 제공하는 테스트 케이스를 이용하면 DAO 테스트가 매우 간편해질 것 입니다.

이렇게 좋은데... 한 번 들여다 보고 뭐라고 해주시지 않으시겠어요? 좋다. 잘했다. 고맙다. 이런거 말구요. 이 부분의 테스트는 이해가 안 된다. 테스트가 조금 이상하다. 이 부분의 테스트는 왜 안했냐. 어려워서 그런거냐? 이 부분의 테스트는 이렇게 고치는게 좋치 않겠냐? 이런.. 반응이 제가 가장 좋아하는 반응이자 OSAF에게 거름을 주는 방법입니다.

소스 코드는 굳이 다운 받지 않아도(장기적으론 받아 두시면 좋겠지만..)

http://www.opensprout.org:9060/browse/OSAF/osaf/trunk

위 링크로 가시면 웹에서 직접 볼 수 있습니다. 소스 코드나 OSAF 와 관련하여 문제나 제안하고 싶은 것이 있다면 주저하지 마시고 이슈를 등록해 주세요.

http://www.opensprout.org/jira/secure/Dashboard.jspa


top


S2DS(SpringSource DM Server) build by OpenSprout 1.0.0

OSAF : 2008.11.09 23:47


스프링소스의 정책이 바껴서 커뮤니티 버전은 직접 빌드를 해야합니다. S2DS라는 멋진 툴 한 번 돌려 보시려면 얼마나 귀찮으세요. Ant로 빌드해야 되는데, readme.txt도 안 읽어보면 어디가서 빌드해야 되는지도 잘 모르겠고, 잘 찾아가서 ant를 실행한다고 해도 OutOfMemory라도 만나는 날에는 정말이지.. 아휴~.

그래서 저희 OpenSprout에서는 다운로드 후 바로 실행해 볼 수 있는 S2DS를 제공하고 있습니다. 빌드하기 귀찮으신 분들에게 이 보다 더 좋은 서비스는 없을 겁니다. 그냥 한 번 빌드해서 실행보려고 해도 갑작스런 에러때문에 당황스러울 수 있는데요. 그런 에러까지 이미 제가 마루타 삼아 겪어보고 빌드했기 때문에 믿고 사용할 수 있는 배포판입니다.

OpenSprout 빌드 서비스. S2DS뿐 아니라, 앞으로 SpringSource 모든 제품을 빌드해서 제공해 드리겠습니다. 완전 사랑스럽죠? 헤헷

다운받고 -> 압축풀고 -> bin/start.sh 실행 -> localhost:8080 접속.

사용자 삽입 이미지

짝짝짝짝짝짝..

다운로드
top


OSAF 1.0.0-M2는 스프링 2.5.6 기반 프레임워크~

OSAF : 2008.11.05 11:52


국내 최초 아니 어쩌면 세계 최초 스프링 2.5.6 기반 애플리케이션 프레임워크가 될지도 모릅니다. 크하하하. 최첨단 프레임워크니까 이 정도는 해줘야겠죠?

나오자마자 바로 업그레이드. 이럴 땐 메이븐이 편하긴 합니다. pom.xml에서 프로퍼티 사용해서 버전만 바꿔주면 되거든요.

    <properties>
        <slf4j.version>1.4.3</slf4j.version>
        <spring.version>2.5.6</spring.version>
        <java.version>1.5</java.version>
    </properties>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
...

뭐 이런 식입니다. 어떻게 사용하는지 대충 아시겠죠?

인증샷 올립니다



top


OSAF를 일반 자바 프로젝트로 읽어 들이는 방법

OSAF : 2008.11.03 23:10


OSAF는 꼭 메이븐 프로젝트가 아니여도 사용할 수 있습니다. 아마 메이븐 때문에 OSAF를 접하시는 분들이 어렵게 느끼시는 것 같은데요. 다음에 배포할 때는 일반 자바 웹 프로젝트 예제도 같이 넣어두겠습니다.

지금은 일단 사용법만 간단하게 보여드리겠습니다.


웹 프로젝트 샘플도 이와 비슷하게 사용하시면 되겠죠?? 음냐.. 내일은 OSAF 아키타입을 보여드리겠습니당.
캬오.. 1일 1스크린캐스팅이 되겠네요. OSAF 말고도 스프링+하이버 게시판 개발 스크린캐스팅도 찍어야 되는데 말이죠. :)

top


7분 완성. CRUD 개발 쑈!!!(with OSAF)

OSAF : 2008.10.31 23:20




검색하다가 NG가 났는데, 영문 검색은 잘 됩니다. 한글 검색시 인코딩 때문에 문제가 좀 있네요. 전에도 발생했던 문제인데, 톰캣 설정(사부님왈. bodyfor어쩌구..)을 조금 수정하면 간단하게 고칠 수 있을 것 같습니다.

실제 동영상 런타임이 7분 49초인데, 설명 없이 코딩만 샥샥 하면 분명 3분 미만으로 CRUD 개발을 완성할 수 있습니다. 그렇게 만들어 놓고 세부적인 검색 조건과 파라메터 들을 추가하면서 개발 해 나간다면... 캬오... 멋지지 않아요??!!!

2008/10/24 - [Screen Casting] - OSAF 빌드하기
2008/10/28 - [OSAF] - OSAF 샘플 코드 실행하기(스크린캐스팅)

이것으로 OSAF 스크린캐스팅 시리즈 세 개가 완성됐습니다. 캬~
다음 스크린캐스팅은 OSAF 아키타입으로 웹 개발 시작하기. 입니다. 많이 기대해주세요.

ps: 요즘 다운로드 수가 바닦을 치던데.. 받으실 분들은 다 받으신 건가요. :)

top


OSAF에 참여하고 싶은 개발자

OSAF : 2008.10.31 11:39


메일 한 통이 날아왔습니다. 흠.. 한 단어의 영문 이름과 제목도 한 단어. hi.

'스팸인가...스팸이라고 하기엔 너무 단순한데..'

그래서 열어봤습니다.

캬오.. 소스포지에서 소스 코드만 보고 찾아온 것 같네요. 그래서 프로젝트 사이트 알려주고, 어떻게 참여하고 싶은지 물어보는 답멜을 보내줬습니다.

한국에 계신 분들도 참여하실 분 계시면 말씀하세요~
top


OSAF 샘플 코드 실행하기(스크린캐스팅)

OSAF : 2008.10.28 23:44



top


OpenSprout IRC 서버로 오세요.

OSAF : 2008.10.28 09:50


원문: http://www.opensprout.org/wiki/pages/viewpage.action?pageId=2162739

Introduction

OpenSprout에서 발표한 OSAF 프레임워크나 Spring에 대해서 질문이나 의견 나누실 분들 또는 다른 개발자들과 이런 저런 채팅을 원하시는 분들은 언제든 환영합니다. IRC서버 운영이 생전 처음이라 미흡한 점이 있을 것 같아 일단 KSUG분들을 중심으로 시범 운영해보려고 합니다.

How-to

IRC 클라이언트 설치

mirc같은 상용 제품도 있지만, 파이어폭스 플러긴 Chatzilla를 이용할 수도 있습니다. 파이어폭스 기준으로 설명하겠습니다.

  • 도구 -> 부가기능 클릭
  • 전체검색 탭 클릭
  • irc로 검색
  • chatzilla 설치 및 파폭 재시작.

Chatzilla 설정하기

위에서 Chatzilla를 설치했다면, 이제 도구 -> Chatzilla 메뉴가 생겼을 겁니다. Chatzilla를 이용해서 클라이언트 프로그램을 실행하면 조그만 창이 뜹니다.

일단 설정 화면(ChatZilla -> Preference)에 들어가서 인코딩 설정을 해줍니다.

부가적으로 Gloval 탭의 중간쯤에 알람 설정을 할 수도 있습니다. 다른 사용자가 메시지를 입력했는지 알고 싶다면 해당 탭에서 beep 또는 wav 파일 위치를 설정하면 됩니다.

이제 채팅하기

/server www.opensprout.org

이렇게 OpenSprout IRC 서버로 접속합니다. 접속이 되면,

/list

list 명령어로 현재 개설된 채널을 확인할 수 있습니다. OSAF 채널은 항상 열려있습니다. 따라서,

/join OSAF

이렇게 OSAF 채널로 들어오시면 됩니다.


top


OSAF의 특징

OSAF : 2008.10.24 12:32


OSAF는 스프링, 하이버네이트 기반 애플리케이션 프레임워크입니다. 라는 다소 두리 뭉실한 소개로는 대체 어떤 특징이 있는지 애매 모호 하실 것 같아서 OSAF가 가지고 있는 특징을 설명하겠습니다.

1. 제네릭 활용

GenericDao는 많이 듣고, 알고, 사용하고 있으리라 생각합니다. 하지만, OSAF에는 하이버네이트 기반의 GenericDao 뿐만 아니라, GenericService, GenericController 기능을 제공합니다. 따라서 GenericDao를 사용했을 때의 장점을 그대로 살려서 Service와 Controller 계층에서도 빠르고 간편하게 CRUD 개발이 가능하다는 것입니다. 또한, GenericPropertyEditor를 제공하여 스프링의 커스텀 프로퍼티 에디터 작성을 지원하고 있습니다. 훨씬 쉽고 빠르게 커스텀 프로퍼티 에디터를 작성하실 수 있을 것으로 생각합니다.

2. 태그 파일 활용

JSP 기반 뷰 코드를 컴포넌트화 하여 태그 파일로 만들었습니다. 이로 인해 JSP를 모르는 사람도 몇 개의 태그만 익히면 빠르게 뷰를 만들 수 있습니다. 이는 곧 생산성으로 직결될 것입니다. OSAF는 add, update, grid, search 등의 기본 뷰와 레이아웃을 제공합니다. 일반적인 JSP 파일이기 때문에, 얼마든지 워하는 대로 커스터마이징이 가능합니다.

3. 스프링 2.5 기반 프레임워크

스프링 2.5의 가장 큰 변화이자 핵심은 애노테이션 활용 극대화입니다. 애노테이션으로 XML 설정을 최소화 했기 때문에, 더 이상 여러 명의 개발자가 빈 설정 파일 하나를 수정해서 커밋하다가 충돌나고 어쩌구 저쩌구 하는 복잡한 일이 벌어질 여지를 최소화 했습니다. 또한, 스프링 MVC의 경우처럼 클래스 상속 구조를 애노테이션으로 대체하여 POJO 개발이 가능하도록 개선된 부분도 있습니다. 컴포넌트 스캔과 오토 와이어링을 비롯한 많이 기능이 애노테이션을 기반으로 하고 있습니다. OSAF는 스프링 2.5가 제공하는 애노테이션 기능들을 매우 잘 활용하고 있습니다.

4. 하이버네이트 기반 프레임워크


하이버네이트를 사용하여 도메인 중심의 개발이 가능합니다. 하이버네이트 기반 DAO를 제공하며, 하이버네이트에 특화된 기능 flush(), clean() 등의 인터페이스를 사용할 수 있습니다. 또한 하이버네이트를 사용하여 DB 교체가 용이하기 때문에 테스트 DB와 실제 배포 환경 DB가 다르더라도 편하게 개발할 수 있습니다.

5. CRUD 초고속 개발

위의 모든 특징들은 바로 이 것으로 귀결 됩니다. 별다른 코드 생성기나 IDE가 없이도, 직접 C&P를 해가면서 5분 이내에 한 도메인에 대한 CRUD 개발이 가능합니다. 여기서 CRUD 개발에 필요한 파일은 전부 12개 정도로, 자바 클래스 8개. 뷰 4개 정도 입니다. 이 코드는 예제 코드를 복사하여 붙여 넣고 find/replace 기능을 사용하여 이름만 바꾸면 작업이 종료됩니다. 컴포넌트 스캔과 애노테이션 활용을 극대화 했기때문에, 빈 설정을 건드릴 필요도 없으며, 하이버네이트 기반이라 테이블을 만들 필요도 없습니다. 태그 파일을 활용했기에 뷰도 정말 간단하게 편집하여 재사용할 수 있며, 제네릭 서비스와 컨트롤러의 역할은 두 말할 필요가 없습니다.

이상이 OSAF의 가장 큰 특징 다섯 가지입니다. 세부적인 기능에 대해서는 차차 또 공개하겠습니다. 급하신 분들은 소스 코드를 다운로드 하여 직접 확인해 보시기 바랍니다. :)

ps: OSAF 말고 OpenSprout에 대해 궁금하시다면, 여기를 참조하세요.
top


OSAF 빌드하기

OSAF : 2008.10.24 10:49




프로젝트를 받으시면, dist 폴더에 jar 파일이 들어있으니까, 직접 빌드를 하시진 않아도 되지만, 그래도.. 재미삼아 한 번 해보세요.ㅋㅋ

빌드 할 때 주의함 점이 하나 있는데요. 위에서처럼, JDK 버전이 1.6이 아닌 경우에 에러가 날 수 있습니다. 그럴 떄는 pom.xml을 열어서 jdk.version 프로퍼티를 1.5로 수정해주시면 됩니다. 위 동영상에서도 똑같은 현상이 벌어졌으니 참고하시면 되겠습니다.

참고로 OSAF는 JDK 1.5 이상에서만 사용할 수 있습니다. 1.4 이하는... ( --) 몰라요..ㅋㅋㅋ
top


OSAF 다운받기

OSAF : 2008.10.24 08:41


OSAF 소스포지 링크를 클릭하면 다음과 같이 두 개의 파일이 보입니다.


위에 있는 녀석은 OSAF 의존성 라이브러리들을 osaf홈/lib 폴더에 모두 담고 있습니다. 메이븐을 사용하지 않을 때는 거기에 있는 모든 라이브러리를 클래스패스에 추가해서 사용하시면 됩니다.

메이븐을 사용하실 때에는 아래에있는 1메가 남짓의 파일을 받으시면 됩니다.

소스포지를 이용해주시면 다운로드 집계가 되기 때문에 차후에 통계 자료를 참고할 수 있습니다.

한 가지 방법이 더 있는데, 메이븐 리파지토리에 OSAF 메이븐 저장소를 등록하신 다음, 다음의 dependency 설정을 pom.xml에 추가하는 방법이 있습니다.

<dependency>
        <groupId>org.opensprout</groupId>
        <artifactId>osaf-core</artifactId>
        <version>1.0.0-m1</version>
</dependency>

이렇게만 추가하면, 필요한 모든 라이브러리까지 알아서 끌어오기 때문에 매우 편리합니다.

OSAF 저장소를 추가하는 방법도 간단합니다.

<project>
...
    <repositories>
...
        <repository>
            <id>osaf.repository</id>
            <name>OSAF Repository</name>
            <url>
                http://www.opensprout.org:8082/nexus/content/groups/public/
            </url>
        </repository>
...
    </repositories>
..
</project>

top


OSAF(OpenSprout Application Framework) 1.0 M1 공개

OSAF : 2008.10.23 17:17



(쇼팽, 연습곡 25번, 겨울바람)

사용자 삽입 이미지

토비님과 제가 주관하는 OpenSprout에서 OSAF 1.0을 드디어 공개합니다.

OSAF는 스프링, 하이버네이트 기반의 자바 애플리케이션 프레임워크입니다. 그리고 OSGi 플랫폼에 설치하여 사용할 수 있는 번들이기 때문에, 필요한 패키지만 import 할 수 있다면, 얼마든치 번들로 설치가 가능합니다.

주요 기능으로는 자바 5의 Generic 사용을 극대화 했으며, 진정한 스프링 2.5 애노테이션 활용을 볼 수 있습니다. 제공하는 기능에 비해 프레임워크의 크기는 전혀 크지 않습니다. 인터페이스 포함 클래스 갯수는 46개 정도입니다. 태그 파일, 자바스크립트, 이미지 파일까지 포함해서 1메가가 조금 넘는 크기입니다.

스프링, 하이버 학습 시 또는 자바 5이상 프로젝트에 자유롭게 사용하시기 바랍니다. 아! 주의할 것이 있는데, OSAF는 EPL 라이선스라는 것입니다. 단순한 사용에는 아무런 제약이 없지만, 저희 코드를 수정하거나 복사하여 재 배포 할 시 해당 코드도 반드시 공개해야 합니다. 이 점 주의해 주시기 바랍니다. :)

현재 버전은 OSAF 1.0.0 M1 입니다. 아직은 부족한게 많아서 마일스톤 버전으로 공개합니다. 이번 배포 버전에는 OSAF-Core 모듈과 OSAF 기반의 웹 애플리케이션 샘플을 같이 제공하고 있습니다.

http://www.opensprout.org/wiki/display/os/OpenSprout+Application+Framework

위 페이지가 OSAF 위키 페이지입니다. 저곳을 중심으로 OpenSprout 관련 위키 글을 정리할 예정입니다.

https://sourceforge.net/project/showfiles.php?group_id=158280&package_id=177263


소스 코드는 위 링크에서 다운로드 할 수 있으며, depedency 라이브러리들을 몽땅 포함하고 있는 17M 정도의 osaf-1.0.0-m1-with-dependency.zip과 라이브러리는 제외한 osaf-1.0.0-m1.jar 파일을 받을 수 있습니다.

현재는 문서도 많이 부족하고, 주석도 충분치가 않습니다. 물론 코드 완성도도 조금 떨어집니다. 그런 부분들은 앞으로 버전을 올리면서 차차 보완할 예정입니다. 그리고 스크린캐스팅을 통해서 OSAF 사용법을 자주 올릴 예정이오니, 기대해주시기 바랍니다. 그리고 개선할 부분이나 문제가 있다면 번거롭더라도 이슈를 올려주시면 감사하겠습니다.

관련 사이트는 다음과 같습니다.

OpenSprout 홉 페이지: http://www.opensprout.org/wiki/display/os/Home
OSAF 배포 소식: http://www.opensprout.org/wiki/display/os/Release
OSAF JavaDoc: http://www.opensprout.org/api/
OSAF 이슈 트래커: http://www.opensprout.org/jira/browse/OSAF
OSAF 소스 코드 뷰: http://www.opensprout.org:9060/browse/OSAF/osaf/trunk
OSAF 커버리지: http://www.opensprout.org/coverage/
top

TAG 1.0.0 M1, OSAF