본문 바로가기

프로그램

[SPRING]SPRING 정리

반응형

lazy-init 속성 : 해당 빈을 미리 만들어둘지 아니면 요청이 오면 만들지 정의해주는 속성

destory-method="close" : dbcp나 c3p0 을 이용하여 jdbc설정시에는 명시해줘야 한다고 함

DriverManagerDataSource 의 경우에는 스프링이 이를 대신해주므로 해당 설정을 할 필요가 없다 함


간단한 구조의 경우에는 DAO와 SERVICE를 합쳐도 무방하다.


전통적 구조

  • 프리젠테이션 => SPRING MVC
  • 서비스 계층 => POJO
  • 트랜잭션 => AOP
  • 데이터엑세스 => JDBC, JPA, 하이버네이트, JDO


오브젝트 중심과 도메인 중심이 있음.


오브젝트 중신음 위의 케이스라 보여짐


도메인 중심의 경우 domain이 단순히 get/set 기능을 가진 것이 아닌

해당 도메인에 관련 로직을 도메인이 종속시키는 방법인듯 함

이 경우 서비스계층에서는 여러 도메인에 걸치는 경우 사용하고 

그외에는 도메인에 종속시킴


하이버네이트 일 경우 가능할 듯 함


기본적으로는 stateless 이나 stateful 도 가능하다고 함


mvc:annotation-drriven


SimpleDriverDataSource


DriverManagerDataSource


lazy-init : 요청 받을 시 bean 생성함


Exception 발생시

HandleExceptionResolve 인터페이스

구현 : SimpleMappingExceptionResolve


@ErrorHandler 를 통해서도 가능


설정 시 property

mappedHandler : 특정 맵 핸들시 셋팅

mappedHandlerClasses : 특정 맵 핸들시 클래스 셋팅

defaultErrorView : 기본 View 페이지 셋팅

defaultStatusCode : 예외가 떳을 때 HTTP 상태코드

exceptionAttribute : 예외가 노출시킨 기본 모델 속성, 기본 => ${exception.message}



메타정보 등록

StaticApplicationContext : 코드에 의해 메타정보를 등록하는 기능을 제공

StaticWebApplicationContext 

GenericApplicationContext : 특정 포맷의 설정 메타정보를 읽어올 수 있음

XmlBeanDefinitionReader : xml파일을 읽어올 때 사용되는 리더

PropertiesBeanDefinitionReader : 프로퍼티 파일을 읽어올 때 사용되는 리더


=> JUnit 에서 annotation 을 통해 사용 시

@ContextConfiguration 설정 시 GenericApplicationContext를 사용할 수 있음


GenericXmlApplicationContext : XmlBeanDefinitionReader와 GenericApplicationContext가 결합

WebApplicationContext


스프링 통해 web.xml 인코딩 설정 방법

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>


@Component

  • 빈 스캐닝 대상이 됨 => bean 으로 생성됨
  • 디폴트로 클래스이름의 첫글자를 소문자로 해서 등록 
  • ("이름") 을 통해서 별도의 빈 이름을 지정할 수 있음


어노테이션 사용 시 사용되는 context => AnnotationConfigApplicationContext

<context:component-scan base-package="~~~"/>


빈으로 생성하는 어노테이슨

@Reposigory => DAO

@Service => Service

@Controller => controller

@Component => 일반 bean


클래스 이용 설정 시 설정할 클래스를 생성 후 Annotation으로 @Configuration 을 선언한다.


설정에 사용하는 자바파일안에서 메서드에 @Bean 선언 시 bean으로 등록된다.

public hello hello() {

return new Hello();

}


이 경우 new 이지만 싱글톤으로 생성된다.


@Configuration 의 메타로 @Component 가 사용되기 때문에 @Configuration 도 bean으로 등록이 된다.


@Configuration 없이 POJO에서 메서드에 @Bean 사용 시 싱글턴이 안되는 상황

=> 내부적으로 @Bean 메서드에서 다른 메서드를 호출하여 주입을 받을 경우


이 경우 new 로 항상 새롭게 생성된다고 한다.


@Resource : 수정자에 정의하면 bean이 주입됨

  • <context:annotation-confir> : 빈 후처리기 등록, 이미 생성된 BEAN을 주입 처리 해주는 듯 함
  • <context:component-scan > : 빈 등록도 자동으로 처리 하는 듯 함


@Resource를 필드에 붙일 경우 수정자가 필요 없음

=> 필드 주입함


@Resource 주입 순서(?)

  1. name 프로퍼티로 검색
  2. 디폴트 이름 검색
  3. type으로 자동 와이어링


@Autowired 시 동일TYPE BEAN이 여러개일 경우 

1. 콜렉션 사용 가능

@Autowired

Collection<Printer> printer;


2. 배열 사용

@Autowired

Printer[] printer;


3. Map 사용

@Autowired

Map<String, Printer> print;


※ 빈 자체가 컬렉션일 경우 @Autowired  이용한 여러개의 같은 타입 Bean 주입은 불가능함


@Qualifier : @Autowired의 세부 정의를 가능하게 함


사용시

@Autowired

@Qualifier("mainDB")


BEAN선언시

- xml

<bean id="oracleDataSource" class="">

<quailifier value="mainDB">

</bean>


- annotation

@Component

@Qualifier("mainDB")

Public class 솰로솰라



@Transactional 을 통해 트랜잭션 처리를 위한 설정


<tx:annotation-drivern transaction-manager="txManager">


<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource">

</bean>



<context:property-placeholder location="classpath:database.properties">

properties 파일을 읽음


List 주입시

<property name="names">

<list>

<value>lee</value>

<value>two</value>

</list>

</property>


SET => list 대신 set

<property name="names">

<set>

<value>lee</value>

<value>two</value>

</set>

</property>


MAP

<property name="names">

<map>

<entity>lee</entity>

<entity>two</entity>

</map>

</property>


Properties

<property name="names">

<props>

<prop>one</prop>

<prop>two</prop>

</props>

</property>


LIST, SET, MAP, Properties 를 Bean으로 등록하고자할 경우

<util:list>

<util:set>

<util:map>

<util:properties>

사용


properties 일 경우에는

<util:properties id="setting" location="classpath::database.properties">


<null /> => Null값을 의미


설정파일에서 치환자 ${} 사용 가능


1. propertie-placeholder 선언

<context:property-placeholder location="classpath:db.properties">


그 후 #{} 를 이용해 접근이 가능함


PropertyPlaceHolderConfigurer 빈이 등록된 후 xml 설정 파일을 치환하게 됨

=> 빈팩토리 후처리기


SpEL을 통해서도 가능함


1. utils:properties 이용하여 properties 빈 등록

<utils:properties location="classpath::db.properties">


Properties 는 Map 인터페이스 구현이므로 spEL 도 get 형식이어야 함

#{dbprops['db.username']}


@value 에서도 사용가능함


PropertyPlaceHolderConfigurer 의 경우 값이 있으면 치환, 없으면 치환문자를 그대로 두기 때문에 문제가 될 수 있음

그에 비해 SpEL 의 경우에는 치환값이 없으면 오류가 발생하는 듯 함


ApplicationContext 도 빈 이므로 주입 가능함

@Autowried ApplicationContext context;


annotation 없을 경우

ApplicationContextAware.setApplicationContext() 를 이용함


Bean 팩토리 역시 bean이므로 주입 가능

@Autowired BeanFactory bf;


서블리 컨텍스트 리소스 읽을 경우 => ResourceLoader 클래스 사용

@Autowired ResourceLoader resourceLoader;


System 클래스 정보값 읽을 경우

System.getProperties() => systemPropertis 로 접근 가능

#{systemProperties['OS.name']}


System.getEnv() => systemEnvironment