공부복습 14주차

전재우·2021년 5월 16일
0

21-04-26

1.Spring & 개발환경

  1. IOC & Container

  2. 의존성 주입 ( Dependency Injection, DI)

APP→ Web App (enterprise 환경) ⇒ 분산환경 ⇒ Spring F/W 이 편리하다.

Spring Framework

는 자바로 Enterprise Application을 만들 때 포괄적으로 사용하는 Programming 및 configuration Model을 제공해 주는 Framework로 Application 수준의 인프라 스트럭쳐를 제공

→ 즉 , 개발자가 복잡하고 실수하기 쉬운 low level에 신경 쓰지 않고 business logic개발에 전념할 수 있도록 해준다.

Spring 삼각형

  • Enterprise Application 개발 시 복잡함을 해결하는 Spring의 핵심
  1. POJO( Plain Old Java Object )

    특정 환경이나 기술에 종속적이지 않은 객체지향 원리에 충실한 자바객체

    테스트하기 용이하며, 객체지향 설계를 자유롭게 적용가능

  2. PSA ( Portable Service Abstraction ) - 일관성 있는 추상화

    어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한것을 서비스 추상화라고 한다.

    ⇒ 서비스 추상화의 예 ) JDBC 데이터베이스 종류에 관계없이 같은 방식으로 제어할 수 있는 이유는 어댑터(변환기) 패턴을 활용 했기 때문이다.

  3. loC/DI

    DI는 유연하게 확장 가능한 객체를 만들어 두고 객체간의 의존관계는 외부에서 다이나믹하게 설정

    IOC 제어의 역전

    → 프로그래밍에서 의존 관계new로 표현된다.

    의존성을 설정 파일에 모아두고 관리(주입) 함으로서 얻는 이점은 재컴파일/ 재배포 없이 프로그램의 실행 결과를 변경할 수 있다는 것이다.

  4. AOP( Aspect Oriented Programming ) - 관점 지향 프로그래밍

    스프링 DI가 의존성에 대한 주입이라면 스프링 AOP는 로직(Code)의 주입이라고 할 수 있다.

    관심사 의 분리를 통해서 소프트웨어의 모듈성을 향상

    공통 모듈을 여러 코드에 쉽게 적용가능

    프로그램을 작성하다 보면 다수의 모듈에서 공통적으로 나타나는 부분이 존재 = 횡단 관심사

    코드 = 핵심 관심사 + 횡단 관심사(cross-cutting concern)

    스프링 AOP의 핵심

    • 스프링 AOP는 인터페이스(interface) 기반이다.

    • 스프링 AOP는 프록시(proxy) 기반이다.

      Target객체에 대한 proxy를 만들어 제공

    • 스프링 AOP는 런타임(runtime) 기반이다.

    스프링 AOP에서의 용어

    • 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 방법

    • xml 기반
    • annotation 기반

Pointcut 표현식 - joinpoint ( ~때를 모아 놓은것 )

execution([수식어][리턴타입] [클래스이름][이름]([파라미터])

  • execution ( com.spring.aop.test1.Service.find*(..))

Spring 특징

  • 경량 컨테이너

    스프링은 자바객체를 담고 있는 컨테이너다.

    스프링컨테이너는 이들 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리

    언제든지 스프링컨테이너로부터 필요한 객체를 가져와 사용할 수 있다.

  • DI

    스프링은 설정 파일이나 어노테이션을 통해서 객체간의 의존 관계를 설정할 수 있다.

    따라서, 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.


    외부에서 생성된 객체를 setter()나 생성자를 통해 사용하는 방법 (의존성 주입)

    A 객체에서 B, C객체를 사용(의존)할 때 A 객체에서 직접 생성 하는 것이 아니라 외부(IOC컨테이너)에서 생성된 B, C객체를 조립(주입)시켜 setter 혹은 생성자를 통해 사용하는 방식

  • AOP

  • POJO

  • IOC (inversion of Control - 제어의 역전)

    "제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.

    IOC는 스프링이 갖고 있는 핵심적인 기능

    객체지향 언어에서 object간의 연결관계를 런타임에 결정

    객체간의 관계가 느슨하게 연결

    IOC구현 방법중 하나가 DI, 다른건 DL

    • 객체 생성 순서

      1. 객체 생성

      2. 의존성 객체 생성

        클래스 내부에서 생성

      3. 의존성 객체 메소드 호출

    • 스프링 객체 생성 순서

      1. 객체 생성

      2. 의존성 객체 주입

        스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 주입한다.

      3. 의존성 객체 메소드 호출

스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며,

제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

SpringFramework Module

Spring Core → spring에서 가장 기반이 된다.

MAVEN, Gradle

IOC

IOC는 스프링이 갖고 있는 핵심적인 기능

객체지향 언어에서 object간의 연결관계를 런타임에 결정

객체간의 관계가 느슨하게 연결됨

IOC구현 방법중 하나가 DI, 다른건 DL

Dependency LookUP ( DL )

  • 컨테이너가 lookup context를 통해서 필요한 Resource나 Object를 얻는 방식

Dependency Injection ( DI )

  • object에 lookup코드를 사용하지 않고 컨테이너가 직접 의존 구조를 object에 설정할 수 있도록 해주는 방식
  • object가 컨테이너의 존재여부를 알 필요가 없음
  • lookup 관련된 코드들이 object내에서 사라짐
  • setter Injection과 Constructor inject

Container

→ 객체의 생성 사용 소멸에 해당하는 라이프사이클 담당

  • 기능

    라이프사이클 관리

    Dependency 객체 제공

  • 필요성

    factory나 singleton 패턴을 구현 X → 컨테이너차원에서 지원됨

  • IOC Container

    스프링에서 IOC를 담당하는 컨테이너에는 BeanFactory (spring 2.~) , ApplicationContext( spring 3.~)

  • Spring DI Container

AOP ( Aspect - oriented - programming ) 관점 지향 프로그래밍

IOC개념

  • 객체간의 강한 결합

    클래스 호출 방식

    클래스내에 선언과 구현이 모두 되어있기 때문에 다양한 형태로 변화가 불가능

  • 객체간의 강한 결합을 다형성을 통해 결합도를 낮춤

  • 객체간의 강한 결합을 Factory를 통해 결합도를 낮춤

  • 객체간의 강한 결합을 Assembler( Spring) 를 통해 결합도를 낮춤

    IOC 호출 방식
    
    팩토리 패턴의 장점을 더하여 어떠한 것에도 의존하지 않는 형태가 됨
    
    **실행시점(Runtime)에 클래스 간의 관계가 형성**됨

DI ( Dependency Injection)

DI는 의존성 주입을 의미함

객체 사이의 의존 관계가 자기 자신이 아닌 외부(스프링)에 의해서 설정

  • 빈 생성 범위

    싱글톤 빈(singleton Bean)

    스프링 빈은 기본적으로 싱글톤으로 만들어짐

    그러므로 제공하는 모든 빈의 인스턴스는 항상 동일

    컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶은 경우 scope를 prototype으로 설정해야함

  • 스프링 빈 설정 : Annotation

Spring Web MVC

  • 스프링이 제공하는 서블릿 기반의 MVC 프레임워크

  • MVC ( Model- view - controller ) pattern

    Model

    • 어플리케이션 상태의 캡슐화

    • 상태 쿼리에 대한 응답

    • 어플리케이션 기능 표현

    • 변경을 view에 통지

      View

    • 모델을 화면에 시각적으로 표현

    • 모델에게 업데이트 요청

    • 사용자의 입력을 컨트롤러에 전달

    • 컨트롤러가 view를 선택하도록 허용

      Controller

    • 어플리케이션의 행위 정의

    • 사용자 액션을 모델 업데이트와 mapping

    • 응답에 대한 view 선택

  • 어플리케이션 확장을 위해 model , view , controller 세가지 영역으로 분리

  • 컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치지 않음( 유지보수 용이)

  • 컴포넌트 간의 결합성이 낮아 프로그램 수정이 용이 ( 확장성 뛰어남 )

  • 장점

    화면과 비즈니스 로직을 분리해서 작업 가능

    영역별 개발로 인하여 확장성 뛰어남

    표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음

  • 단점

    개발 과정이 복잡해 초기 개발 속도가 늦음

    초보자가 이해하고 개발하기 다소 어려움

Spring MVC 특징

  • Spring은 DI나 AOP같은 기능 뿐만 아니라 , Servlet 기반의 Web 개발을 위한 MVC FrameWork를 제공
  • Spring MVC는 Model2 Architetcture와 Front Controller Pattern을 FrameWork 차원에서 제공
  • Spring MVC Framework는 Spring을 기반으로 하고 있기 떄문에 Spring이 제공하는 transaction 처리나 DI및 AOP등을 손쉽게 사용

Spring MVC 구성요소

  • DispatcherServlet ( Front Controller )

    모든 클라이언트의 요청을 전달받음

    controller에게 클라이언트의 요청을 전달하고, controller가 리턴 한 결과 값을 view에게 전달하고 알맞은 응답을 생성

  • HandlerMapping

    클라이언트 요청 URL을 어떤 Controller가 처리할지를 결정

    URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음

  • Controller

    클랑이언트의 요청을 처리한 뒤 ,Model을 호출하고 그 결과를 DispatcherServlet에게 알려준다.

  • ModelAndView

    Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체

  • ViewResolver

    Controller가 리턴 한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정

  • View

    Controller의 처리 결과를 보여줄 응답화면을 생성

Spring MVC 요청 흐름

Controller에는 Service-Dao - DB 연결동작이 이어져있다.

Spring MVC 구현

  • Spring MVC를 이용한 Application 구현 Step
    1. web,xml에 DispatcherServlet 등록Spring 설정 파일 등록
    2. 설정 파일에 HandlerMapping 설정
    3. Controller 구현 및 Context 설정 파일( Servlet - context.xml ) 에 등록
    4. Controller와 JSP의 연결을 위해 View Resolver 설정
    5. JSP코드 작성

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";
}

log4j 공부해보기

MyBatis

mybatis는 java object와 sql 문 사이의 자동 mapping 기능을 지원하는 ORM Framework

MyBatis는 SQL을 별도의 파일로 분리해서 관리

Object - SQL 사이의 parameter mapping 작업을 자동으로 해줌

개발자가 익숙한 sql을 그대로 이용하면서 jdbc코드 작성을 불편함을 제거해주고 도메인객체나 VO객체를 중심으로 개발 가능

MyBatis 특징

  • 쉬운 접근성과 코드의 간결함

    가장 간단한 persistence Framework

    XML형태로 서술된 JDBC코드라 생각해도 될 만큼 JDBC의 모든 기능을 MyBatis가 대부분 제공

    복잡한 JDBC 코드를 걷어내며 깔끔한 소스 코드 유지

  • SQL문과 프로그래밍 코드의 분리

  • 다양한 프로그래밍 언어로 구현가능

MyBatis-Spring

Mapper Interface

profile
코린이

0개의 댓글