'Java'에 해당되는 글 74건

  1. 2008.08.22 골치 아픈 문제 해결 _ Spring, Hibernaate
  2. 2008.08.20 OWASP - Open Web Application Security Project
  3. 2008.08.20 hdiv HTTP DATA INTEGRITY VALIDATOR
  4. 2008.08.20 APPLICATION SECURITY STRATEGIES
  5. 2008.08.11 Annotation 기반의 Spring Controller에서 Interceptor 사용하기
  6. 2008.08.08 FreeMarker as Sitemesh decorator
  7. 2008.08.07 Velocity or FreeMarker
  8. 2008.08.05 Serializing Java and C# objects with WOX
  9. 2008.08.01 이런 삽질을 하다니... DWR, Spring (2)
  10. 2008.07.31 Maven에서 불필요한 의존성 제거하기 (2)
2008.08.22 13:21

골치 아픈 문제 해결 _ Spring, Hibernaate

진행중인 프로젝트에서, 어제 문제가 약간 발생했었다.
두 개의 테이블이 있는데, Child table에는 parent에 종속된 개수 만큼 로우가 저장된다.
Cabinet이라는 테이블과 Door라는 테이블이 1 - N으로 되어 있다. Door에는 Cabinet에서 설정된 문 개수만큼 로우가 들어가게 된다. 그리고 편하게 처리하기 위해서 Cabinet에도 Door_Count라는 컬럼을 가지고 있다. 명백하게 말하면 정규화 제 2법칙인가를 위반하고 있다. 종속성이 있으니깐(이게 맞나 ㅎㅎ)
그래도 손쉽게 쿼리를 만들기 위해서 이렇게 처리 했다. 그런데 Door는 개수가 변경 되더래도, 줄어든다면 이전의 Door 번호는 Deleted 라고 컬럼이 설정 되고 실제로 지워지지는 않는다. 그리고 초기 등록 시 문 개수가 4개라도 6개의 데이터가 들어가서 1 ~ 4번은 valid 하고 5, 6번 문은 상태를 delete로 변경해 둔다.
이 때 Cabinet을 중심으로 Door까지 join select하면 Hibernate Filter 기능으로 Door가 delete되면 select 하지 않는다.
문제는 여기에서 발생했다. 이전에 Door가 4개 였다. 다시 6으로 바꾸려면, Door Object의 delete 속성을 false로 바꿔야 하는데, 이 때 실제로 fetch 된 Door는 delete가 false인 것들 즉 4개만 select 되어 버린다. 따라서 update가 제대로 이루어 지더래도, Cabinet의 door count는 6이지만 실제로 Door의 데이터는 변함이 없게 된다.
Hibernate를 사용하고 Service 레이어에서 Transaction을 사용하기 때문에 Hibernate Session 관련 문제가 발생할 수 있기 때문이다.
그래서 Session이 살아 있는 상태에서 1-N 관계가 Fetch 속성이 Lazy라도 object.getXXX 하면 select 문을 날리게 된다.
이 때 select 된 object와 해당 테이블에 직접 select 해서 가져온 object가 동일한 pk를 가진 object들이 겹치기 때문에 변경을 하게 되면 Exception이 발생하게 된다.
그래서 혹시나 하고 Cabinet 오브젝트에 Doors를 재 설정할 수 있게 만들었더니 깔끔하게 해결이 되었다.

public void resetDoors(List<Door> doors) {
        this.doors.clear();
        this.doors.addAll(doors);
}

이 걸로 해결이다.

서비스 레이어는 다음과 같다.
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public Cabinet updateCabinet(Cabinet entity) {
        Order[] orders = new Order[] {Order.asc("id.doorCode")};
        Criterion criterion = Restrictions.eq("cabinet.cabinetCode", entity.getCabinetCode());
        List<Door> listDoors = doorDAO.findByCriteriaOrder(orders, criterion);
       
        for (Door door : listDoors) {
            if (door.getId().getDoorCode() > entity.getIntDoorCount()) {
                door.setIsDeleted(true);
            } else {
                door.setIsDeleted(false);
            }
        }
       
        entity.resetDoors(listDoors);
       
        cabinetDAO.makeSaveOrUpdate(entity);

        return entity;
}

잘 해결되어서 다행이다.
아직 Hibernate가 서툴러서, DB 설계도 서툴러서 생기는 문제인데...
아주 많이 더욱더 공부해야 겠다.
신고
Trackback 0 Comment 0
2008.08.20 09:27

OWASP - Open Web Application Security Project

OWASP Overview

The Open Web Application Security Project (OWASP) is a worldwide free and open community focused on improving the security of application software. Our mission is to make application security "visible," so that people and organizations can make informed decisions about application security risks. Everyone is free to participate in OWASP and all of our materials are available under a free and open software license. The OWASP Foundation is a 501c3 not-for-profit charitable organization that ensures the ongoing availability and support for our work.
신고
Trackback 0 Comment 0
2008.08.20 09:24

hdiv HTTP DATA INTEGRITY VALIDATOR

hdiv   HTTP DATA INTEGRITY VALIDATOR

Java Web Application
Security Framework

Protect your web applications against attacks


신고
Trackback 0 Comment 0
2008.08.20 09:21

APPLICATION SECURITY STRATEGIES

APPLICATION SECURITY STRATEGIES

  1. Files that shouldn't be publicly accessible
  2. Functionality that's browser specific
  3. Flaws that are user-specific
  4. Operating system and Web server weaknesses
  5. Form input handling
  6. Application logic
  7. Authentication weaknesses
  8. Sensitive information transmitted in the clear
  9. "Possible" SQL injections
  10. False sense of firewall or IPS security
신고
Trackback 0 Comment 0
2008.08.11 18:02

Annotation 기반의 Spring Controller에서 Interceptor 사용하기

Annotation 기반의 Spring Controller를 사용하는 환경에서는 Annotation을 이용해서 Interceptor를 설정할 수 없다.
그래서 다음과 같이 Interceptor를 설정한다.
<bean id="annotationMapper" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<ref bean="myInterceptor1"/>
<ref bean="myInterceptor2"/>
<ref bean="myInterceptor3"/>
</list>
</property>
</bean>

그런데 이 경우 모든 Annotation 기반의 Controller에 적용되어 버린다는 문제점이 있다고 한다.
그래서 다음 블로그의 저자가 손쉽게 해결 할 수 있는 클래스를 구현했다.
블로그는 다음과 같다.
두 개의 public 클래스를 제공한다.
  • SelectedAnnotationHandlerMapping
  • IgnoreSelectedAnnotationHandlerMapping
첫번째 클래스는 설정한 url만 Interceptor 가 작동하고, 두번째는 설정한 url은 interceptor가 작동되지 않는다.
설정 예제는 다음과 같다.
  • SelectedAnnotationHandlerMapping
<bean id="publicMapper" class="org.springplugins.web.SelectedAnnotationHandlerMapping">
<property name="urls">
<list>
<value>/interceptOnly.do</value>
</list>
</property>
<property name="interceptors">
<list>
<ref bean="myInterceptor"/>
</list>
</property>
</bean>

  • IgnoreSelectedAnnotationHandlerMapping
<bean id="publicMapper" class="org.springplugins.web.IgnoreSelectedAnnotationHandlerMapping">
<property name="order"><value>0</value></property>
<property name="urls">
<list>
<value>/doNotIntercept.do</value>
</list>
</property>
<property name="interceptors">
<list>
<ref bean="myInterceptor"/>
</list>
</property>
</bean>
신고
Trackback 0 Comment 0
2008.08.08 16:02

FreeMarker as Sitemesh decorator

Spring, FreeMarker, Sitemesh를 이용하는 프로젝트 설정 방법에 대한 사이트 주소

신고
Trackback 0 Comment 0
2008.08.07 17:11

Velocity or FreeMarker

그동안 Template Engine으로 Velocity를 사용해 왔다. 몇몇 불편한 점이 있긴 하지만, 그래도 html 생성에 이보다 강력하고 쉬운건 보지 못했었다. 개인적으로 jsp를 잘 모르고 별로 좋아하지 않아서.
항상 아쉬운 점은 jsp tag library의 강력함을 직접 만끽할 수 없다는 데 있었다. 뭐 많은 tag library를 사용할 것은 아니지만, 적어도 jsp tag library로만 지원되는 기능을 사용하기 위해서는, 뭐 사용 할 방법이 없었던 것 같다.
특히 Spring Security를 사용함에 있어서 jsp tag library 만 지원하는 경우라서 전혀 사용 할 방법이 없는 것 같다.
검색을 해 보긴 했지만, 아직까지는 찾지 못했다.
그러던 중 아주 흥미로운 템플릿 엔진을 발견했다. 뭐 예전부터 이름은 들어 왔었지만, 직접 사용해 본 적이 없었다. 게으른 개발자의 아집이라고나 할까, 새로움에 대한 도전이 무서워서 일까...
그 템플릿 엔진이 바로 FreeMarker이다. 이미 Spring MVC에서도 정식적으로 지원하는 View Template이다.
바로 이넘이 jsp tag library를 지원한다. 직접적으로 동일한 문법을 사용하는 것은 아니지만, 가져와서 FTL로 변환해서 사용할 수 있다.
문법이 Velocity와 유사해서(뭐 템플릿 엔진들이 그만 그만 한 것 같다) 쉽게 접근할 수 있었다.
현재 문법만 보고 있는데, Velocity를 대신해서 충분히 사용할 수 있을 것 같다.
몇몇 Velocity와 Freemarker를 비교하는 글들이 있다.
뭐 갑론을박에 대한 내용이지만, 아직은 FreeMarker쪽이 조금 더 우세한 듯 하다. 다만 Apache라는 걸쭉한 커뮤니티의 지원을 받고 있는 Velocity가 더 쉽게 접근 할 수 있다는 장점은 있는 듯 하다.
신고
Trackback 0 Comment 0
2008.08.05 09:10

Serializing Java and C# objects with WOX

WOX 라고 하는 프로젝트가 있다.
Web Objects in XML 이라는 프로젝트 이다. 키 포인트는 Java 및 C# 오브젝트를 XML로 변환, 역변환을 해 주는 프레임웍이다.

주 기능은 다음과 같다고 한다.
  • 사용하기 쉽다. Easy 클래스가 serialization, de-serialization 메소드를 지원
  • 간략한 XML. XML 생성이 아주 간단하고, 이해하기 쉽고, 주 목적은 언어 독립적이라는거(Java, C# 지원)
  • 사용하는 클래스를 변경할 필요가 없음. 기본 생성자 및 accessor 가 불필요
  • Field visibility. private 필드도 다른 필드와 동일하게 serialize됨. WOX는 필드 접근 지정자에 상관없이 사용.
  • Java 및 C# 간의 상호 운용성. Java 오브젝트를 XML 변환하고, 그 XML을 C# 오브젝트로 변화 가능. 물론 그 반대로도 가능
  • 표준화된 XML 오브젝트 표현. 이 부분은 추 후에 다른 OOP 언어도 지원 가능성을 내포
  • 매핑 테이블을 통해서 primitive 데이터 타입을 매핑 가능
  • 클래스 변화에 능동적
  • 다중 배열 지원 - primitive 및 reference 형 모두
  • Byte 배열은 base-64 인코딩으로
  • Lists, Maps 데이터 타입 지원(ArrayList, HashMap -> Java, ArrayList, Hashtable -> C#)
  • Duplicate, Circular object reference를 id/idref 를 통해서 지원
  • 클래스 이름은 String 이름으로 저장됨
  • 실행 파일 크기가 아주 작다. Java는 25k이고 C#은 36k다
이에 대한 언급은 The ServerSide dot Com 에 나와 있다.

이에 대한 커맨트를 살펴보면, 상당히 느리다고 한다. 뭐 항상 대두되는 문제이니깐.

아무튼 Java와 C#을 동시에 사용해야 하는 프로젝트가 있다면, 그리고 속도가 그렇게 큰 관건이 아니라면 한번 도전해 볼 만한 프레임웍인 것 같다.
신고
Trackback 0 Comment 0
2008.08.01 13:15

이런 삽질을 하다니... DWR, Spring

Spring 2.5.5, DWR 2.0 으로 프로젝트를 설정하고 있다. Spring 2.5부터 지원이 되는 Annotation 기반의 Controller를 사용하려고 설정을 했다.
그런데 문제가 발생했다. DWR을 함께 사용해야 하는데, 아무리 설정을 해도 DWR JavaScript을 인식하지 못하는 것이다. 이게 무슨 문제인지 알 수 없어서 어제, 오늘 오전까지 무지하게 삽질만 한 것 같다.
DWR을 쓰려면 Annotation Controller를 사용하면 안된다.
흠.. 이제 한고비 지난 것 같다.
다음은 뭐가 기다리고 있을련지...
신고
Trackback 0 Comment 2
2008.07.31 10:18

Maven에서 불필요한 의존성 제거하기

현재 Maven을 사용해서 프로젝트를 진행하려고 준비 중이다.
필요한 라이브러리 및 프레임웍의 의존성을 Maven을 이용해서 처리한다. 또한 Web Application 이기 때문에, 이전에 Ant 스크립트로 처리 했던 부분을 간편하게 Maven으로 처리하려고 한다.
그런데 문제가 생겼다. Maven의 의존성 관리 때문에 필요없는 라이브러리까지 전부 들어오게 되었다.
이 때 간편하게 처리할 수 있는 방법이 있다.

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

위는 log4j를 사용하기 위한 의존성 선언 부분인데, log4j의 POM 파일을 열어보면 몇가지 불필요한 의존성이 설정되어 있는 것을 알 수 있다.
이 경우 위 처럼  <exclusions /> 이라는 태그를 사용해서 간단하게 불필요한 의존성을 없앨 수 있다.

만약 Eclipse Maven 플러긴을 사용한다면 상당히 요긴하게 사용할 수 있다.

다음의 Maven 사이트에서 의존성 관련 문서를 참조 할 수 있다.


신고
Trackback 0 Comment 2


티스토리 툴바