본문 바로가기
프로그래밍/Spring

Spring / xml 매핑하기

by 소소로드 2018. 4. 7.

[Spring / xml 매핑하기]


BMI지수 구하기를 통해 xml 매핑 배우기




BMICalculator.java

public class BMICalculator {
    
    private double lowWeight;
    private double normal;
    private double overWeight;
    private double obesity; // 필드 값
    
    public void bmiCalculator(double weight, double height) { // 몸무게와 키를 매개변수로 갖고 있는 생성자
        
        double h = height * 0.01;
        double result = weight / (h * h);

        System.out.println("BMI 지수: " + (int)result);
        
        if(result > obesity) {
            System.out.println("당신 비만이지?");
        } else if (result > overWeight) {
            System.out.println("당신 과체중이지?");
        } else if (result > normal) {
            System.out.println("당신... 정상맞지?");
        } else {
            System.out.println("당신 저체중이지?");
        }   
    }
    
    public void setLowWeight(double lowWeight) { // 필드에 따른 setter
        this.lowWeight = lowWeight;
    }
    public void setNormal(double normal) {
        this.normal = normal;
    }
    public void setOverWeight(double overWeight) {
        this.overWeight = overWeight;
    }
    public void setObesity(double obesity) {
        this.obesity = obesity;
    }
    
    
}
cs

*

BMI지수를 구하기 위해서는 공식이 필요하니까

필드를 정해주고 bmiCalculator 메서드를 통해 계산 공식을 넣고 setter를 지정한다.






MyInfo.java

public class MyInfo {
    
    private String name;
    private double height;
    private double weight;
    private ArrayList<String> hobbies; // ArrayList형태가 xml에서 어떻게 매핑되는지 유심히 보자. 
    private BMICalculator bmiCalculator; // 계산기 필드를 가지고 있다.
    
    
    public String getName() { // 필드에 따른 setter, getter 정의
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    public ArrayList<String> getHobbies() {
        return hobbies;
    }
    public void setHobbies(ArrayList<String> hobbies) {
        this.hobbies = hobbies;
    }
    public BMICalculator getBmiCalculator() {
        return bmiCalculator;
    }
    public void setBmiCalculator(BMICalculator bmiCalculator) {
        this.bmiCalculator = bmiCalculator;
    }
 
    
    public void getInfo() { // 내 신상정보 메서드
        System.out.println("내 이름 : " + name);
        System.out.println("나의 키 : " + height);
        System.out.println("내 몸무게 : " + weight);
        System.out.println("내 취미 : " + hobbies);
        System.out.println("---------------------------------------");
        bmiCalculator();
    }
    
    private void bmiCalculator() { // BMICalculator객체를 참조하는 bmiCalculator에 접근, bmiCalculator를 소환
        bmiCalculator.bmiCalculator(weight, height);
    }
 
}
 
cs

*

나의 정보와 관련된 클래스이다.




ctx_example.xml

<?xml version="1.0" encoding="UTF-8"?>
 
 
<bean id="bmiCalculator" class="com.yul.ex02_example.BMICalculator">
    <property name="lowWeight" value="18.5"/>
    <property name="normal" value="23"/>
    <property name="overWeight" value="25"/>
    <property name="obesity" value="30"/>
</bean>
 
<bean id="myInfo" class="com.yul.ex02_example.MyInfo">
     <property name="name" value="yul"/>
     <property name="height" value="200"/>
     <property name="weight" value="80"/> // Myinfo에 height, weight가 double형이지만 알아서 박싱처리된다.
     <property name="hobbies">
         <list>
             <value>런닝</value>
             <value>프로그래밍</value>
             <value>노래부르기</value>
         </list>
     </property>
     <property name="bmiCalculator">
          <ref bean="bmiCalculator"/>
     </property>
    </bean>
</beans>
cs


*

특히 중요한 부분은 xml 매핑이다.

각 클래스의 setter는 값을 달라고 열어놓기만 하는 상태이고

모든 값은 xml에서 해결한다는 것!


bmiCalculator : 4개 필드가 setter형태로 존재하므로 꼭 property로 묶어주고

                bmi지수대로 값을 지정해준다는 것

    public void bmiCalculator도 신경써야하지 않나? 처음에는 헷갈렸는데

    유심히 보면 MyInfo에서 소환하고 있어서 여기서 해결할거니까 신경쓸 것이 없다.


myInfo : 5개의 필드가 setter형태로 존재하므로 property로 묶어주고

   중요한 점은 위에서 유심히 보라고 했던 ArrayList<String> hobbies

hobbies는 List타입이라는 인터페이스를 가지고 있으므로 List형태로 묶고 value값을 지정해주면 된다.

bmiCalculator는 BMICalculator를 참조한다는 의미로 ref를 써주면 된다.




MainClass .java

public class MainClass {
 
    public static void main(String[] args) {
 
        String configLocation = "classpath:ctx_example.xml";
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
        
        MyInfo myInfo = ctx.getBean("myInfo", MyInfo.class);
        
        myInfo.getInfo();
        
        ctx.close();
 
    }
}
cs
 

*

그러면 classpath:ctx_example.xml로 위치를 지정하고

ctx에 그 값을 넣어주고

Myinfo를 가져와서 getBean에서 뽑아오는 myInfo Bean객체를 넣어주고

내 신상정보 메서드를 소환해서 정하면 



결과 값

=========================================

내 이름 : yul

나의 키 : 200.0

내 몸무게 : 80.0

내 취미 : [런닝, 프로그래밍, 노래부르기]

---------------------------------------

BMI 지수: 20

당신 저체중이지?

==========================================