1.Spring & 개발환경
IOC & Container
의존성 주입 ( Dependency Injection, DI)
APP→ Web App (enterprise 환경) ⇒ 분산환경 ⇒ Spring F/W 이 편리하다.
는 자바로 Enterprise Application을 만들 때 포괄적으로 사용하는 Programming 및 configuration Model을 제공해 주는 Framework로 Application 수준의 인프라 스트럭쳐를 제공
→ 즉 , 개발자가 복잡하고 실수하기 쉬운 low level에 신경 쓰지 않고 business logic개발에 전념할 수 있도록 해준다.
POJO( Plain Old Java Object )
특정 환경이나 기술에 종속적이지 않은 객체지향 원리에 충실한 자바객체
테스트하기 용이하며, 객체지향 설계를 자유롭게 적용가능
PSA ( Portable Service Abstraction ) - 일관성 있는 추상화
어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한것을 서비스 추상화라고 한다.
⇒ 서비스 추상화의 예 ) JDBC 데이터베이스 종류에 관계없이 같은 방식으로 제어할 수 있는 이유는 어댑터(변환기) 패턴을 활용 했기 때문이다.
loC/DI
DI는 유연하게 확장 가능한 객체를 만들어 두고 객체간의 의존관계는 외부에서 다이나믹하게 설정
IOC 제어의 역전
→ 프로그래밍에서 의존 관계는 new로 표현된다.
의존성을 설정 파일에 모아두고 관리(주입) 함으로서 얻는 이점은 재컴파일/ 재배포 없이 프로그램의 실행 결과를 변경할 수 있다는 것이다.
AOP( Aspect Oriented Programming ) - 관점 지향 프로그래밍
스프링 DI가 의존성에 대한 주입이라면 스프링 AOP는 로직(Code)의 주입이라고 할 수 있다.
관심사 의 분리를 통해서 소프트웨어의 모듈성을 향상
공통 모듈을 여러 코드에 쉽게 적용가능
프로그램을 작성하다 보면 다수의 모듈에서 공통적으로 나타나는 부분이 존재 = 횡단 관심사
⇒ 코드 = 핵심 관심사 + 횡단 관심사(cross-cutting concern)
스프링 AOP의 핵심
스프링 AOP는 인터페이스(interface) 기반이다.
스프링 AOP는 프록시(proxy) 기반이다.
Target객체에 대한 proxy를 만들어 제공
스프링 AOP는 런타임(runtime) 기반이다.
Joinpoint
클래스의 인스턴스 생성 시점, 메소드 호출 시점, 예외 발생시점과 같이 애플리케이션을 실행할 때 특정 작업이 시작되는 시점 ( ~할때)
Advice
joinpoint에 삽입되어져 동작할 수 있는 코드 ( 공통 기능 )
핵심 업무 처리 중간에 끼어들어가서(Weaving) 작업하는 내용을 가지고 있는 메소드
공통의 업무를 가지고 있는 메소드
Advice Type
Before : target의 핵심 메소드 실행 전
After : target의 핵심 메소드 실행 후
AfterRetunring : target의 핵시메소드 실행하고 값을 리턴 한 후
Round : target의 핵심메소드 실행 전 / 후
After Throwing → target의 핵심 메소드 실행 중 예외가 나면
Pointcut
여러개의 joinpoint를 하나로 결합한 것
Weaving
Advice를 핵심 로직 코드에 삽입하는 것
Target
핵심 로직을 구현하는 클래스
Aspect
여러객체에 공통으로 적용되는 공통 관점 사항
Advice를 가지고 있는 클래스
AOP 방법
execution([수식어][리턴타입] [클래스이름][이름]([파라미터])
경량 컨테이너
스프링은 자바객체를 담고 있는 컨테이너다.
스프링컨테이너는 이들 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리
언제든지 스프링컨테이너로부터 필요한 객체를 가져와 사용할 수 있다.
DI
스프링은 설정 파일이나 어노테이션을 통해서 객체간의 의존 관계를 설정할 수 있다.
따라서, 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
외부에서 생성된 객체를 setter()나 생성자를 통해 사용하는 방법 (의존성 주입)
⇒ A 객체에서 B, C객체를 사용(의존)할 때 A 객체에서 직접 생성 하는 것이 아니라 외부(IOC컨테이너)에서 생성된 B, C객체를 조립(주입)시켜 setter 혹은 생성자를 통해 사용하는 방식
AOP
POJO
IOC (inversion of Control - 제어의 역전)
"제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
IOC는 스프링이 갖고 있는 핵심적인 기능
객체지향 언어에서 object간의 연결관계를 런타임에 결정
객체간의 관계가 느슨하게 연결됨
IOC구현 방법중 하나가 DI, 다른건 DL
객체 생성 순서
객체 생성
의존성 객체 생성
클래스 내부에서 생성
의존성 객체 메소드 호출
스프링 객체 생성 순서
객체 생성
의존성 객체 주입
스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 주입한다.
의존성 객체 메소드 호출
스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴
의 특징을 가지며,
제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
Spring Core → spring에서 가장 기반이 된다.
MAVEN, Gradle
IOC는 스프링이 갖고 있는 핵심적인 기능
객체지향 언어에서 object간의 연결관계를 런타임에 결정
객체간의 관계가 느슨하게 연결됨
IOC구현 방법중 하나가 DI, 다른건 DL
→ 객체의 생성 사용 소멸에 해당하는 라이프사이클 담당
기능
라이프사이클 관리
Dependency 객체 제공
필요성
factory나 singleton 패턴을 구현 X → 컨테이너차원에서 지원됨
IOC Container
스프링에서 IOC를 담당하는 컨테이너에는 BeanFactory (spring 2.~) , ApplicationContext( spring 3.~)
Spring DI Container
객체간의 강한 결합
클래스 호출 방식
클래스내에 선언과 구현이 모두 되어있기 때문에 다양한 형태로 변화가 불가능
객체간의 강한 결합을 Assembler( Spring) 를 통해 결합도를 낮춤
IOC 호출 방식
팩토리 패턴의 장점을 더하여 어떠한 것에도 의존하지 않는 형태가 됨
**실행시점(Runtime)에 클래스 간의 관계가 형성**됨
DI는 의존성 주입을 의미함
객체 사이의 의존 관계가 자기 자신이 아닌 외부(스프링)에 의해서 설정
빈 생성 범위
싱글톤 빈(singleton Bean)
스프링 빈은 기본적으로 싱글톤으로 만들어짐
그러므로 제공하는 모든 빈의 인스턴스는 항상 동일함
컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶은 경우 scope를 prototype으로 설정해야함
스프링 빈 설정 : Annotation
스프링이 제공하는 서블릿 기반의 MVC 프레임워크
MVC ( Model- view - controller ) pattern
Model
어플리케이션 상태의 캡슐화
상태 쿼리에 대한 응답
어플리케이션 기능 표현
변경을 view에 통지
View
모델을 화면에 시각적으로 표현
모델에게 업데이트 요청
사용자의 입력을 컨트롤러에 전달
컨트롤러가 view를 선택하도록 허용
Controller
어플리케이션의 행위 정의
사용자 액션을 모델 업데이트와 mapping
응답에 대한 view 선택
어플리케이션 확장을 위해 model , view , controller 세가지 영역으로 분리
컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치지 않음( 유지보수 용이)
컴포넌트 간의 결합성이 낮아 프로그램 수정이 용이 ( 확장성 뛰어남 )
장점
화면과 비즈니스 로직을 분리해서 작업 가능
영역별 개발로 인하여 확장성 뛰어남
표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음
단점
개발 과정이 복잡해 초기 개발 속도가 늦음
초보자가 이해하고 개발하기 다소 어려움
DispatcherServlet ( Front Controller )
모든 클라이언트의 요청을 전달받음
controller에게 클라이언트의 요청을 전달하고, controller가 리턴 한 결과 값을 view에게 전달하고 알맞은 응답을 생성
HandlerMapping
클라이언트 요청 URL을 어떤 Controller가 처리할지를 결정
URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음
Controller
클랑이언트의 요청을 처리한 뒤 ,Model을 호출하고 그 결과를 DispatcherServlet에게 알려준다.
ModelAndView
Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
ViewResolver
Controller가 리턴 한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정
View
Controller의 처리 결과를 보여줄 응답화면을 생성
Controller에는 Service-Dao - DB 연결동작이 이어져있다.
Controller를 거치는 이유가 화면에 보여줄 데이터를 얻어오기 위해서 → Spring은 Web_inf에 view를 빼놓고 컨트롤러를 통해서 접근한다. → 다이렉트로 실행 x
Controller에서
파라미터 이름과 변수명과 같으면 알아서 맵핑 된다!!
@GetMapping("/sendparam")
public String param(@RequestParam("username") String userid, @RequestParam String username, @RequestParam String area ) {
System.out.println(userid+" "+username+" "+area);
return "step02/form";
}
mybatis는 java object와 sql 문 사이의 자동 mapping 기능을 지원하는 ORM Framework
MyBatis는 SQL을 별도의 파일로 분리해서 관리
Object - SQL 사이의 parameter mapping 작업을 자동으로 해줌
개발자가 익숙한 sql을 그대로 이용하면서 jdbc코드 작성을 불편함을 제거해주고 도메인객체나 VO객체를 중심으로 개발 가능
쉬운 접근성과 코드의 간결함
가장 간단한 persistence Framework
XML형태로 서술된 JDBC코드라 생각해도 될 만큼 JDBC의 모든 기능을 MyBatis가 대부분 제공
복잡한 JDBC 코드를 걷어내며 깔끔한 소스 코드 유지
SQL문과 프로그래밍 코드의 분리
다양한 프로그래밍 언어로 구현가능