본문 바로가기

스프링

[spring] xml_jaxb적용_생성자 단점_2

1.     Com.springsource.javax.activation : Spring java-mail

2.     Com.springsource.javax.mail : Spring java-mail

3.     Com.springsource.org.aopalliance : Spring ProxyFactoryBean

4.     Com.springsource.org.aspectj.tools : AspectJExpressionPointcut 포인트컷 표현식 지원

5.     Com.springsource.junit : junit

6.     Commons-logging : Spring-context가 사용

7.     Mail : java-mail

8.     Mockito : 목 프레임워크 중 Mockito

9.     Mysql-connector : Mysql JDBC

10.   Org.springframework.context.support : Spring java-mail

11.   Spring-aop : 스프링 기능 자체의 aop, Spring ProxyFactoryBean

12.   Spring-bean : 스프링 빈을 활용하는 경우 필요. 스프링의 XML 설정파일과 자바 애노테이션을 파싱 하는데 필요한 클래스 포함

13.   Spring-context : 스프링 코어를 확장한 많은 클래스가 들어 있는데 모든 클래스는 EJB, JNDI(Java Naming Directory Interface), JMX용 클래스와 연동하는데 applicationcontext기능을 사용해야 하며 스프링 리모팅 클래스, 동적 스크립팅 언어(제이루비, 그루비등)와 연동하는 클래스, 빈 유효성검증(JSR-303) API, 스케줄링을 하는 클래스도 포함되어 있다.

14.   Spring-core : 모든 스프링 모듈에서 필요한 모듈. 다른 스프링 모듈에서 사용하는 공통 클래스가 포함됨.

15.   Spring-expression : 스프링 표현언어(SpEL) 지원 클래스 포함.

16.   Spring-jdbc : 스프링이 지원하는 jdbc.

17.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-       @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

18.   Spring-tx : DuplicateKeyException.class 파일 존재 및 스프링 트랜잭션

 

레벨의 역할은 레벨에게 위임

 

User의 역할은 user에게 위임

 

 

Jaxb 컴파일러가 생성해준 domain 이게 무슨말인지 모른다면 jaxb 1편 참조

 

Jaxb 컴파일러가 생성해준 domain

 

xml에서 sql 엘리먼트의 keyvalue 셋팅

XML에 담긴 정보를 읽어오는 방법은 다양하나 JAXB를 사용하겠다. JavaDOM은 자바 리플렉션 처럼 간접적으로 접근하는 불편이 있기 때문에.

 

루트엘리먼트와 자식엘리먼트 선언

 

JDBC, Hibernate, JPA, JDO 와 같은 DataAccess API를 사용하기 위한 인터페이스

 

 

쿼리 분리

쿼리 분리를 위한 xml 생성

2. epril.com : jaxb 컴파일러를 통해 생성된 domain 객체와 매핑되기 위한 네임스페이스

 

jaxb컴파일러를 사용하지 않고 도메인객체 생성시 네임스페이스 필요없음.

1.     스프링 설정 파일<bean> 태그 안에 SQL 정보를 넣어놓고 활용하는 건 좋은 방법이 아니다. 그보다는 SQL을 저장해두는 전용 포맷을 가진 독립적인 파일을 이용하는 편이 바람직하다. 독립적이라고 해도 가장 편리한 포맷은 역시 XML이다.

2.     SQLDAO의 로직의 일부라고 볼 수 있으므로 DAO와 같은 패키지

3.     DBA에 의한 SQL 리뷰나 튜닝이 필요하다면 sqlmap.xml 파일만 제공해 주면 된다. SQL 내용을 변경하더라도 어플리케이션 코드나 DI 설정은 전혀 수정할 필요가 없어졌다.

 

 

쿼리 분리를 위한 Service 생성 및 DI

transactionManager : tx:advice 에 주입해줘야하지만 idtransactionManager이면 생략가능.

041. AOP 트랜잭션 인터셉터 전파속성 편 참조

 

XML이 아닌 Json 등으로 변환될 수 있으므로 인터페이스

 

 

XML 파싱 서비스(jaxb 컴파일용 서비스) 이건 안쓸거임

 

 

스프링에 의해 초기화 될 때 언마샬링(XML > JavaObject) 하여 메모리에 sql을 적재 및 key를 이용해 주는 서비스

1.     언제 JAXB를 사용해 XML문서를 가져올까? DAOSQL을 요청할 때마다 매번 XML 파일을 다시 읽어서 SQL을 찾는 건 너무 비효율적인 방법이다. 특별한 이유가 없는 한 XML 파일은 한번만 읽도록 해야한다.

2.     스프링이 언제 어떻게 빈 오브젝트를 생성할 지 알 수 없으니 조금 막막하긴 하지만, 일단은 간단히 생성자에서 SQL을 읽어와 내부에 저장해두는 방법.

16.   리스트에 쿼리를 저장해도 되지만 키를 이용해 검색속도를 높이는 Map 사용.

30. JAXBException은 복구 불가능한 예외이므로 불필요한 throws를 피하도록 런타임 예외로 포장.

* 생성자에서 예외가 발생할 수도 있는 복잡한 초기화 작업을 다루는 것은 좋지 않다. 생성자에서 발생하는 예외는 다루기 힘들고(잘못된 인스턴스 생성), 상속하기 불편하며(생성자는 자바 클래스의 멤버가 아니므로 상속되지 않는다. 따라서 오버라이딩의 대상이 될 수 없다. 일반 메소드 호출방법으로 호출할 수 없다.), 보안에 문제가 생길 수 있다. 초기 상태를 가진 오브젝트를 만들어놓고 별도의 초기화 메소드를 사용하는 방법이 바람직하다.

* 또한 XML 파일의 위치와 이름을 코드에 고정하는 건 별로 좋은 생각이 아니다. 코드의 로직과 여타 이유로 바뀔 가능성이 있는 내용은 외부에서 DI로 설정해줄 수 있게 만들어야한다.

 

 

sqlservice에서 키가 없을 시 익셉션용. sqlService를 사용하는 DAO에서도 사용할 수 있도록. 또한 꼭 구현할 필요없이 RuntimeException

 

데코레이터 패턴, 프록시 오브젝트 생성을 위한 인터페이스

 

타겟 구현. 스프링 프록시 활용으로 타겟은 트랜잭션 로직이 필요없어짐.

 

메일서버 과부하를 막기위한 테스트 스텁

 

 

DB 접속불가를 위한 목오브젝트를 이용한 테스트

 

목 오브젝트 생성과 add 테스트

 

트랜잭션 테스트

 

 

번거롭게 목, 스텁 오브젝트를 생성하지 않고, 목 프레임웍을 활용한 테스트