티스토리 뷰

 


객체를 생성하는 것까지는 완료했는데, 아직 제 구실을 다하지는 못하는 것 같습니다.
객체를 생성해서 프로그램을 실행만 하면 끝나는 게 아니라, 우리는 프로그램을 실행할 때 무언가 값을 설정해 주는 것이 필요합니다.
그렇다면 이번 시간에는 객체를 생성하여 값을 설정하는 방법에 대해 알아보도록 하겠습니다.

setter메서드를 통한 값 설정

이전에 bean객체에 관해 짤막하게 이건 "객체"라고 말씀드린 적 있죠?
그런데 사실 bean객체라고 불리기 이전에 조건이라는 게 있습니다.

  • 필드(멤버변수)별 getter/setter메서드가 존재해야 한다.
    • 필드는 접근제한자가 private로 설정돼 있어서 별도로 필드 변수에 직접 접근하여 값을 가져오거나 설정하는 것이 아니라 메서드를 통해 거쳐가게 되어 있습니다.
    • 클래스, getter/setter 메서드, 생성자의 접근제한자는 public
  • 이외의 자바 bean객체라고 불리기 위한 조건은 Java Bean 규약을 참조하세요.

바로 스프링에서는 이러한 bean규약에 따른 객체를 이용하는데, 객체의 값을 설정할 때는 반드시 setter메서드가 있어야만 설정이 가능합니다.
그렇다면 예제를 진행하기 위해 Pencil클래스를 수정해보도록 하겠습니다.

연필.java

public class Pencil {
    private String name; // 연필의 이름
    private int length; // 연필의 길이
    private int boldLevel; // 연필의 심도
    private boolean isAvailable; // 연필이 사용 가능한지? (true:가능, false:심 부러짐)

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getBoldLevel() {
        return boldLevel;
    }

    public void setBoldLevel(int boldLevel) {
        this.boldLevel = boldLevel;
    }

    public boolean isAvailable() {
        return isAvailable;
    }

    public void setAvailable(boolean isAvailable) {
        this.isAvailable = isAvailable;
    }

    @Override
    public String toString() {
        return "이름이 [" + name + "]이고 길이는[" + length + "]인\n심도가 [" + boldLevel + "]만큼 굵고 " + (isAvailable ? "지금 쓸 수 있는" : "부러진")
                + " 연필";
    }
}

학생.java클래스에서도 pencil객체를 삽입해 줄 수 있도록 getter/setter 메서드를 추가하였습니다.

public class Student {
    private Pencil pencil;

    public Pencil getPencil() {
        return pencil;
    }

    public void setPencil(Pencil pencil) {
        this.pencil = pencil;
    }

    public Student() {
        System.out.println("학생이 태어납니다...");
    }

    public void enroll() {
        System.out.println("학생이 입학하였습니다.");
    }

    public void graduate() {
        System.out.println("학생이 졸업하였습니다.");
    }

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

이제 applicationContext.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="pencil" class="com.di.school2.xml.property.Pencil">
        <property name="name" value="몬아미샤프2020"/>
        <property name="length" value="30"/>
        <property name="boldLevel" value="4"/>
        <property name="available" value="true"/>
    </bean>

    <bean id="student" class="com.di.school2.xml.property.Student">
        <property name="pencil" ref="pencil"/>
    </bean>

</beans>
  • xml파일에서 getter/setter메서드를 통한 삽입은 property 속성 태그를 이용하면 됩니다.

    • name: 해당 필드의 이름
    • value: 값 (기본자료형인 byte, short, int, long, float, double, boolean, char과 참조자료형인 String에 한하여 사용)
    • ref: 삽입할 객체 (String을 제외한 참조자료형)

생성자를 통한 값 설정

그렇다면 이번에는 getter/setter메서드가 아니라 생성자를 통한 값 전달은 어떻게 해야 할까요?
일단 java 클래스부터 손을 좀 보겠습니다.

연필.java

public class Pencil {
    private String name; // 연필의 이름
    private int length; // 연필의 길이
    private int boldLevel; // 연필의 심도
    private boolean isAvailable; // 연필이 사용 가능한지? (true:가능, false:심 부러짐)

    public Pencil(String name, int length, int boldLevel, boolean isAvailable) {
        this.name = name;
        this.length = length;
        this.boldLevel = boldLevel;
        this.isAvailable = isAvailable;
    }

    @Override
    public String toString() {
        return "이름이 [" + name + "]이고 길이는[" + length + "]인\n심도가 [" + boldLevel + "]만큼 굵고 " + (isAvailable ? "지금 쓸 수 있는" : "부러진")
                + " 연필";
    }

}

학생.java

public class Student {
    private Pencil pencil;

    public Student(Pencil pencil) {
        this.pencil = pencil;
    }

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

applicationContext.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="pencil" class="com.di.school3.xml.constructor.Pencil">
        <constructor-arg value="몬아미샤프2020" />
        <constructor-arg value="30" />
        <constructor-arg value="4" />
        <constructor-arg value="true" />
    </bean>

    <bean id="student" class="com.di.school3.xml.constructor.Student">
        <constructor-arg ref="pencil" />
    </bean>

</beans>
  • constructor-arg 태그를 이용하여 생성자의 파라미터 순서에 맞게 차례대로 전달하면 되겠습니다.
    • 마찬가지로 기본자료형과 String클래스에 해당하는 값은 value속성을 이용하고
    • 이외의 클래스에 해당하는 객체의 값은 ref를 이용하여 각 bean의 아이디를 지정해 주면 됩니다.

 

digest1.zip
0.02MB

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함