본문으로 바로가기

18/12/24

category 수업내용 정리/정리안된 메모 2019. 6. 16. 20:59

18/12/24

참고하면 좋은 블로그 

스프링MVC 패턴 https://hunit.tistory.com/189

[Spring Framework]​ : 자바기반 웹어플리케이션을 쉽게 제작할 수 있께 도와주는 프레임 워크

Framework : 뼈대, 특정한 목적을 가지는 프로그램을 작성하기 쉽게 프레임(바탕)을 만들어주는 역할을 한다. 프레임워크에서는 해당 프로그램의 구성요소들을 작성하기 쉽게 하는 방법들을 제공한다. ​

예) 웹 프로그램 (요청을 받고 view/date를 응답하는 프로그램) 

구성요소 : servlet, jsp(view), service, dao, model ...

이러한 구성 요소들을 조립해서 웹 application을 작성 

프로그램이란, 객체들이 여러개 모여서 동작하는데 스프링프레임워크 에서는 프로그램 작성에 필요한 객체들을 Spring container에 모아놓고 관리할 수 있는 기능을 제공한다.

공부하게 될 것 

1. 스프링 설정(스프링 컨테이너 작성 및 Bean 생성 방법)하는 방법 

  1-1 의존성 주입

  1-2 제어역전 

  등의 개념에 대해서 공부하도록 하겠습니다.

2. 스프링에서 제공하는 구조를 이용한 어플리케이션 제작 

[특징]

• 자바 객체 관리 경량급 컨테이너

• POJO방식의 프레임워크

 제어역전(Inversion of Control)을 지원 : 모든 객체를 스프링 컨테이너에 모아 두고 사용

 의존성 주입(Dependency Injection)을 지원 : 개발자가 직접 setter 또는 생성자를 통해서 의존성을 주입하지 않아도 간단한 설정을 해두면, 스프링프레임 워크가 알아서 의존성 주입을 해준다.

• 관점지향 프로그래밍:AOP(Aspect Oriented programming)를 지원

• 다양한 API제공 및 연동지원

​​

[스프링프레임 워크의 구조]

 

  • 스프링 프레임워크 프로젝트를 만든다 라는 것은 제공하는 라이브러리를 이용해 어플레케이션을 제작한다는 뜻이다.

 

Spring Core

 •Core 컨테이너 기능

 •Spring 프레임워크의 근간이 되는 IoC (또는 DI) 기능을 지원하는 영역

 •BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원한다.

Spring Context

 •Spring Core에서 지원하는 기능외에 추가적인 기능들과 좀 더 쉬운 개발이 가능하도록 지원한다.

 •또, JNDI, EJB 등을 위한 Adaptor들을 포함하고 있다.

AOP

 •Spring 프레임워크에 AOP를 지원하는 기능이다.

DAO

 •JDBC 기반하의 DAO 개발을 좀 더 쉽고, 일관된 방법으로 개발하는 것이 가능하도록 지원한다.

ORM

 •Object-Relational Mapping 프레임워크인 Hibernate, MyBatis, JDO와의 결합을 지원하기 위한 기능이다.

Spring Web

 •Web Application 개발에 필요한 Web Application Context와 MultipartRequest 등의 기능을 지원한다.

Portlet

 •포탈 서버에서 돌아가는 독립된 웹 애플리케이션 원격 지원 기능​

[Spring Framework을 이용한 프로젝트 작성하기]

1. 스프링프레임워크 라이브러리 받아오기

  Maven이라는 프로젝트 관리 툴을 이용한다.

  Maven : 프로젝트 설정값 버전 관리하는 관리 툴, 주로 라이브러리 관리에 많이 사용된다.

 1-1 프로젝트를 Maven 프로젝트로 변경

  프로젝트 우클릭 > configure > convert to maven project 

  pom.mxl이 생성되면 완료 

 1-2 pom.xml에 dependency 설정

 1-3 스프링컨테이너 생성 및 빈(bean) 생성

  스프링 프레임워크는 프로그램에서 사용 할 객체를 미리 만들어서 스프링 컨테이너에 담아뒀다가 

  ​​사용 하는 개념이다.

  ⓐ. 스프링 컨테이너 생성 

  (담아서 사용하고자 하는 bean설정이 함께 포함)

  스프링컨테이너를 생성하기 위해서는 스프링 컨테이너 설정파일이 필요하다.

  ⓑ. 스프링 컨테이너에 생성된 bean(객체)를 꺼내서 사용 

  ​C:\Users\Bit\.m2

  ​C:\Users\Bit\.m2\repository\org\springframework


사용하고자 하는 객체를 미리 생성해서 스프링컨테이너에 담아두고 사용 

spring-core : 스프링 컨테이너를 만드는 놈

spring-context : 의존성을 주입할 떄 사용 (빈 생성)

[제어역전 다시 살펴보기]

이미지0)

이미지0-1)

이미지0-2)

Car를 사용하는 drive 라는 클래스에서 Car를 호출하면서, 생성자에 ChinaTire를 넣어주는 모습을 볼 수 있다. 

이러한 방식으로 코드를 짜는 것을 '제어역전'이라고 한다. 생성자 혹은 setter를 통해서 객체를 만들어서 넣어주는 부분을 '의존성 주입' 이라고 한다.

Car라는 클래스는 Tire가 있어야 동작을 하기 떄문에, Car는 Tire에 의존 한다고 할 수 있다. 이러한 상황에서 Car 클래스가 직접 Tire 객체를 생성 하는 것이 아니라, 자신을 호출하는 상위 클래스에서 해당 작업을 위임하는 것을 '제어역전' 이라고 한다.

[스프링 프레임워크, 제어역전 기능 사용해보기]

앞선 [제어역전 다시 살펴보기] 에서 프로그램이 동작하기 위해서 Car 객체1개와 Tire 객체 1개, 총 2개의 객체를 개발자에 의해서 직접 객체를 생성되었다. 하지만 스프링프레임워크 에서는 개발자는 설정만 하고 객체생성은 스프링이 한다.

이미지0-1) Bean 생성하고 설정하기 1

이미지0-2)  Bean 생성하고 설정하기 2

이미지1-1) 직접 새로운 객체를 생성하지 않고, 설정해둔 id 값을 이용해서 tire의 roll()를 불러온 것을 알 수 있다. getBean()의 반환형은 Object 인데 이미지0-2에서 설정 했던 클래스가 Tire 인터페이스를 구현하는 클래스 이기 때문에, Tire로 형변환을 해주어서 사용하는 모습을 볼 수 있다.

이러한 형변환은 아래 쪽 이미지 처럼 쉼표를 찍고 해당 bean이 담고 있는 객체의 부모 클래스를 직접 적어주어도 같은 기능을 한다.

이미지1-2) Bean에 Car Class 지정하고 사용해보기

Tire.roll() 메서드가 비어있기 때문에 널 포인트 예외가 나오게 된다

이미지1-3)

tire를 setter를 이용해서 '의존성 주입'을 해줄 경우 예외가 나지 않지만, 이런 것은 스프링 프레임워크가 지원하는 의존성 주입 지원을 사용하는 것이 아니다.​

[xml 설정 (설정파일)에 의한 bean 생성 및 의존성 주입]

[의존성주입하기]

이미지0-1) 스프링컨테이너에 생성자를 이용한 의존성 주입 방법

이미지0-2) 스프링컨테이너에 setter를 이용한 의존성 주입 방법

앞서 생성자를 이용한 의존성 주입과 마찬가지로 ref=""는 동일하지만, name이라는 속성을 추가로 작성해주게 된다. 이때 name에 들어가는 것은 setter의 이름이며, el태그를 활용 할 떄 처럼 setter의 이름에서 첫 글자를 소문자로 바꾸어서 적어준다.

[연습 : DAO, Service 스프링으로 사용해보기]

이미지0-1) pom.xml 설정하여 ojdbc6 버젼 입력하기 

이미지0-2) 

이미지1) service의 login 기능 사용해보기 

service에 참조 되는 객체를 생성하는 과정이 필요한데, 개발자가 new 생성자() 객체를 생성하지 않고, 스프링 컨테이너에 설정해서 프르링프레임워크가 객체를 생성하게 한다.

 + 의존성 주입 : Service 객체가 제대로 동작하기 위해서는 DAO 객체가 필요한데 이를 service가 dao에 의존한다 라고 표현 할 수 있다.

UserDao=new UserDao(); (의존성 생성) 의존성을 클래스 내부에서 생성하지 않고 외부에서 받아노는 것 = 의존성 주입 

[스프링컨테이너의 구조]

앞선 실습에서 사용 한 것은 가운데에 위치하고 있는 ApplicationContext 이다.

Annotation(@)을 이용한 bean 생성 및 의존성 주입

@사용을 위한 설정

001 pom.xml 하단 탭 중 Namespaces 선택

​002 context 체크 해주기 

​003 pom.xml 상단에 추가된 xmlns:context를 확인한다.

[@Component annotation을 이용한 bean 등록한방법]

이미지0) pom.xml에 context:component-scan 설정하기

이미지0) bean을 만들고자 하는 클래스에 @Component 추가하기.

이미지1) getBean 할 때 id에 적을 id

이미지2)

Tire에 대한 의존성 주입이 되어있지 않기 때문에 널포인트 예외가 발생하게 된다.

[@Autowired annotation을 이용한 의존성 주입]​

이미지3)

Car 클래스의 생성자 위에 @Autowired를 작성해주면, 별도의 의존성 주입없이 자동으로 의존성이 주입되어 예외가 나지 않는 모습을 볼 수 있다.

[@Autowired] : 스프링컨테이너 내에서 해당 파라미터와 타입이 같은 bean을 찾아서 의존성 주입 해주는 코드

[@Component이 여러개 작성되어있다면 ? ]

이미지0) korea, china 둘다 Component 한 상황

이미지1) 위 상황에서 실행을 한 결과

이미지2) 해결방법 : @Qualifier 

@Autowired : 타입우선 매칭, 스프링컨테이너 내에서 해당 파라미터와 타입이 같은 bean을 찾아서 의존성 주입하는 것으로, 만약에 해당하는 타입의 bean이 여러개 존재 한다면, 타입매칭이기 때문에 어떤 bean을 의존성 주입할 지 결정할 수 없다. 그 결과 예외가 발생하게 된다.

@Qualifier("beanId")를 통해서 특정 bean을 의존성 주입할 수 있다.


[그 밖에...]

[@Component("id") ]

@Component("id") 괄호 안에 bean에 사용 될 ID값을 직접 지정해 줄 수도 있다.

[@Autowired(required=false)]

@Autowired(required=false)

의존성 주입할 적절한 객체가 없으면 의존성 주입하지 않은 채로 객체 생성

컨테이너 박스는 실행에 성공하지만, driver(); 객체를 사용 할 때 Tire가 필요하기 때문에 널포인트가 발생하게 된다. *실습을 위해 Tire 클래스들의 @Component을 삭제 한 상태의 결과

[변수 위에 @Autowired]

생성자 혹은 serter가 아닌 변수명 위에 @Autowired를 붙여도 정상적으로 작동하는 모습을 볼 수 있다. 이 경우 해당 변수가 private 이여도 무관하게 작동한다. 이때 해당 변수는 setter와 같은 동작을 하기에 @Qualifier("beanId") 역시 사용 할 수 있다.






'수업내용 정리 > 정리안된 메모' 카테고리의 다른 글

[MyBatis와 Spreing 연동하기]  (0) 2019.06.16
18/12/31​  (0) 2019.06.16
18/12/28  (0) 2019.06.16
003  (0) 2019.06.16
18/12/26  (0) 2019.06.16