취미로 음악을 하는 개발자

[Spring] 어노테이션을 이용한 스프링 설정 본문

공대인/Spring[Boot]

[Spring] 어노테이션을 이용한 스프링 설정

영월특별시 2019. 5. 24. 23:50
728x90

- 자바 파일을 이용한 Spring 파일 설정


기존에 Spring Container를 만들기위해 xml 파일로 설정했었는데 여기서는 자바 파일의 annotation을 통해 설정해 볼 것이다.

-> 클래스를 새로 만들어주고 그 클래스의 annotation으로 @Configuration를 사용한다.


// xml 설정 -> java 코드

<bean id="studentDao" class="ems.member.dao.StudentDao" />

-> bean 태그의 id값과 class값과 같은 이름의 메소드 생성, annotation으로 Bean이라고 추가해준다.


@Bean

public StudentDao studentDao() {

return new StudentDao();

}


<bean id="registerService" class="ems.member.service.StudentRegisterService">

<constructor-arg ref="studentDao" ></constructor-arg>

</bean>

-> 위의 방식처럼 id, class값을 같게 넣어주고 참조하는 객체를 넣어주는데 이 때는 new 객체를 생성해주는 메소드를 활용하면 된다.


@Bean

public StudentRegisterService registerService() {

return new StudentRegisterService(studentDao());

}


<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">

<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />

<property name="userId" value="scott" />

<property name="userPw" value="tiger" />

</bean>

-> property 태그가 있는 것은 객체를 하나 생성하고 진행한다. 나머지는 위의 방식대로 하면 된다. 


@Bean

public DataBaseConnectionInfo dataBaseConnectionInfoDev() {

DataBaseConnectionInfo infoDev = new DataBaseConnectionInfo();

infoDev.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");

infoDev.setUserId("scott");

infoDev.setUserPw("tiger");

return infoDev;

}



// property 설정

<bean id="informationService" class="ems.member.service.EMSInformationService">

<property name="info">

<value>Education Management System program was developed in 2015.</value>

</property>

....

  <property name="developers">

<list>

<value>Cheney.</value>

<value>Eloy.</value>

....

    </list>

  </property>

  <property name="administrators">

<map>

<entry>

<key>

<value>Cheney</value>

</key>

<value>cheney@springPjt.org</value>

</entry>

...

    </map>

  </property>

....

</bean>

-> list의 경우는 Arraylist를 만들어서 데이터를 넣어주고, map의 경우는 HashMap을 만들어서 넣어주면 된다.


@Bean

public EMSInformationService informationService() {

EMSInformationService info = new EMSInformationService();

info.setInfo("Education Management System program was developed in 2015.");

....

  ArrayList<String> developers = new ArrayList<String>();

developers.add("Cheney.");

developers.add("Eloy.");

      ....

  info.setDevelopers(developers);

....

        Map<String, String> administrators = new HashMap<String, String>();

administrators.put("Cheney", "cheney@springPjt.org");

administrators.put("Jasper", "jasper@springPjt.org");

info.setAdministrators(administrators);

....

  return info;

}


(지친다.)


위에서 작성한 자바 파일로 설정해야하는데 기존에 있던 GenericXmlApplicationContext를 안쓰고 어떤 것을 써야할까?

-> AnnotationConfigApplicationContext 클래스를 이용


GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");

-> AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MemberConfig.class);



하나의 자바 파일에 스프링 컨테이너를 만들면 소스가 길어지고 유지보수 면에서 좋지 않으므로 여러 개의 파일로 나누어서 작업하는 것이 좋다.

ex) DB만 관리하는 파일, 유틸기능만 있는 파일, ...


MemberConfig1 : 서비스

MemberConfig2 : DB

MemberConfig3 : DB연결




'MemberConfig3'의 윗 부분처럼 참조가 필요한 경우에는 필드(property)를 만들고 그 객체에 Autowired를 설정해준다.

예시의 경우에서는 MemberConfig2에서 만들어진 것들이 주입된다.


나누었던 파일들을 하나의 컨테이너로 설정할 때에는 각 클래스를 ,로 연결해서 다 넣어주면 된다.


- Annotation @import

-> 예시에서는 config1에서 2, 3import하고 컨테이너 설정하는 부분에는 config1만 넣어주면 된다.

아래는 'MemberConfig1'과 같은 코드이다. 따라서 Config23의 내용을 다 담고있기 때문에 컨테이너에는 'MemberConfigImport'만 넣어주면 된다.


* import가 많이 쓰이는 것은 아니지만 그렇다고 안쓰는 것은 아니라고 한다.

Comments