과거의나야도와줘
Spring 06. Spring 환경 설정 2 본문
주의!
공부하면서 제가 이해한 대로 쓰는거라 잘못된 부분이 있을 수 있습니다
만약 잘못된 부분이 있다면 댓글로 가르쳐주시면 감사합니다
지금부터는 이해보다는 어떻게 하는지를 아는게 중요하기 때문에 하나씩 따라하면서 익혀보는게 중요합니다.
01. 스프링 설정파일 & bean 등록하기
bean 객체의 등록은 스프링 설정 파일에서 합니다. 그럼 일단 스프링 설정파일을 만들어야겠죠
Source Folder를 하나 만들고 그곳에 설정파일을 만들 겁니다.
아래 이미지들을 보면서 하나씩 따라해봐요
스프링 설정 파일을 만들었으니 이제 bean객체를 등록해 볼까요
일단 default package로 만들어 놓은 파일들을 com.pokemon.spring 패키지를 하나 만들어서 넣어두고 갈게요
아까 만들어 놓은 설정 파일에 저 빨간 박스에 있는 코드를 작성합니다
한 가지 팁을 드리면 <bean class="Pikachu"></bean>을 작성하고 Pikachu에 커서를 두고 Ctrl+Space로 자동완성을 시키면 풀패키지 명이 입력됩니다.
저 코드에서 class 부분은 저 패키지에 있는 저 클래스로 객체를 만들겠다는 것
id부분은 이렇게 만든 객체를 다른 곳에서 사용할때 식별하기 위한겁니다.
// class부분이 우항의 Pikachu;
// id부분이 좌항의 pikachu라 생각하고
// 밑의 코드처럼 new를 여기서 한번 했다라고 생각하면 됩니다
Pikachu pikachu = new Pikachu();
02. 스프링 컨테이너 빌드 & 사용
bean 객체를 등록했으니 스프링 컨테이너를 빌드해서 사용해 볼까요? 용어가 어렵지만 일단 한 번 따라해봐요
일단 Test 파일에 이 코드를 작성합니다
먼저 22번째 라인은 우리가 xml 파일에 bean 객체를 등록했으니 등록한 객체를 Spring 컨테이너에 담아두는 작업입니다.
24번째 ~ 28번째 라인은 컨테이너로부터 내가 사용할 객체를 받아오는 건데요
컨테이너의 getBean("bean객체의id") 메소드를 사용합니다
두가지 방법이 있는데
26번째 라인은 context.getBean()으로 가져온 Object 객체를 내가 사용할 객체로 형변환 하여 가져오는 것이고
28번째 라인은 생성자안에 클래스명.class 인자를 하나 넣어줘서 그 클래스를 바로 반환받는 방법입니다.
편하신 방법으로 하시면 됩니다.
가져왔으니 한 번 써볼까요
그 전에 Trainer 클래스에 메소드 하나 추가 하고 갈게요
다시 Test로 돌아와서 아래 30, 31번째 라인을 추가하고 실행을 하면 제대로 동작합니다
우리가 직접 Trainer, Pikachu 클래스의 객체를 생성(new)을 하는 코드를 쓰진 않았지만 뭔가 제대로 동작을 하네요
03. Bean 객체들의 new 시점 알아보기
우리가 new를 하진 않았다면 스프링 컨테이너가 new를 대신 했다는 것인데
그렇다면 스프링 컨테이너는 Bean 객체들을 언제 만드는지 궁금하지 않으신가요?
두가지 후보가 있는데요
1. 22번 라인의 컨테이너가 만들어질 때
2. 26,28번 라인의 getBean() 메소드를 실행할 때
둘 중 하나라 생각을하고 한 번 실험을 해봅시다
밑에꺼는 직접 해보셔도 되고 안하고 보시기만 해도 됩니다
위 사진의 콘솔창을 보면 "컨테이너 빌드 완료" 가 출력 되기 전에 "Trainer의 생성자가 불렸습니다"가 출력 되었으니
정답은 1번 22번 라인의 스프링 컨테이너가 만들어질 때 bean 객체들이 new가 되는것을 알 수 있습니다.
참고로 lazy-init이라는 속성을 붙여주면
getBean()을 처음 사용했을때 new를 합니다. 모르셔도 돼요
04 (별로 안 중요함) 생성자가 아닌 메소드로 객체 받아오기
일반적으로는 생성자를 이용해서 bean 객체를 등록하겠지만 메소드로 받아올 수도 있습니다.
예를 들어 싱글턴 패턴처럼 getInstance 메소드를 만들어서 이 메소드를 통해 new를 하고 싶다 한다면(실제 싱글턴은 저렇지 않습니다)
그러면 factory-method라는 속성을 추가해줘서 생성자 대신에 저 메소드를 통해 객체를 만들겠다고 설정해 주면 됩니다. 자주 쓰지는 않아요
05. getBean으로 객체를 하나 더 받아와보기
한가지 궁금증을 더 가져볼까요
트레이너 객체를 getBean으로 한 번 더 가져오면 이 trainer2는 먼저 만든 trainer과 같은 객체일까요 다른 객체일까요?
위 사진을 보니 둘이 같은 객체인것을 확인이 되네요
이로써 스프링 컨테이너의 기본 정책은 singleton이라는 것을 알 수 있습니다.
그런데 객체를 다른것을 여러개를 만들고 싶을 수 도 있잖아요?
bean에는 scope라는 속성이 있는데 이게 기본적으로 singleton으로 설정되어 있습니다.
이 scope를 prototype으로 바꾸면 어떤일이 일어나는지 볼까요
마치 Trainer에 lazy-init 속성을 적용한 것처럼 getBean()을 할 때 new가 되고 또 lazy-init과는 다르게 맨 처음에만 new가 되는 것이 아니라 getBean()을 할 때 마다 new가 되는 것을 볼 수 있습니다.
06. Property를 이용해 의존관계를 설정하기(Property Injection)
Trainer 클래스에 setAge() 메소드를 만들어 놓을게요
applicationContext.xml로 돌아와서
Trainer의 <bean></bean> 사이에
<property name=""></property>을 넣고
"" <- 사이에 커서를 두고 ctrl+space를 하면 아래처럼 만들어둔 setter 메소드들이 나타납니다
일반적인 값을 넣어줄때는 value로
등록한 bean객체를 넣어줄 때는 ref로 넣어주면 됩니다
우리가 원래 의존성을 주입하고 있던 코드인 32번째 코드를 주석처리 했는데도 property injection을 설정한 덕분에 코드가 제대로 동작하는 것을 볼 수 있습니다.
xml에서 의존성을 주입할 수 있으니 자바 코드를 고치지 않고 설정 파일만 수정해도 코드를 수정할 수 있겠네요
이번 포스팅은 엄청 기네요 분량 조절 실패입니다.
정리도 제대로 안 된 것 같지만
지금은 다양한 방법들을 알아보는 중이라서 일단 따라서 한 번 쳐보시기만 해도 좋습니다.
나중에 아 이게 이거였구나 알게 되실거에요
다음 포스팅에서 봐요
'개발공부노트 > Spring' 카테고리의 다른 글
Spring 08. AOP(Aspect Oriented Programming) 01 (0) | 2022.10.21 |
---|---|
Spring 07. Spring 환경 설정 3 (0) | 2022.10.20 |
Spring 05. Spring 환경 설정 1 (0) | 2022.10.13 |
Spring 04. Spring 개발 환경 구축 (0) | 2022.10.12 |
Spring 03. Strategy Pattern - 디자인패턴 & 제어 역전 & 의존성 주입 (0) | 2022.10.12 |