spring, springboot

spring(의존성 주입(DI))

campanula 2023. 8. 16. 17:31

스프링 프레임워크의 역사

프레임워크: 뼈대나 근간을 이루는 코드들의 묶음

프레임워크를 이용한다는 의미: 프로그램의 기본흐름이나 구조를 정하고 모든 팀원이 이구조에 자신의 코드를 추가하는 방식으로 개발

장점: 실력이 부족한 개발자라 하더라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발 가능

간단함, 전체 구조를 설계할 때 유용함, 다른 프레임워크들의 포용, 개발 생산성과 개발 도구의 지원

 

자바 기반의 프레임워크

IoC: 결합도

AOP:응집도

스프링 프레임워크

개발자들에게 컴포넌트 모델을 제공하고, 단순하면서도 일관성 있는API 집합을 제공하여 개발자들이 복잡한 응용프로그램을 설계하는 동안 복잡하고 어려운 기반 코드에 연연하지 않도록 도움을 줌.

 

특징
경량 컨테이너로서 자바 객체를 직접 관리, 각각의 객체 생성, 소멸과 같은 생명 주기를 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

의존성 주입(DI)을 통한 객체 간의 관계 구성

AOP지원

편리한 MVC구조

WAS의 종속적이지 않은 개발 환경

POJO(Plain Old Java Object: 경량의 자바 객체 또는 별도로 종속되지 않는 자바 객체를 의미) 방식의 프레임워크

일반적인 J2EE에 비하여 기존에 존재하는 라이브러리 등의 지원이 용이하고 객체가 가볍다.

 

스프링은 의존성 주입(Dependency Injection(DI): 객체 사이의 의존 관계가 자기자신이 아닌 외부에 의해서 설정) 지원

의존성 주입을 역제어(IoC:Inversion Of Control)

즉, 역제어의 한 형태가 의존성 주입(DI)

DI컨테이너: 어떤 클래스가 필요로하는 값이나 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역할

생명주기: init, service

 

스프링은 관점 지향 프로그래밍 지원(Aspect-Oriented Programming, AOP)

기능을 핵심 비지니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법. 공통 모듈을 보안 인증, 로깅 같은 요소들이 해당

 

의존성(하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미, 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미) 주입(외부에서 밀어 넣는 것)(DI) => 어떤 객체가 필요한 객체를 외부에서 밀어 넣는다.

 

스프링에서 ApplicationContext가 관리하는 객체들을 '빈'이라는 용어로 부르고 빈과빈 사이의 의존관계를 처리하는 방식으로 XML 설정,어노테이션 설정, Java 설정 방식을 이용 가능

 

IoC 컨테이너

서블릿 컨테이너 = 매핑 필요

서블릿 컨테이너 동작 순서

1./WEB-INF/web.xml 파일 구동

2.브라우저로부터 요청 수신

3.클래스를 찾아 객체를 생성하고 doGet() 메서드 호출

4. doGet() 메서드 실행 결과를 클라이언트 브라우저로 전송

 

제어의 역행: 컨테이너로 처리하는 것을 의미 소스에서 객체 생성과 의존 관계에 대한 코드가 사라져 결과적으로 낮은 결합도의 컴포넌트 제작 가능

결합도가 높으면 유지 보수가 어려움=> 결합도를 낮추기 위해서 가장 쉽게 생각할 수 있는 것이 객체 지향 프로그래밍의 핵심 개념인 다형성을 이용. 인터페이스를 추가, 모든 객체가 공통으로 가져야 할 메서드들을 추상 메서드로 선언하면 유지 보수가 용이해진다.

 

=>디자인 패턴 이용하기

factory 패턴(외부에서 주소값을 받아와서 반환)을 적용. 클라이언트에서 사용할 객체 생성을 캡슐화하여 느슨한 결합 상태로 만들어줌

 

스프링 xml 설정파일 제작

bean 엘리먼트 사용. id 생략 가능하지만 class는 생략 불가능, bean을 가지고 인스턴스 생성

init-method: servlet 컨테이너는 web.xml 파일에 등록된 servlet 클래스의 객체를 생성할 때 디폴트 생성자만 인식. 생성자로 serlvet 객체의 멤버변수를 초기화할 수 없다. 그래서 서블릿은 init() 메서드를 재정의 하여 멤버변수를 초기화

destroy-method: 객체를 삭제하기 직전에 호출될 임의의 메서드 지정 가능

 

scope 속성

scope의 속성값을 "singleton"으로 설정하고 클라이언트에서 세번 요청하면 한번만 나옴=> 인스턴스 한번만 생성

 "prototype"으로 설정: 해당 bean이 요청될 때마다 매번 새로운 객체를 생성하여 반환

 

스프링의 가장 중요한 특징: 객체의 생성과 의존 관계를 컨테이너가 자동으로 관리(IoC: 제어의 역행) = 스프링의 핵심원리

의존성 Lookup: 컨테이너가 애플리케이션 운영에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식

 

의존성 Injection: 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리

 

※스프링 오류: 인스턴스를 생성하지 않아서 나는 오류가 많음.

외장 스피커를 사용할려면 필드 생성을 해줘야 한다.

 

의존관계 변경

인터페이스 추가

<bean id="1" class="com.spring.polymorphism.1" />

1인터페이스 객체로 이동

 

설정 파일

Setter 인젝션을 사용하려면 <property> 엘리먼트를 사용해야하며 name 속성값이 호출하고자하는 메소드 이름

 

Setter 메서드 이름 : name 속성값

setSpeaker(): name="speaker"

setAddressList(): name="addressList"

setBoardDAO(): name="boardDAO"

 

어노테이션 기반 설정

컴포넌트 스캔 설정

: <bean> 등록하지 않고 자동으로 생성하려면 <context:component-scan />이라는 엘리먼트를 정의

이 설정을 추가하면 스프링 컨테이너는 클래스 패스에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성 bean 설정파일 줄 필요없이 사용할 클래스 위에다 Annotation을 붙여준다.

 

@Autowired

생성자나 메서드, 멤버변수 위에 모두 사용가능

대부분 필드 위에 선언하여 사용. 해당 변수 타입을 체크, 그 타입의 객체가 메모리에 존재하는지를 확인한 후 그 객체를 필드에 주입. 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당

@Autowired

private Speaker speaker;

 

@Qualifier: 특정 객체의 이름을 이용하여 의존성 주입할 때 사용. 의존성 주입 대상이 되는 객체가 두 개 이상일 때 발생. 객체의 이름이나 아이디 지정가능

 

추가 어노테이션

@Component를 상속 어떤 클래스가 어떤 역할을 수행하는지 파악하기 위해

 

control단 annotation

 

기본 핸들러 @Controller와 @RequestMapping 어노테이션스프링 웹 MVC의 주요 구성 요소

 

컨트롤러: 사용자 요청을 해석하고 모델과 뷰를 반환하는 기능을 가진 메서드들로 구성. 

@Controller로 컨트롤러임을 선언하고 @RequestMapping으로 요청 url 패턴을 지정

 

컨트롤러 기본 형식

@Controller

public class 컨트롤러명{

  @RequestMapping("요청url패턴")

   public 반환타입 메서드명(Model 파라메타명...){

             비즈니스 로직;

       return "뷰명";

   }

}

 

@RequestMapping: URL을 컨트롤러의 메서드와 매핑할 때 사용하는 스프링 프레임워크의 어노테이션이다.

클라이언트의 요청URL 패턴이나 HTTP요청 메서드에 대해서 컨트롤러의 클래스나 메서드에 선언

속성

path(혹은 value): 요청된 URL에 따라 매핑

method: GET,POST, PUT,DELETE 같은 HTTP Request method에 따라 매핑을 결정

headers: 특정 헤더의 값에 따라 매핑

produces: 서버에 응답 헤더 타입과 문자셋 설정. produces = "text/html; charset=utf-8"

 

 

ModelAndView: 컨트롤러가 디스패처  서블릿에 반환해야 하는 뷰와 모델 정보를 모두 포함하고 있는 객체를 반환