728x90

1. Bean 주요 속성

  • class(필수): 정규화된 자바 클래스 이름
  • id: bean의 고유 식별자
  • scope: 객체의 범위 (sigleton, prototype)
  • constructor-arg: 생성 시 생성자에 전달할 인수
  • property: 생성 시 bean setter에 전달할 인수
  • init method와 destroy method

2019/10/29 - [Dev/Web] - [Spring] Bean 설정 - beans:bean

 

 

2. Bean Scope

 

 

3. property 정리

http://jwlee1728.egloos.com/v/1805102

 

더보기

일반적인 bean 선언
<bean id="testBean" class="com.ljw.TestBean" />

id : spring container 에서 유일하게 실별할수 있는 이름
class : 해당 bean의 full path

id 대신 name 속성을 사용할수 있음
<bean name="testBean" class="com.ljw.TestBean" />


facotry 클래스의 getInstace 를 통한 bean 설정
<bean id="testFactory" class="com.ljw.TestFactory"
          factory-method="getInstance"/>
factory-method : 해당 클래스의 객체를 반환해주는 메소드(singleton에서)


생성자를 통한 bean 설정
<bean id="testService" class="com.ljw.Service">
    <constructor-arg>
        <ref bean="testDao"/>
    </constructor-arg>
</bean>

<bean id="testDao" class="com.ljw.TestDao"/>
 
ref : reference, 즉 testDao id(혹은 name)를 갖는 bean을 생성자의 인자로 넘겨주겠다는 의미   

<bean id="testService" class="com.ljw.Service">
    <constructor-arg ref="testDao"/>
</bean>
이것 역시 위와 같은 의미

생성자에 특정 값을 넣우줄 때
<bean id="testService" class="com.ljw.Service">
    <constructor-arg>
        <value> 10  </value>
     </constructor-arg>
</bean>

혹은 다음과 같이 작성가능
<bean id="testService" class="com.ljw.Service">
    <constructor-arg value="10"/>
</bean>

<value type="long"> 3000 </value> 같이 value 값의 type을 지정해줄수도 있다(기본적으로 string으로 인식)
즉 생성자가 여러가지 유형이 있을경우 위와같이 type을 설정해주지 않으면 기본적으로 string type의 생성자를 먼저 고려하게됨



property bean 설정 방식(setXXX 함수 를 이용하여 bean 설정)

<bean id="testServcie" class="con.ljw.TestService" >
    <property name="testDao">
        <ref bean="implTestDao"/>
    </property>
</bean>

<bean id="implTestDao" class="con.ljw.ImplTestDao" />

property : TestService class의 setTestDao method를 의미

즉 위의 설정은 TestService class의 setTestDao 메소드를 호출하면서 인자 값으로 ImplTestDao 객체를 넘겨준다는 의미


<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login/login.mw">loginController</prop>
            </props>
        </property>
    </bean>

props : java.util.properties 클래스로 key, value를 string type으로만 갖는다.
즉 위의 예는 SimpleUrlHandlerMapping 클랙스의  setMappings 메소드를통해 properties 객체를 생성하고
해당 properties 객체는 key="/login/login.mw", value = loginController를 갖고 있게된다.



Bean 객체 범위
<bean name="testDao" class="com.ljw.TestDao"/>

TestDao testDao1 = (TestDao)applicationContext.getBean("testDao");
TestDao testDao2 = (TestDao)applicationContext.getBean("testDao");
위 코드를 통해 생성된 testDao는 동일한 객체이다(스프링 컨테이너 내에서 빈 객체는 싱글턴)

bean scope를 명시하여 서로다른 객체로 생성이 가능한데 다음과 같다.

scope="singleon"  : 기본값이며 스프링 컨테이너당 하나의 빈 객체 생성
scope="prototype" : 빈은 사용할때마다 새로운 객체 생성
scope="request"    :  http 요청마다 새로운 객체 생성(WebApplicationContext에서 사용)
scope="session"    :  세션마다 새로운 객체 생성(WebApplicationContext에서 사용)


<bean name="testDao" class="com.ljw.TestDao" scope="protytype" />
--> bean의 scope 속성값에 설정 하여 사용


list, map 등의 컬렉션 에대한 xml 태크가 있긴하지만 위에 정리된 부분만 봐도
spring xml에 대해 이해가 될거라 판단됨.

 

 

 

Reference

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

https://offbyone.tistory.com/325

http://jwlee1728.egloos.com/v/1805102

 

728x90
728x90

강좌에서 bean이 아닌, beans:bean으로 써서, 무슨 의미인지 찾아보니,

아웃태그를 줄여서 쓰는 것이라고 한다.

 

즉, 아래는

<beans:bean id="test" class="testclass">
  <property name="pw" value="pw"/>
  <property name="id" value="id"/>
</beans:bean>​

다음과 동일하다.

<beans>
  <bean id="test" class="testclass">
    <property name="pw" value="pw"/>
    <property name="id" value="id"/>
  </bean>
</beans>

 

 

 

 

Reference

https://okky.kr/article/478569

728x90
728x90

Reference

 

[스프링] Spring 프레임워크에서 @RequestBody 사용해서 vo를 따로 만들지 않고 Map으로 파라미터 값 자동 매핑(mapping)하기

https://zzznara2.tistory.com/761

 

@ResponseBody 이해하기

https://ismydream.tistory.com/140

 

 

 

 

 

메소드에 @ResponseBody 로 어노테이션이 되어 있다면 메소드에서 리턴되는 값은 View 를 통해서 

출력되지 않고 HTTP Response Body 에 직접 쓰여지게 됩니다.

이때 쓰여지기 전에 리턴되는 데이터 타입에 따라 MessageConverter 에서 변환이 이뤄진 후 쓰여지게 됩니다.

 

MessageConverter 의 종류

- StringHttpMessageConverter

- FormHttpMessageConverter

- ByteArrayMessageConverter

- MarshallingHttpMessageConverter

- MappingJacksonHttpMessageConverter

Jackson's ObjectMappter 를 사용하여 request, response 를 JSON 으로 변환할때 사용되는 MessageConverter 이다.

applicaton/json 을 지원한다.

- SourceHttpMessageConverter

- BufferedImagedHttpMessageConverter

 

아래는 MessageConvert 와 View 를 같이 사용하는 예제

getByIdInJSON 메소드의 경우 @ResponseBody 어노테이션이 있는 반면에 getByidInHTML 은 어노테이션이 없다.

@ResponseBody 가 있는 getByIdInJSON 메소드는 리턴값이 UserModel 객체가 MessageConvert 로 설정된  MappingJacksonHttpMessageConverter 에서 JSON 으로 변환 작업이 이뤄지고

@ResponseBody 가 없는 getByIdInHTML 메소드는 ViewResolver 에 의해 선택된 /WEB-INF/jsp/user.jsp 에서 처리가 이뤄지게 됩니다.

 

자바 코드

@Controller

@RequestMapping("/user")

public class UserController {

 

@RequestMapping( value="/json/{id}", method = RequestMethod.GET)

@ResponseBody

public UserModel getByIdInJSON( @PathVariable String id){

 

UserModel user = new UserModel();

user.setId( id);

user.setName( "ellie");

 

return user;

}

 

@RequestMapping( value="/html/{id}", method = RequestMethod.GET)

public String getByIdInHTML( @PathVariable String id, ModelMap model){

UserModel user = new UserModel();

user.setId( id);

user.setName( "ellie");

 

model.addAttribute( "user", user);

 

return "user";

}

}

 

xxx-servler.xml 파일

 

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

<property name="messageConverters">

  <list>

<ref bean="jsonHttpMessageConverter"/>

  </list>

</property>

</bean>

 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/"></property>

<property name="suffix" value=".jsp" />

</bean>

 

 

 

728x90
728x90

1. Application Context와 Servlet Context 설정과 Transaction
출처: https://hoonmaro.tistory.com/31 [훈마로의 보물창고]

Application Context

  • 전체 계층구조에서 최상단에 위치한 컨텍스트
  • 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean들을 등록해놓고 사용할 수 있다.
  • 웹 애플리케이션 전체에 적용 가능한 프로퍼티, DB 연결, 로깅 기능 등에 이용한다.
  • Servlet Context에 등록된 Bean은 이용할 수 없다.
  • Servlet Context에 동일한 Bean이 있을 경우 Servlet Context Bean이 우선된다.
  • 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다.

Servlet Context

  • 서블릿에서만 이용되는 컨텍스트
  • 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다.
  • DispatcherServlet은 자신만의 컨텍스트를 생성, 초기화하고 동시에 Application Context를 찾아서 자신의 부모 컨텍스트로 사용한다.

 

IoC 컨테이너 구성방법

  1. Application Context만 이용
  2. Servlet Context만 이용
  3. Application Context와 Servlet Context 하나씩 이용
  4. Application Context와 Servlet Context여러 개 이용
  5. 여러 Application Context와 Servlet Context 하나 이용
    •  Application Context 설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)

Component Scan 사용시 컨텍스트 설정 방법

  • Application Context에 Service, Repository, Servlet Context에 Controller만 등록해야한다.
  • Application Context 설정

    • Service와 Repository는 Include 하고 Controller는 Exclude 한다.
  • Servlet Context 설정
    • Service와 Repository는 Exclude 하고 Controller는 Include 한다.

 

  • 이렇게 설정하는 이유는 스프링이 Transaction을 적용하기 위해서이다.
  • 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래 @Service(또는 @Transactional) 어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service가 붙은 bean으로 대치된다.
  • 만약 Application Context와 Servlet Context가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context에만 적용되어 있기 때문에 Application Context의 @Service는 트랜잭션이 적용이 되지만 Servlet Context의 @Service는 트랜잭션이 적용이 안된다.
  • Bean 객체는 Servlet Context가 우선되므로 @Controller가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.



 

Reference

https://hoonmaro.tistory.com/31

 

 

 

728x90

+ Recent posts