Spring Core : Maven 프로젝트 생성 & Bean 공장 및 클래스 생성 { bean 클래스 특징 & 생성, 공장 생성 & 실행 }
Ben의 프로그램2023. 7. 20. 22:12
728x90
수업목표
이번 시간에는 Spring 의 IoC / DI 컨테이너에 대한 동작을 확인하기 위해 Maven 을 이용해 프로젝트를 생성한 후, XML 형식의 설정 파일을 만들어 IoC 와 DI 가 잘 동작하는지 확인해 보도록 하겠습니다.
Maven 프로젝트 만들기
이클립스에서 File-new-Maven Project 를 실행시킵니다.
Archetype 을 선택하라는 창이 뜹니다. Archetype 은 Maven 프로젝트에서 제공하는 템플릿을 이야기 합니다. 어떤 것을 지정하느냐에 따라 프로젝트 구조가 달라집니다. 기업들은 자신만의 Archetype 을 만들어서 사용하기도 합니다. 이번 시간에 우리는 Maven Archetype quick start 를 사용해 보겠습니다.
Next 를 클릭합니다.
다음은 group id 등에 대한 설정을 해주어야 합니다. 우선 Group id 는 도메인을 거꾸로 쓴다고 했습니다. Group Id 와 Artifact Id 는 나중에 패키지가 됩니다. 그러니까 컨벤션을 지켜서 소문자로 작성을 해주도록 합니다.
우선 위와 같이 설정을 했습니다. Finish를 눌러보겠습니다.
그럼 다음과 같이 diexam01 이라는 maven 프로젝트가 생성된 것을 확인할 수 있습니다. maven 프로젝트 하위에는 pom.xml 파일이 있습니다. 열어보겠습니다.
pom.xml
pom.xml 탭을 클릭하면 xml 파일 형식으로 볼 수 있습니다. 이 파일에다가 jdk 사용을 위해서 플러그인을 추가하려고 합니다.
강의에서는 소스코드를 제공하고 직접 추가하는 것을 볼 수 있는데, 버전업이 되면서 자동으로 저는 추가가 되어있네요. 강의에서는 소스코드를 추가한 다음 프로젝트의 maven 을 새로고침하여 다운로드 받는 것을 확인할 수 있습니다.
이렇게 Maven 프로젝트를 설정한 다음에는 프로젝트의 properties 로 가서 Java Compiler 를 열어봅니다. 자바 jdk 가 정상적으로 동작하고 있는 것을 확인합니다.
Project Explorer 를 잠깐 살펴보면 아까 우리가 group Id 와 Artifact Id 로 설정한 부분이 패키지로 설정되어 있는 것을 확인할 수 있습니다.
그리고 이 폴더 안을 보면 App.java 라는 클래스가 만들어져 있는 것을 볼 수 있습니다. 또한 src/test/java 안에는 AppTest.java 라는 파일이 만들어져 있는 것을 확인할 수 있습니다. 이 @Test 어노테이션이 붙은 메서드를 우클릭해서 Run as - Junit Test 해서 정상적으로 동작하는지 확인할 수 있습니다.
DI Test - 1. bean 클래스 생성
DI 는 클래스 생성 공장에서 생성한 것을 사용하는 방법 중 하나라고 했었습니다. 그래서 클래스를 자동으로 생성해서 내가 원하는 곳에 주입 받는 테스트를 진행해 보겠습니다. 공장에서 무엇인가 만드려면 대상이 필요하겠죠. 그런 객체를 우리는 bean 이라고 합니다. bean 클래스는 보통의 자바 클래스와 같습니다. UserBean 이라는 bean클래스를 하나 만들어보겠습니다.
우선, bean 클래스들은 3가지 특징을 가지고 있습니다. 첫째, 기본생성자를 가지고 있다. 둘째, 필드는 private 하게 선언한다. 셋째, getter와 setter 메소드를 가진다. 알아두어야 하는 용어가 하나 있는데, getName( ) 과 setName( ) 이라는 getter setter 메서드를name 프로퍼티라고 합니다.
그런데, 왜 bean 클래스는 이런 특징들을 가져야 할까요? 왜냐하면 지금 생성하는 bean 클래스는 개발자가 인스턴스를 생성하는 것이 아니라 대신 맞길 겁니다. 따라서 일정한 규칙이 있어야 정상적으로 동작하겠죠. 아무튼 bean 클래스의 이러한 특징들이 있다는 것을 염두에 두고 작업을 이어서 나가보겠습니다.
이렇게 bean 클래스를 생성했습니다. 다음은 Spring을 Maven 을 활용하여 프로젝트에 추가해주고, 필요한 설정들을 하겠습니다.
Spring 을 프로젝트에 포함시키기 & 필요한 설정들
bean 클래스의 3가지 규칙을 지킨 상태로 우선 bean 클래스 작성을 완료했는데요. 이제이 bean 클래스를 스프링이 가진 공장이 만들어내도록 지정을 해주어야 합니다. (많이들 헷갈려 하시는 부분인데요. 이런 공장이 자동으로 해준다고 하니까 모든 것을 자동으로 해준다고 생각하시는데요. 사용자가 알려줘야 하는 부분은 알려주어야 정상적으로 동작한답니다.) 아무튼스프링이 이 bean 클래스를 공장에서 생성하도록 지정하려면 우선 Spring이 필요하겠죠.Maven 프로제트의 pom.xml 파일에서 설정을 통해 Spring 을 사용할 준비를 Maven 에게 시켜주어야 합니다.
우선 pom.xml 파일에 있는 properties 태그에 <spring.version> 태그를 작성해줍니다. properties 태그에 있는 값들은 상수처럼 동작을 하게 되는데요. Maven 이 동작하다가 필요한 상수들을 여기에서 가져다가 사용하게 됩니다.
그 다음dependency 태그에 스프링 사용을 위한 태그들을 추가해 줍니다.여기서 눈여겨 볼 것이 하나 있는데요. 왜 굳이 Properties 태그를 사용해서 마치 변수처럼 사용하고 있을까요?그 이유는 프로젝트가 진행됨에 따라 굉장히 많은 dependency 들이 추가가 되는데, 이모든 dependency 들의 spring 버전을 설정해주었다가 나중에 다른 버전으로 바꿔야한다면 위와같이 사용하지 않는다면 일일이 버전을 의미하는 텍스트들을 수정해주어야하기 때문입니다. 이것이 Maven의 장점입니다. 태그 몇줄만 적어주면 Maven 이 알아서 우리가 필요한 라이브러리들을 추가해주니까 굉장히 편리합니다.
여기까지 설정을 했다면 저장을 합니다. 그리고 Project Explorer 에서 Maven Dependencies 를 열어보면 처음에는 없던 라이브러리들이 추가가 된 것을 확인할 수 있습니다.
그런데, 매번 이런 설정을 어떻게 알 수 있을까요? 우선 구글에 우리가 현재 spring 공장이 필요하니까 spring context 를 검색해서 필요한 정보를 찾을 수 있습니다.
이번에는 main 폴더 밑에 resources 라는 폴더를 생성하고 필요한 파일들을 생성하겠습니다. 파일명을 어떻게 작성하든 사실은 상관은 없지만, 보통 다들 applicationContext.xml 이라고 생성합니다. 공장에게 알려줄 정보들을 여기다 작성합니다.
xml 파일은 항상 이 파일이 xml 파일임과 동시에 어떤 버전임을 명시해야 합니다. 첫째 줄에서 그런 내용을 표현하고 있구요. beans 태그에서 bean 태그를 보겠습니다. 이 bean 태그를 통해서 나의 어떤 클래스가 bean 클래스야라고 스프링에게 알려줄 수 있습니다.
스프링 공장을 실행시키는 클래스 작성 & 실행
이렇게스프링 설정 파일을 작성했으니까 스프링 설정 파일을 읽어들이는 객체도 하나 생성해야합니다.
ApplicationContextExam01.java 라는 파일을 하나 생성해주겠습니다. 이 파일에서는 스프링이 가진 공장을 생성해야하잖아요.스프링이 가진 공장을 만드는 코드를 우선 작성하였습니다.코드를 보면 ApplicationContext 공장을 하나 만드는데요. 공장한테 'bean 클래스 관련 설정들이 여기에 있어 classpath: 를 참조해봐' 라고 알려주는 코드입니다. 여기서 재미있는 점은 우리가 applicationContext.xml 파일을 resources 폴더 아래에 넣었는데요. classpath 를 지정할 때는 따로 경로 설정을 하지 않은 것을 볼 수 있습니다. 그 이유는 resources 폴더를 자동으로 인식을 하기 때문에 그렇습니다. 이렇게 '관습'적으로 지켜야하는 규칙들이 많은 것을 볼 수 있습니다.
그 다음에생성한 공장을 통해서 getBean 메서드를 생성하고자 하는 클래스이름을 인자로 넣어서 실행하면 인스턴스를 생성해서 반환시켜 줍니다. 코드를 다음과 같이 완성시킨 다음에 실행을 시켜보겠습니다.
성공적으로 출력이 되는 것을 확인할 수 있습니다. 그런데,여기서 알고 넘어가면 좋은 것이 하나 더 있는데요.다음과 같이 코드를 추가하고 실행시켜 보겠습니다.
위 코드 실행 결과를 보면 공장을 통해 getBean 을 또 실행시켜서 다른 변수에 대입하였는데요. 두 변수가 같은 주소를 갖고 있는 것을 확인할 수 있습니다. 이런 결과가 나온 이유는공장이 싱글톤 패턴으로 구현되어 있기 때문입니다. 싱글톤 패턴으로 구현된 이유는 메모리 활용성을 확보하기 위해서인데요. new 키워드로 인스턴스를 생성하게 되면 서비스를 사용자들이 이용할 때마다 새로운 메모리가 할당되어 메모리 낭비가 심해지게 됩니다. 이런 문제를 해결하기 위해 IoC / DI 는 싱글톤 패턴을 사용합니다.
즉, bean 공장들이 싱글톤 패턴으로 bean 들을 생성하고 있구나 이해를 할 수 있습니다. 이렇게 객체를 대신 생성해주고 싱글톤으로 관리해주는 기능 등을 IoC 제어의 역전이라고 합니다.