티스토리 뷰

명쾌한 스프링 프레임워크 강좌 - #5 의존성 주입 (DI dependency Injection) 실습하기

 


의존성 주입 (DI) 복습

  • 이전 강좌에서 의존성 주입에 관해 설명한 내용을 복습합니다.

이전까지는 다음과 같이 서비스 클래스의 실행 주도권을 내가 만든 클래스가 가지고 있었다면,

이전

이제부터는 다음과 같이 서비스 클래스의 실행 주도권은 스프링에게 내준다고 배웠습니다.
그래서 이 클래스(학교)는 물론이고 사용되는 클래스(학생)까지 몽땅 생성은 스프링 컨테이너에 맡기는 것이 되었습니다.

이제부터

프로젝트 만들기

  • 프로젝트를 만들어 예제를 실습하시기 난감하신 분들을 위해 블로그 하단에 파일을 첨부해 두었습니다.
    프로젝트를 로드하여 사용하시기 바랍니다.

0. 시작 전에 프로젝트에서 pom.xml 설정하기

pom.xml을 열어 properties와 dependencies태그를 복사하여 붙여 넣으세요.

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tistory</groupId>
    <artifactId>digest1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <spring-framework.version>4.3.27.RELEASE</spring-framework.version>
        <org-aspectj.version>1.9.5</org-aspectj.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org-aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${org-aspectj.version}</version>
        </dependency>
    </dependencies>
</project>

1. 패키지는 com.user.school로 만듭니다.

2. 패키지 내에 School클래스와 Student 클래스, Pencil 클래스를 만듭니다.

단지 이곳에서는 학생에게 "공부해"라는 메서드 하나만 만들고 실행해 볼 것입니다.

2-1. 연필.java

public class Pencil {}

2-2. 학생.java

public class Student {
    private Pencil pencil;

    public void doStudy(String subject) {
        System.out.println(subject + "을 공부하다.");
    }
}

2-3. 학교.java

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class School {
    public static void main(String[] args) {
        AbstractApplicationContext context = new GenericXmlApplicationContext("classpath:com/di/school1/xml/applicationContext.xml");

        try {
            Student student = (Student)context.getBean("student"); //DI컨테이너에서 생성된 학생객체 가져오기
            student.doStudy("스프링");
        } finally {
            context.close(); //자원 닫기
        }
    }
}

2-4. applicatoinContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">

    <bean id="student" class="com.di.school1.xml.Student" />

</beans>
  • 클래스가 아니라 생소한 것이 왔네요. 이건 뭘까요?
    이전에 xml을 이용하여 "학생 객체가 필요하니까 미리 만들어 주라!" 하며 스프링 컨테이너에 명시하는 작업이라고 하였습니다.
<bean id="student" class="com.di.school1.xml.Student" />

여기서 이것은 Student클래스를 생성하여 DI컨테이너에 보관하는 작업입니다.
그리고 여기서 id는 객체 하나하나를 식별하기 위함으로써 명명하는 부분입니다.
우리가 java클래스에서 꺼내다 쓸 때 어떻게 객체를 식별하죠? 객체가 한 개라면 문제없겠지만 여러 개라면 어떤 객체를 꺼내 쓸지 지목이 필요합니다.
그러한 의미에서 id를 명시했다고 보시면 됩니다.

  • 바로 학교.java 클래스에서 이렇게 student라는 bean을 꺼내다가 쓰게 될 수 있는 것이죠!
Student student = (Student)context.getBean("student"); //DI컨테이너에서 생성된 학생객체 가져오기

아직 bean에 대해 설명드리지 못했네요.
bean이라고 하는 것은 간단하게 말씀드리자면 "객체 하나" 라고 생각하시면 됩니다.
스프링을 처음 배우면서 낯선 용어 하나하나에 관한 정의를 꼼꼼히 배운다는 건 쉬운 일은 아닙니다.
지금 상황에서는 "객체 하나" 정도로만 소화하시는 것이 유익합니다.

  • 이클립스에서 실행하기 위해서는 학교.java(실행 앱)에서 Ctrl+F11을 누릅니다.
    실행한 것은 분명 학교.java클래스이지만 객체 생성의 주도권은 완전히 스프링에게 넘어간 것을 알 수 있습니다.

  • 이렇게 Hello, world 프로젝트가 끝났습니다! 다음 프로젝트부터는 xml을 이용해서 객체를 다루는 방법에 관해 계속 알아보도록 하겠습니다.

 

digest1.zip
0.01MB

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함