여행을 개발하다

스프링의 개요와 의존성 주입1 (Dependency Injection) 본문

Spring/Spring

스프링의 개요와 의존성 주입1 (Dependency Injection)

yhtragramming 2019. 5. 15. 21:33

안녕하세요!

 

오늘은 '스프링의 개요''의존성 주입(Dependency Injection)'에 대해 알아보겠습니다.


1. 스프링 프레임워크(Spring Framework)

스프링은 자바 플랫폼을 위한 '오픈소스 애플리케이션 프레임워크(Framework)'입니다.

 

여기서 프레임워크란, 소프트웨어를 편리하게 제작할 수 있도록 뼈대를 이루는 클래스와 인터페이스를 미리 제작하여 모아둔 것을 의미하는데요.

 

프레임워크를 적시적소에 사용하면 프로그램 개발의 생산성이 올라가며, 품질이 향상된다는 장점이 있습니다. 하지만 익숙해지는데 시간이 소요된다는 것이 결국 유연성의 부족으로 이어진다는 단점도 있습니다.

 

스프링은 프레임워크의 일종으로 여러 클래스의 객체를 생성해주고, 조립해주는 '조립기' 역할을 합니다. 또한 크기와 부하 측면에서 경량이라는 점, 객체의 생명 주기까지 설정하고 관리할 수 있다는 장점을 두루 갖추고 있습니다.

 

2. 의존성 주입(Dependency Injection)

전통적인 소프트웨어 공학에서 말하는 이상적인 프로그램은 객체들간의 결합도와 의존성은 낮게, 응집도는 높게 구성되어야 합니다.

 

스프링은 이러한 원칙에 기반하여, 객체들 간이 의존성을 낮추는 방법으로 '의존성 주입'을 사용하는데요. 의존성 주입은 개발 코드 내에서 객체를 생성하는 것이 아닌, 객체의 생성과 데이터 주입을 담당하는 별도 Factory Class를 운용하는 방식입니다.

 

예를 들어, 다음과 같이 Student라는 Class가 있다고 가정하겠습니다.

 

일반적인 Class의 모습처럼 name, age, gradeNum, classNum이라는 멤버 변수와 기본 생성자,

멤버 변수를 초기화하는 생성자가 있고요.

 

클래스의 외부에서 접근 권한이 private인 멤버 변수들에게 접근하기 위해,

getter와 setter도 함께 만들어주었죠.

 

그리고 클래스의 외부에서 객체를 생성하여 setter와 getter로 값을 설정하거나 빼왔습니다.

 

 

하지만 Spring은 이 대신 별도의 xml 파일(factory)에서 객체를 만들어 사용할 수 있습니다.

이 때 사용하는 것이 'bean'이라는 것이에요.

 

3. Bean과 Property의 사용 (setter 사용)

스프링에서 한 클래스의 객체를 만들 때는 개발 코드 내에서 'new'를 사용하는 것 대신, 별도의 클래스에서 'bean'을 만들어 사용합니다.

 

예전에 JSTL에서 'jsp:useBean'을 사용했던 적이 있었죠?

스프링에서의 bean은 이와 거의 유사하다고 보시면 됩니다.

 

먼저, Bean 사용을 위한 예비작업을 하겠습니다.

 

Spring Legacy Project를 하나 만들면,

하위에 "src/main/java, src/main/resources, src/test/java"등의 폴더가 생기는데요.

 

여기서 'src/main/java 폴더'에는 연동될 자바 클래스 파일을, 'src/main/resources 폴더'에는 factory 클래스 파일을 모아둔다고 생각하시면 되요.

 

factory 클래스는 src/main/resources 폴더에, 'Spring Bean Configuration File' 로 만들어주세요.

파일의 이름은 'applicationCTX.xml'으로 하겠습니다.

 

이제 'applicationCTX.xml' 파일 내에서 객체를 만들어보겠습니다.

 

스프링에서의 객체 생성의 시작점은 '<bean>' 태그로, 생성이 끝나면 '</bean>'로 닫아주면 됩니다.

 

그리고 id 속성에는 객체명, class 속성에는 해당 객체가 어떤 클래스의 객체인지 경로를 포함해서 적어줘야 합니다.

 

예를 들어, student 클래스의 객체 student1을 생성하는 bean은 다음과 같이 만듭니다.

 

이는 다음과 같은 역할을 하죠.

 

객체가 생성되었으면 멤버 변수를 setter를 이용해 초기화 해줘야겠죠?

스프링에서 setter의 역할을 하는 것은 <property></property> 태그입니다.

 

세부 속성으로는 'name'과 'value'가 있는데, name은 멤버 변수명, value는 멤버 변수의 초기값을 받습니다.

 

전송중...

사진 설명을 입력하세요.

이렇게 하나둘씩 setter로 꽂아주면, 하나의 객체에 필요한 멤버 변수의 초기화가 끝납니다.

몰론, 모든 멤버 변수를 초기화시킬 필요는 없습니다.

하지만 초기화되지 않은 멤버 변수에는 null이 들어가게 됩니다.

 

4. Main Class에서의 객체 호출

이제는 생성된 객체를 자바 클래스에서 호출해보겠습니다.

이전에 자바 클래스를 모아두는 폴더는 'src/main/java'라고 말씀드렸죠?

 

클래스는 일반 java class 파일을 만드는 것과 동일합니다.

클래스를 구분하기 위해 별도의 package를 만드는 것은 옵션입니다.

 

이처럼 MainClass를 하나 만들어주시고요.

 

그리고 오랜만에 main 메소드를 호출해보겠습니다.

참고로 MainClass와 main 메소드는 엄연히 다릅니다 ㅎㅎ

 

main 메소드가 호출되면, factory 클래스가 어디인지를 명시하는 주소 변수를 하나 생성합니다.

그리고 "classpath:factory 클래스 파일(xml)" 형식으로 주소를 명시해줍니다.

 

그 다음에 할 일은 스프링의 컨테이너를 만드는 작업입니다.

 

스프링의 컨테이너를 만들기 위해서는 'AbstractApplicationContext ' 클래스와

'GenericXmlApplicationContext' 생성자를 호출해야 합니다.

 

그리고 GenericXmlApplicationContext의 인수로 factory 클래스의 주소를 넘겨줍니다.

 

이제는 마지막 작업으로 Student 객체를 형성해야 합니다.

 

그러나 방금 factory 클래스에서 만들었던 것과 동일한 이름으로 형성해야 한다는 것에 주의하세요! 그리고 컨테이너에 'getBean'을 이용하여 생성한 bean을 넣어줍니다.

 

getBean의 첫 번째 인수에는 xml 파일에서 만든 객체의 이름을 "객체명"으로 정확히 입력하시고, 두 번째 인수에는 '클래스 이름.class'를 넣어주시면 됩니다.

 

여기까지 오시느라 수고하셨습니다!!

이제는 bean을 형성한 객체의 멤버 변수를 하나 둘씩 꺼내어보도록 하겠습니다.

 

콘솔창에 bean에서 생성한 객체의 값이 그대로 나타납니다.

 


지금까지 스프링의 개요와 의존성 주입, bean의 생성 및 main 클래스의 호출에 대해 알아보았습니다.

 

긴 글 읽어주셔서 감사합니다! : )

Comments