스프링 부트에서 토비 3.1 따라하기 : 1장 오브젝트와 의존관계 - 1.5 스프링의 IoC
개발환경 - OS : mac - STS : 4.0.1 - MySQL : Server version: 8.0.13 Homebrew - Frame-Work : 일단 최대한 의존성 없이 운영될 수 있도록 jar로 만 진행 관련 링크 - 스프링 사용자 모임_홈페이지 http://www.ksug.org/ - 스프링 사용자 모임 질의응답 https://groups.google.com/forum/#!topic/ksug/13vB4tCFqrI - 2017 스프링캠프 https://www.youtube.com/playlist?list=PLdHtZnJh1KdZ6NDO9zc9hF4tONDLTSEUV |
1장 오브젝트와 의존관계
1.5 스프링의 IoC
Inversion of Control 라는 용어이다. 스프링 이전부터 상당히 오래된 개념이다. 이를 반영하여 UserDao를 조금 더 개선해보자 라고~ 한다.
1.5.1 오브젝트 팩토리를 이용한 스프링 IoC
1. 애플리케이션 컨텍스트와 설정정보
시작부터 많은 용어들이 등장한다. 이름도 비슷하고 기능도 비슷하고.. 뜨아, 그림으로 정리해본다
참고로 토비 책에서 저자는 당분간 빈 팩토리와 애플리케이션 컨텍스트를 동일하다고 생각하면 된다고 한다. 위에 <내 그림 4>를 보면 반가운 이름 DaoFactory 가 등장한다. 이전 예제에서 만든 팩토리 클래스이다. 여기에 설정정보만 따로 분할하면 애플리케이션 컨텍스트가 되는 것이다.
그리고 저자는 빈 팩토리와 애플리케이션 컨텍스트에 설정정보를 만드는 방법을 안내하고 있다.
앞서 나왔던 그림을 다시보면 DaoFactory 예제에서 애플리케이션 로직을 담고 있는 컴포넌트와 설계도 역할을 하는 팩토리를 구분했었다. 바로 이 설계도라는 것이 이런 어플리케이션 컨텍스트와 그 설정정보를 말한다고 보면 된다. 그 자체로는 애플리케이션 로직을 담당하지는 않지만 IoC 방식을 이용해 애플리케이션 컴포넌트를 생성하고, 사용할 관계를 맺어주는 등의 책임을 담당하는 것이다. 마치 컨물이 설계도면을 따라 만들어지듯..
2. DaoFactory를 사용하는 애플리케이션 컨텍스트
(자, 여기서부터의 주어는 스프링이다. 그 중에서 스프링의 빈 팩토리)
스프링의 빈 팩토리가 앞서 작성한 DaoFactory를 사용할 수 있도록 설정정보를 만들어보자
1) 스프링이 인식할 수 있도록 어노테이션 @ 을 추가한다.
@configuration <- 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스
적용 대상 1.) class DaoFactory
@bean <- 오브젝트를 만들어 주는 메소드
적용 대상 1.) userDao() 메소드 : UserDao 타입의 오브젝트를 생성하고 초기화해서 돌려주는 역할 담당
적용 대상 2.) connectionMaker() 메소드 : ConnectionMaker 타입의 오브젝트를 생성하는 역할 담당
(1) 코드 작성
package springbook.user.dao;
/**
* 토비의 스피링 3.1 예제 따라하기
* 1장 - 05 스프링의 IoC - DaoFactory에 설정파일 분리하기
*
* @since 2019.02.22
* @author 변찬우 http://normalstory.tistory.com
*/
@Configuration
public class DaoFactory {
/**
* UserDao 타입의 오브젝트를 생성하고 초기화해서 돌려주는 역할 담당
* @return
*/
@Bean
public UserDao userDao() {
UserDao userDao = new UserDao(connectionMaker());
return userDao;
}
/**
* ConnectionMaker 타입의 오브젝트를 생성하는 역할 담당
* @return
*/
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
작성한 코드는 xml과 같은 스프링 전용 설정정보로 변경된 것이다. 물론 개념적으로. 파일은 아직 그대로 class 파일이다.
(2) 빨간 줄 제거, 를 위한 라이브러리 추가
다만, 아직 각 어노테이션에 빨간 줄이 뜬다.
스프링용 코드를 썼기 때문에 스프링에 대한 라이브러리를 추가 해야한다. 여기서 나랑 안 맞는 부분이 등장한다. ;D 진행 순서가 잘 모르겠다. 저자는 일단 코드를 작성하고 나서 라이브러리를 추가할지 라이브러리를 추가하고 나서 코딩을 한다. ( 캡쳐화면과 포스팅 내용과 다를 수 있습니다.. ;> )
하지만 난 에러를 보았고 .. 여튼 빨간 줄이 떴으니 이거부터 해결을 해야겠다. 다소 길다. 그리고 보통? jar파일을 그대로 추가하기보다 메이븐이나 그래들을 사용한다. 스프링 부트 이전에는 메이븐을 주로 사용하는 것 같고 스프링 부트 이후부터는 그래들을 많이 쓰는 거 같다. 개인적으로 뒤에 가서 둘 다 적용해볼 예정이다. 다만 다 한번씩은 써봐야하니까? 이번엔 직접 jar를 추가해보겠다 1. 라이브러리 받기 우선 스프링관련 라이브러리 파일은 애지간하면 https://mvnrepository.com 이곳에서 찾을 수 있다. 순서는 다음 캡쳐와 같다. 1) 사이트를 방문한다. 그리고 검색 창에 필요한 라이브러리를 검색한다. 2) 검색결과를 클릭하면 상세 화면이 나온다. 이곳에서 원하는 버전을 선택한다. 가장 최신 버전보다는 두번째 버전 또는 다운로드 횟수가 가장 많은 것을 받는 것이 안전? 하다. 3) 원하는 버전을 클릭하면 다운로드 페이지로 온다. 항목을 잘 살펴보면 메이븐, 그래들, jar, pom 파일.. 다 받을 수 있다. 사이트 이름만 메이븐 레파지토리이다. 4) 원하는 파일을 이런 식으로 쭈욱 받는다. (1) 저자가 설치하라고 하신 파일 목록 7개 입니다. cglib, common-logging, spring asm, spring beans, spring contexts, spring core, spring expression (2) 하지만 에러가 납니다... ㅜㅜ 아무래도 버전이 달라서 인듯합니다. 아래 메시지를 보니 AOP가 필요하다고 합니다요. 레파지토리에가서 Spring AOP를 검색하고 다운로드 받아서 추가 했습니다. (3) 기승전 이거가 최종 묶음입니다. JARs for tobe spring 1.5 spring IoC.zip 2. 라이브러리 적용하기 5) 다시 스프링으로 돌아와서, 다운받은 라이브러리 파일 jar를 적용한 프로젝트를 선택한 후 오른쪽 마우스 클릭 6) 콘피그 빌드패스 config build path 로 들어오면 라이브러리 탭에서 오른쪽 버튼들 중 두번째 있는 external jars 를 클릭한다. 7) 다운로드했던 jar들을 모두 선택한다. 8) 해당 항목들이 추가 되었다. 9) 완료 후엔 되도록 프로젝트를 새로고침하는 것이 안전? 하다. 프로젝트 선택 후 오른쪽 마우스를 누르면 목록 중에 있다.(캡쳐 이미지는 생략). 그리고 나도 빨간 줄이 바뀌지 않았다. 하지만~ 빨간 줄 위에 마우스를 올리면 아래 캡쳐 이미지와 같이 레이어 팝업이 뜬다. 내용을 자세히 읽어보면 첫번째에 import 어쩌구저쩌구가 뜬다~ 그 링크를 클릭하면 빨간줄이 없어지면서 자동으로 위에 라이브러리가 추가된다. 끄읏~ 다시 코딩으로~ |
2) 스프링 전용 설정 정보를 사용하는 어플리케이션 컨텍스트를 만들어보자
어플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트 이다.
(1) ApplicationContext를 구현한 클래스는 여러가지가 있는데 우리가 사용한 DaoFactory 처럼 @Configuration가 붙은 자바 코드를 사용하려면 AnnotationConfigApplicationContext 를 이용하면 된다. 이때 생성자는 DaoFactory.class 를 넣어준다.
(2) 그리고 ApplicationContext의 오브젝트를 통해 getBean() 메소드를 이용하면 UserDao의 오브젝트를 가져 올 수 있다. getBean() 메소드의 파라미터로 "userDao" 가 왔는데 이 이름이 바로 빈 이름( DaoFactory에서 선언한 메소드 + @bean 을 붙인 이름 )이다.
> userDao 이라는 이름의 빈을 가져온다 = DaoFactory 의 userDao()를 호출해서 그 결과를 가져오는 것
(3) 코드 작성
package springbook.user.dao;
import java.sql.SQLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import springbook.user.domain.User;
/**
* 토비의 스피링 3.1 예제 따라하기
* 1장 - 05 스프링의 IoC - DaoFactory를 통해 설정 값에 접근하기
*
* @since 2019.02.22
* @author 변찬우 http://normalstory.tistory.com
*/
public class UserDaoTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
ApplicationContext context =
new AnnotationConfigApplicationContext(DaoFactory.class); // 추가된 코드
UserDao dao = context.getBean("userDao",UserDao.class); // 변경된 코드
User user = new User();
user.setId("whiteship9"); // <- PK에 해당하니까 수시로 변경 필요
user.setName("백기선");
user.setPassword("married");
dao.add(user);
System.out.println(user.getId() + "등록 성공");
User user2 = dao.get(user.getId());
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId()+"조회성공");
}
}
3) 결과 : 썩쎄스~
export_1.5.1 스프링 IoC : study_spring190222_1.zip
2) 혹시, 이전 포스팅 파일 import 하신 분은 이전 프로젝트를 삭제하시거나 이름을 바꾸신 후 다시 import 하셔야 합니다. |
1.5.2 애플리케이션 컨텍스트의 동작방식
1. 예제가 실행되는 방식과 절차
2. 구조 설명
1) 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다
애플리케이션 컨텍스트로 구현하면 DaoFactory와 같은 오브젝트 팩토리가 많아져도 어떤 클라이언트에게 어떤 팩토리를 연결해줄지 알 필요가 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있으며 DaoFactory를 XML처럼 단순한 방식을 사용해 IoC 설정정보를 만들 수 있다.
2) 애플리케이션 컨텍스트는 종학 IoC 서비스를 제공해 준다
이들의 역할은 단지 오브젝트 생성과 다른 오브젝트와의 관계 설정이 전부가 아니다.
오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수 있고 이에 부가적으로 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다. 또한 빈이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공해주기도 한다.
3) 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다
타입만으로 빈을 검색하거나 특별한 어노테이션이 설정되어 있는 빈도 찾을 수 있다
3. 용어 설명
1) 빈 또는 빈 오브젝트
관리되는 오브젝트 managed object
스프링이 IoC 방식으로 관리하는 오브젝트
스프링에서 사용되는 모든 오브젝트 X
스프링에서 직접 생성과 제어를 담당하는 오브젝트만 해당
2) 빈 팩토리
IoC를 담당하는 핵심 컨테이너
빈의 생성과 제어
BeanFactory 라고 붙여쓰면 빈 팩토리가 구현하고 있는 가장 기본적인 인터페이스의 이름이 된다.
3) 애플리케이션 콘텍스트
빈 팩토리를 상속한다.
빈 팩토리 + 스프링 애플리케이션 지원 기능
ApplicationContext 라고 붙여쓰면 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스의 이름이 된다.
4) 설정정보/ 설정 메타정보
configuration metadata 구성정보, 형성정보 또는 청사진 blueprint
IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다.
5) 컨테이너
컨테이너라는 말 자체가 IoC의 개념( IoC 방식으로 빈을 관리한다 )을 담고 있다. 추상적인 표현
= (빈 팩토리 관점) = IoC 컨테이너
= (스프링 관점) = 애플리케이션 컨텍스트 = 그 자체로 ApplicationContext 인터페이스를 구현한 오브젝트이다.
또한 이 오브젝트는 하나의 애플리케이션에서 보통 여러 개가 만들어져 사용된다. (= 스프링 컨테이너 )
'새로워지기 > 서른의 생활코딩' 카테고리의 다른 글
스프링 부트에서 테스트 주도 개발 실습 - 4장. 프라이버시 (0) | 2019.02.23 |
---|---|
스프링 부트에서 테스트 주도 개발 실습 - 3장. 모두를 위한 평등 (0) | 2019.02.23 |
스프링 부트에서 토비 3.1 따라하기 : 1장 - 1.4 제어의 역전 IoC (0) | 2019.02.21 |
스프링 부트에서 토비 3.1 따라하기 : 1장 - 1.3 DAO 확장 (0) | 2019.02.21 |
스프링 부트에서 토비 3.1 따라하기 : 1장 - 1.2 DAO 분리 (0) | 2019.02.19 |
댓글