Servlet JSP MVC Spring

[Spring] Spring framework_ 설치 및 개요_ 의존성주입(DI)

vhxpffltm 2020. 4. 12. 14:43

Spring Framework

 

스프링 프레임워크는 '자바 웹 어플리케이션' 개발을 위한 오픈 소스 프레임워크이다. 경량 프레임워크라고도 불린다.

 

이 스프링도 사용되는 여러 비어있는 클래스 객체를 스프링이 권한을 가지고 작업하며 아래의 특징을 가진다.

 

 

의존성 주입: 클래스 객체를 개발자가 코드에서 생성하지 않고 프레임워크가 생성하여 사용

제어 역행(IoC): 서블릿이나 빈 등을 개발자가 코드에서 생성하지 않고 프레임워크가 직접 수행

관점 지향: 핵심 기능 외 부수기능들을 분리 구현하여 모듈성을 증가시킴 

 

위와 같은 특징이 있고 주요기능들로 MVC구현, DAO로 Context, Core 등의 기능들이 있다.

 

그럼 이전까지 작업했던 이클립스가 있는데 Spring Framework를 설피해보자.

최근에는 이클립스의 메이븐 프로젝트와 같은 자동화 도구를 사용해 설정을 자동으로 할 수 있다.

 

여기서는 STS를 설치하여 적용해본다.

 

STS는 스프링 프레임워크 플러그인이 적용된 이클립스이다. spring framework 공식 홈페이지 -> project 메뉴에가면 STS 4버전이 있으며 운영체제에 맞게 설치하면 jar파일이 설치된다.

 

이 압축을 풀고 content폴더 마지막에 들어가면 SpringToolSuite4.exe 파일을 실행시켜 workspace를 지정하여 실행하면 이클립스와 비슷한 환경의 창을 볼 수 있다.

 

 

이와 같은 화면을 볼 수 있는데 한가지 적용해야 할것이 있다.

 

help 메뉴의 eclipse marketpace를 사용하여 spring을 입력하여 spring tool 3 버전을 인스톨해야 한다. 그러면 모든 작업환경 준비가 끝이난다.

 

 

의존성 주입(DI)

 

우리는 이때까지 개발자에 의해 직접 코드엣거 사용할 클래스, 사용될 클래스를 부여했다. 

의존성 주입이란 이런 연관 관계를 컨테이너가 직접 규정하는 것이다. 스프링 프레임워크에서는 각 클래스들의 연관관계를 클래스들 사이에서 맺는 것이 아니라 설정을 통해 맺어준다.

 

의존성 주입을 통해,

클래스들 간의 의존 관계를 최소화하여 코드를 단순화 할 수 있고

애플리케이션을 더 쉽게 유지 관리할 수 있다.

또한 객체의 생성, 소멸과 객체 간의 의존 관계를 컨테이너가 제어한다/

 

스프링에서 DI를 구현하기 위해 XML이나 애너테이션 설정을 통해 제어한다. 스프링 프레임워크에서는 객체의 제어를 스프링 담당하므로 제어의 역전(개발자에서 스프링으로 넘어옴: IoC)이라고 한다.

 

여기서는 setter를 이용한 DI를 살펴본다.

 

 

구조는 아래와 같다.

 

PersonService 인터페이스를 작성하고 그 안에 추상메서드를 하나 선언한다.

PersonServiceImpl 클래스를 보면 인터페이스 PersonService를 구현하고 setter를 이용해 person.xml에서 <value> 태그로 설정한 값을 name 속성에 주입한다. setter를 사용할때 <property> 태그를 사용한다.

age속성은 setter가 없으므로 bean이 생성되더라도 값이 초기화되지 않는다.

 

이제 실행 클래스 PersonTest 클래스는 라이브러리에서 제공하는 클래스를 이용해 XML파일을 읽어와 bean을 생성한다. 

실행하면 스프링의 XmlBeanFactory 클래스를 이용해 person.xml의 설정대로 PersonServiceImpl bean을 메모리에 생성하고 이 bean에 대한 id로 접근하여 추상메서드를 호출한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface PersonService {
    public void sayHello();
}
/////////////////////////////////////////////////////////////////////////////////
public class PersonServiceImpl implements PersonService{
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public void sayHello() {
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }// <value> 태그의 값을 setter를 이용해 설정 
}
/////////////////////////////////////////////////////////////////////////////////////
public class PersonTest {
    
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
        PersonService person = (PersonService) factory.getBean("personService");
        //id가 personService 인 bean을 가져온다
        // PersonService person = new PersonServiceImpl(); 자바 코드에서 객체생성 필요가 없음
        person.sayHello();
        //생성된 bean을 이용해 name값을 출력
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
   <bean id="personService" class="com.spring.ex01.PersonServiceImpl">
           <!-- bean 태그를 이용해 PersonServiceImpl 객체(빈)를 생성한 후 빈 id를 personService로 지정 -->
      <property name="name">
         <value>홍길동</value>
      </property> <!--  PersonServiceImpl 객체의 속성 name값을 <value> 태그로 초기화한다. -->
   http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

 

 

이번에는 bean에 주입되는 값이 의존 관계에 있는 다른 bean을 주입하는 경우이다.

 

이전에 진행했던 회원 게시판의 Service 클래스와 DAO 클래스의 계층 구조이다. Service 클래스는 데이터베이스와의 연동을 위해 DAO 클래스에 의종하는 관계임을 알 수 있다.

 

 

여기서 Service클래스는 소스 코드에서 직접 DAO객체를 생성한 후 DAO에서 제공하는 메서드를 이용해 데이터베이스와 연동했다. DI를 이용해 그 차이를 간단하게 살펴보자

 

프로젝트의 구조는 위와 같다.

Member.xml에서는 두 개의 bean을 동시에 생성한 후 id가 memberService인 bean이 id가 memberDAO인 bean을 자신의 속성 memberDAO에 바로 주입한다.

 

의존하는 bean을 주입할 때는 주입되는 타입이 기본형 데이터가 아닐 경우 ref 속성을 이용해 주입해야 한다.

 

 

setter로 주입되는 bean을 받을 memberDAO 타입의 속성과 setter를 이용해 구현한다.

실행 클래스인 MemberTest에서는 member.xml을 읽어 들인 후 bean을 생성하고 setter 주입 방식으로 주입한 후 id인 memberService로 접근하여 listMembers() 메서드를 호출한다.

 

여기서는 자바 코드로 어떤 클래스 객체도 생성하지 않았다. 오로지 spring의 DI기능을 이용해 bean을 생성했고 의존 관계에 있는 bean을 속성에 주입한 후 bean의 기능을 사용한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
public interface MemberDAO {
    public void listMembers();
}
 
////////////////////////////////////////
 
 
public interface MemberService {
    public void listMembers();
}
 
///////////////////////////////////////////
 
 
public class MemberDAOImpl implements MemberDAO{
    @Override
    public void listMembers() {
        System.out.println("ListMembers 메서드 호출" );
        System.out.println("회원 정보를 한번 보겠습니다....");
    }
}
 
////////////////////////////////////////////
 
 
public class MemberServiceImpl implements MemberService {
    private MemberDAO memberDAO; // 주입되는 bean을 저장할 MemberDAO 타입의 속성을 선언
    
    public void setMemberDAO(MemberDAO memberDAO) {
        this.memberDAO = memberDAO;
    }
    
    @Override
    public void listMembers() {
        memberDAO.listMembers();
    }
}
 
////////////////////////////////////////////////////////
 
 
 
 
public class MemberTest01 {
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("member.xml"));
        MemberService service = (MemberService) factory.getBean("memberService");
        //id가 memberService인 bean을 가져온다.
        service.listMembers();
    }
}
 
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
    <bean id="memberService" class="com.spring.ex02.MemberServiceImpl">
       <property name="memberDAO" ref="memberDAO" />
    </bean>
    <!-- MemberService 클래스를 이용해 id가 memberService인 bean을 생성, bean을 만들면서 setter 주입 방식으로 
    id가 memberDAO인 bean을 사진의 속성에 주입 -->
    <bean id="memberDAO" class="com.spring.ex02.MemberDAOImpl" />
    <!-- id가 memberDAO인 bean을 MemberDAOImpl을 이용해 생성 -->
</beans>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

*lib 폴더의 라이브러이는 관련 jar을 설치한 것이다. 해당 이름의 jar을 설치하여 프로젝트의 lib에 복사 붙여넣기 한다. 이후 [프로젝트] 오른쪽 클릭 -> Build path -> Configure Build path.. -> library의 classpath 에 해당 jar들을 추가해준다.

 

 

Reference

https://webcoding.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-STS4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

자바 웹을 다루는 기술 - 길벗