#
객체를 속성과 기능과 함께 인스턴스화 할 때(OOP) 한계가 있다
그래서 객체를 만들어서 서로 협업(조립)시킨다 => Framework

설계도(클래스, 객체)를 만드는 이유 : 재사용성을 위함

Spring에서의 협업 : Extend가 아니라, POJO(평범한 자바)로 가지고 있는(haser) 개념으로 가고, 이를 이용해 협업한다. 이때 코드를 분리하고 조립(factory)하게 된다.

메인부에서 객체를 선언하고, 어떤걸 만들지 조립하고, 호출하는게 일반적인 개발의 흐름
근데 이렇게 하면 개발자가 공식대로 다 만들고, 일정한 패턴으로 코딩해야함
프레임워크에서는 IOC 컨테이너를 서비스해서, 얘네 문법만 익히면 기본적인 패턴이나 문법이 적용된 상태로 코드를 분리할 수 있고 조립할 수 있다

Spring 모듈중에 Core가 있고, 그 안에 DI가 있음. 이는 협업하는 객체를 wiring해줌. => 코드의 분리 + 확장성 향상

문법에서 set은 집어넣고, get은 반환하는 건데..
@Required를 하면 반드시 DI를 하도록 한다.
@Autowired를 하면 자동으로 묶어준다.(DI해준다)

xml을 보면 bean으로 객체를 만들고, property를 만듬.
예시에서 person이 book을 가지고 있다.
book이 1개뿐이면 person과 book이 같은 타입이니까 잘 가져오게 되는데(book을 person에 DI시키는데),
book이 2개라면 타입이 겹치니까 이름으로 가져올 수밖에 없음. => annotation으로 해결 가능

setBook에 @Requried만 쓰면 에러가 남(DI를 안 해놨으니까)
거기에 @Autowired를 추가하면 에러가 사라짐(하나하나 bytype으로 DI가 되니까)
참고로, 바로 bean에 접근하는 resource 개념이 있음
그리고 bean에 안 만들어줘도 다른 annotaion을 이용해서 가능하도록 할 수 있다.

내가 primitive 자료형(기본자료형) 혹은 레퍼런스 자료형(오픈 api)를 가지고 있을 수 있는데,
이를 DI시켜서 루즈 커플링해서 사용하는게 spring framework의 핵심

spring에서는, xml뿐만 아니라 java 소스만으로 DI를 시켜줄 수 있도록 제공한다(@bean).
기존의 방식인 xml로 DI시키는 것도 있고, java 소스로 DI시키는 것도 있고 함께 사용할 수 있음.

 

#
@Qualifier를 사용하면 값을 넣을 수 있음
setBook 메서드 위에다가 쓰면 객체가 하나라면 괜찮은데 여러개일 경우 여러개에 모두 한 value만 들어가게 되니까, 파라미터에다가 하나씩 붙여주면 값을 넣을 순 있음.

 

# MVC
- 웹은 전부 MVC로 되어있음(Spring, 전자정보 등등)
- 모델과 뷰를 분리함

 

# Spring MVC
- Client가 Dispatcher Servlet을 호출(요청을 위해)
=> 이때 Spring에서는 url 전체를 command로 본다.
- 서블릿이 호출되면 Handler Mapping이 불러와짐(키, 밸류 형태로 어떤 액션을 할지 맵핑)
- 핸들러맵핑이 확인해서 관련된 컨트롤러를 불러옴
- 컨트롤러가 ModelAndView를 디스패쳐 서블릿에 넘겨줌
- 확인해서 ViewResolver를 불렀다가 View를 볼러옴