본문 바로가기
코딩log/Spring Framework

[Spring Framework]관심사의 분리 -② Spring으로 개발하기

by 벨크 2023. 2. 11.
반응형

  이제 본격적으로 Spring Framework로 개발을 시작해보려 합니다. Spring 없이 개발을 했을 때와 마찬가지로, 자동차와 운전자라는 예제를 가지고 코드를 짜보겠습니다.

 

  Spring Framework를 이용해 관심사의 분리를 구현하는 방법은 두 가지가 있습니다. 한 가지는 Java Annotation 방식이고요. 한 가지는 xml 방식입니다. 두 가지 방식을 모두 살펴보도록 하겠습니다.

관심사의분리 - spring으로 개발하기
관심사의 분리 - Spring으로 개발하기

Spring으로 관심사의 분리 구현하기

Java Annotataion 방식으로 구현하기

 

  스프링으로 관심사의 분리 구현을 하는 첫 번째 방식은 바로 Java Annotation을 이용한 방식입니다. 이전 포스팅에서 구현했던 자동차라는 인터페이스와 SuperCar, SuvCar라는 구현 객체, 운전자라는 구현객체가 있는 상태에서 개발을 시작해 보겠습니다.

 

  Car 객체, Driver 객체에 대한 코드를 확인하시고 싶으신 분은, 아래 링크를 타고 이전 포스팅을 확인해 주세요.

 

[Spring Framework]관심사의 분리 -① Spring없이 개발하기

4차 산업혁명, 디지털 트랜스포메이션 등 이제는 인프라가 IT가 아닌 기업들도 IT기업으로 전환을 하기 시작했습니다. 그만큼 더욱 소프트웨어 개발 및 설계가 중요해지고 있습니다. 소프트웨어

belklog.tistory.com

 

  Car 객체와, Driver객체를 확인하였으면, 이제 Java Annotation 방식으로 의존관계 주입 객체를 구현해 보겠습니다. 이전 포스팅에서 구현했던 AppConfig라는 클래스에서 사실 크게 변경은 없습니다.

@Configuration
public class AppConfig {

    @Bean
    public Car car(){
        return new Sportcar();
    }
}

    사실 이전 포스팅에서 변경된 사항이 거의 없습니다. Spring에서 컴파일을 시작할 때, 해당 클래스가 Spring에서 의존관계를 관리하길 원하는 클래스와 각각의 의존관계들을 Annotation으로 나타냅니다.

 

  먼저 @Configuration이라는 Annotation입니다. 해당 Annotation이 붙은 Class는 앞으로 스프링에서 관리하는, 스프링 설정 클래스가 된다는 것을 나타냅니다. 스프링이 실행될 때, 이 설정 클래스들을 찾은 다음, 설정 클래스 내부에 존재하는 @Bean이라는 Annotation이 붙은 함수들을 읽어, 함수 내부의 의존관계를 저장하게 됩니다. 그럼 이렇게 저장된 의존관계를 어떻게 빼서 쓰는지 다음 코드를 통해 알아보겠습니다.

public class Driver {

    private final Car car;
    
    public Dirver(Car car) {
        this.car = car
    }
    
    public void drive(){
        car.accelerator();
    }
 	
    ....
}


//실제 프로그램에서 Driver 사용
public static void main(String[] args){
    ApplicationContext ApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    Car car = ApplicationContext.getBean("car", Car.class);
    
    Driver driver = new Driver(car);
    
    ...
}

  스프링에서 제공하는 ApplicationContext라는 클래스의 getBean이라는 함수를 통해 등록(의존관계가 주입)된 Car 클래스를 가지고 와서 Driver 클래스에 연결시켜 주었습니다. Car의 구현객체가 변경되어도 Driver 클래스의 코드를 수정할 필요가 없는 상태입니다. OCP와 DIP원칙이 잘 지켜지는 게 보입니다.

 

XML 방식으로 구현하기

  요즘은 의존관계 주입을 대부분 Annotation 방식으로 하기 때문에, XML방식을 잘 사용하지 않습니다. 그냥 어떻게 구현하는지 간단히 알아보기만 하겠습니다. xml파일은 코드가 아닌 리소스로 관리되기 때문에 스프링 프로젝트에 resource 디렉터리에 xml파일을 생성시키겠습니다.

resource디렉토리 경로
resources경로

  appConfig.xml을 생성시켰으면 안에 내용을 작성해 보겠습니다. 작성하는 내용은 AppConfig 클래스의 내용과 동일합니다.

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

    <bean id="Car" class="...car.Supercar"/>

    <bean id="break" class="hello.core.order.break">
        <constructor-arg name="pedal" ref="pedal"/>
        <constructor-arg name="oil" ref="oil"/>
		....
    </bean>

    <bean id="pedal" class="....Pedal"/>
</beans>

  위와 같은 양식으로 xml을 작성합니다. 의존관계 주입 시 또 다른 하위 의존관계가 필요할 수도 있습니다. Java Annotation의 경우 하위 의존관계도 Bean으로 등록되기 때문에, 그냥 호출해서 사용하면 되지만, xml은 <constuctor-arg>라는 태그를 사용합니다.

 

  XML작성을 마쳤으면, 사용하는 방식은 Annotaion 방식과 같습니다. 다만 ApplicationContext가 AnnotationConfigApplicationContext가 아닌, GenericXmlApplicationContext를 사용한다는 차이가 있습니다.

public static void main(String[] args){

    ApplicationContext applicationContext = new GenericXmlApplicationContext("appConfig.xml");
    
    Car car = applicationContext.getBean("car", Car.class);
    
    Dirver = new Driver(car);
    
    ....
    
}

  오늘은 지난 포스팅에 Spring 없이 구현했던 의존관계 주입을 Spring을 이용해 두 가지 방식으로 구현해 봤습니다. XML방식은 요즘 사용하지 않는 방식이라, 앞으로 Annotaion 방식으로 공부를 할 예정입니다.

 

  오늘 사용한 스프링 객체들이 스프링 컨테이너라고 부르는 것들입니다. 다음에는 이 스프링 객체들에 대해서 공부해 보도록 하겠습니다.

 

이전 글: IoC와 DI 컨테이너 개념정리

 

[Spring Framework]IoC와 DI 컨테이너 개념정리

스프링을 공부하다 보면, IoC 컨테이너와 DI 컨테이너라는 단어에 대해서 자주 듣게 됩니다. IoC 컨테이너와 DI 컨테이너가 의미하는 바가 상당히 유사합니다. 그만큼 혼용해서 쓰는 사람들도 많습

belklog.tistory.com

 

반응형

댓글