반응형

DispatcherServlet 순서도

 

  1. 클라이언트(사용자)의 모든 요청은 DispatcherServlet이 받는다.
  2. DispatcherServlet은 hanlderMapping을 통해서 요청에 해당하는 Controller를 실행 시킨다.
  3. Controller는 적절한 서비스 객체를 호출 시킨다.
  4. Service는 DB처리를 위해 DAO를 이용하여 데이터를 요청 한다.
  5. DAO는 mybatis를 이용하는 Mapper를 통해 작업 처리를 한다.
  6. 결과(처리한 데이터)가 mapper->DAO->Service->Controller로 전달된다.
  7. Contorller는 전달된 결과(처리된 데이터)를 View Resolver를 통해
    전달 받을 View가 있는지 검색한다.
  8. 전달 받은 View가 있다면 View에게 전달된 결과(처리된 데이터)를 전달한다.
  9. View는 전달받은 결과(처리된 데이터)를 다시 DispatcherServlet에게 전달한다.
  10. DispatcherServlet은 전달받은 결과(처리된 데이터)를 클라이언트에게 전달한다.

Front Controller의 역할은 서버로 들어오는 모든 요청을 받아서 처리한다.

스프링에서 제공하는 FrontController인 DispatcherServlet의 역할은??

DispatcherServlet의 등장으로 엄청나게 web.xml의 역할이 축소 되었다.

DispatcherServlet가 있기전에는 사용자의 URL을 일일이 요청을 처리하기 위해
web.xml에 등록(서블릿과 매핑시켜주는 작업)을 반드시 해야했다.
그렇다고 web.xml이 안쓰이는 것은 아니다.

web.xml에서 자주 쓰이는 서블릿 매핑을 DispatcherServlet이 한다고 생각하시면 되고
나머지 web.xml의 기능들은 그대로 web.xml을 이용하신다고 생각하시면됩니다.
(web.xml의 기능은 DispatcherServlet등록, 객체의 URL범위 , 필터 등이 있습니다.)

스프링 MVC Controller의 특징

  1. 파라미터 수집
  • 사용자의 요청에 필요한 데이터를 추출하고
    VO(DB의 레코드와 상응되는 클래스) 나 DTO(컨트롤러,뷰,비즈니스등의 계층간 데이터 교환을 위한 자바빈즈)로 변환하는 파라미터의 수집 작업을 한다.
  1. 애노테이션을 통한 간편 설정
  • 스프링 MVC 설정은 MVC나 애노테이션을 사용가능하고, 주로
    애노테이션을 이용하여 클래스나 메소드의 선언에 필요한 애노테이션을 추가하는
    작업을 통해 요청이나 응답에 필요한 모든 처리를 완료할 수 있다.

  3.테스트의 편리

  • WAS의 실행없이도 테스트할 수 있는 편리한 방법을 제공

servlet-context.xml 사용

프로젝트 생성시 DispatcherServlet인

spring-servlet-context-xml

  • 클래스 선언에 애노테이션을 이용해서 컨트롤러를 작성 가능하게 한다.
  • 웹 이미지/CSS/javaScript 파일과 같이 고정된 자원들의 위치

(스프링 MVC패턴 자체가 디스패처 서블릿이 모든 요청을 컨트롤러에게 넘겨주는 방식인데 css등의 요청들도 컨트롤러에게 넘겨주면 컨트롤러가 해야할 일도 아니지만 컨트롤러는 해당하는 요청이 없기 때문에 에러가 날 것이다. 만약 정상작동 하더라도 JSP안의 CSS나 자바스크립트등을 디스패처 서블릿이 가로채가서 원하는 화면이 안나올 것이다. 이를 해결하기위해 resources가 있는것)

-패키지 내부의 클래스(클래스 패스에 위치해있는 클래스)들을 조사하는 것으로
만약 과 같이 사용하게 된다면
특정한 애노테이션이 붙은 클래스를 자동으로 빈으로 등록하는 기능을 제공한다.

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
스프링 이해하기  (1) 2020.05.07
스프링 jdbc 이해하기  (0) 2020.05.07
스프링_IOC개념  (0) 2020.05.07
반응형

1. 스프링의 이해

1.1) 스프링 정의

  • 간단히 스프링이라 지칭하지만 정확하게는 스프링 프레임워크 (Spring Framework) 라고 하는 것이 정확한 표현.'
  • 자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크

  • 자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구

  • 자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할.

2. 스프링 장점

1. 경량 Container

  • Java 객체를 담고 있으며, 생성 ~ 소멸과 같은 라이프 사이클을 관리하며 Spring Container로 부터 필요한 객체를 가져와 사용한다.

  • EJB에 비해 가볍기 때문에 엔터프라이즈급의 시스템을 더 빠른 시간에 작성 가능.

2. DI (Dependency Injection) 지원

객체와 객체간의 의존을 의미,

A라는 클래스에서 B라는 클래스의 메소드를 불러와 실행하게 될 때 그것을 의존한다 생각하면 된다.

그런데 B클래스의 메소드 이름이 바뀌어 버리면 어떻게 될까? A에서는 그 메소드를 찾을 수 없기 때문에, 똑같이 변경해야 한다.

1 ~ 2개의 클래스로 구성된 의존 메소드가 바뀌면 직접 변경해 줄텐데, 그 이상을 사용했다면 변경하기 정말 힘들것이다.

  • Spring Framework에서 DI (Dependency Injection) 란?

위에서 언급 했듯이 기본 방식으로 메소드를 다른 클래스에서 같이 사용하면, 직접적으로 연결되어 있어 유지보수의 어려움을 갖는다.

그래서 Spring Framework 에서 제공하는 DI를 이용하게 되는것인데,

DI의 역활은 기본 방식의 의존성을 제거하고, 별도로 3자가 만들어주는 의존객체를 각 클래스에 뿌려주는 기능으로 변경의 유연성을 제공한다.

보통 1) 생성자를 이용한 주입

1) 생성자를 이용한 주입

2) set 메소드를 활용한 주입

3. AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원

한 어플리케이션 내의 다양한 모듈에서 공통적으로 이용되는 기능을 분리시켜 사용하는 것.

모듈의 핵심 기능 외의 기능을 해당 모듈에 응집되지 않도록 하기 위한 기술

Java는 하나의 클래스에 대한 수직적인 흐름만 제어 할 수 있는 반면,

Spring을 쓰면 특정 클래스들에 대한 수평적인 제어가 가능해진다.

공통된 부분등, 특정 부분들(핵심 관심사) 로 나누어 관리함으로써,프로그램을 모듈화 하는 방식.

4. POJO (Plain Old Java Object) 지원

Java의 객체지향적인 특징을 살려 비즈니스 로직에 출싱한 개발이 가능하도록 하는 것

  • POJO(Plain Old Java Object)를 사용하는 이유?

코드의 간결함 (비즈니스 로직과 특정 환경 / low레벨의 중속적인 코드를 분리하므로 단순함)

자동화 테스트에 유리 (환경 종속적인 코드는 자동화 테스트가 어렵지만, POJO는 테스트가 간단함)

객체지향적 설계의 자유로운 사용

5.트랜잭션의 지원

※ 트랜잭션이란 : 데이터 베이스에서 한꺼번에 수행되어야 될 연산.

스프링은 이를 어노테이션이나 xml로 설정 가능.

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
servelt context 사용  (0) 2020.05.08
스프링 jdbc 이해하기  (0) 2020.05.07
스프링_IOC개념  (0) 2020.05.07
반응형

DAO 란

DAO(Data Access Object)는 실제로 DB에 접근하는 객체이다.

Service와 DB를 연결하는 고리의 역할을 한다.

  • DAO 패턴은 서비스 계층에 영향을 주지 않고 데이터 액세스 기술을 변경할 수 있는 것이 장점.

JDBC(Java Database Connectivity) 란?

JDBC(Java Database Connectivity)는 DB에 접근할 수 있도록 Java에서 제공하는 API이다. (모든 Java의 Data Access 기술의 근간)

JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
JDBC API의 문제점
쿼리를 실행하기 전과 후에 많은 코드를 작성해야한다. EX) 연결 생성, 명령문, ResultSet 닫기, 연결 등
데이터베이스 로직에서 예외 처리 코드를 수행해야 한다.
트랜잭션을 처리해야 한다.
이러한 모든 코드를 반복하는 것으로, 시간이 낭비된다.


Spring JDBC란?

JDBC의 장점과 단순성을 그대로 유지하면서도 기존 JDBC의 단점을 극복할 수 있게 해주고, 간결한 형태의 API 사용법을 제공하며, JDBC API에서 지원되지 않는 편리한 기능을 제공.

  • Spring JDBC는 반복적으로 해야하는 많은 작업들을 대신 해줌.

  • Spring JDBC를 사용할 때는 실행할 SQL과 바인딩 할 파라미터를 넘겨주거나, 쿼리 실행 결과를 어떤 객체에 넘겨 받을지를 지정만 하면 된다.

  • Spring JDBC를 사용하려면 먼저, DB 커넥션을 가져오는 DataSource를 Bean으로 등록해야 한다.


Spring JDBC가 해주는 작업

Connection 열기와 닫기

  • Connection과 관련된 모든 작업을 Spring JDBC가 필요한 시점에서 알아서 진행.

  • 진행 중에 예외가 발생했을 때도 열린 모든 Connection 객체를 닫아줌.

  • SQL 정보가 담긴 Statement 또는 PreparedStatement를 생성하고 필요한 준비 작업을 해주는 것도 Spring JDBC가 한다.

  • Statement도 Connection과 마찬가지로 사용이 끝나고 나면 Spring JDBC가 알아서 객체를 닫아줌.

    Statement 실행

  • SQL이 담긴 Statement를 실행하는 것도 Spring JDBC가 해줌.

  • Statement의 실행 결과는 다양한 형태로 가져올 수 있다.
    ResultSet Loop처리

  • ResultSet에 담긴 쿼리 샐행 결과가 한 건 이상이면 ResultSet 루프를 만들어서 반복해주는 것도 Spring JDBC가 해주는 작업.
    Exception 처리와 반환

  • JDBC 작업 중 발생하는 모든 예외는 Spring JDBC예외 변환기가 처리.

  • Checked Exception인 SQLException을 Runtime Exception인 DataAccessException 타입으로 변환.

    Transaction 처리

  • Spring JDBC를 사용하면 transaction과 관련된 모든 작업에 대해서는 신경 쓰지 않아도 됨.

    • Transaction과 관련된 작업 : Commit, Rollback 등 작업의 단위

JDBC Template 이란?

JDBC Template은 내부적으로 JDBC API를 사용하지만 위와 같은 JDBC API의 문제점들을 제거한 형태의 Spring에서 제공하는 class이다.

Spring JDBC가 하는 일
Connection 열기와 닫기
Statement 준비와 닫기
Statement 실행
ResultSet Loop처리
Exception 처리와 반환
Transaction 처리

Spring JDBC 접근 방법

JdbcTemplate (선택!)
전형적인 Spring JDBC 접근 방법이고 가장 인기가 좋다.
쿼리를 직접 작성하는 방법을 제공하므로 많은 작업과 시간을 절약 할 수 있다.
NamedParameterJdbcTemplate
SimpleJdbcTemplate
SimpleJdbcInsert 및 SimpleJdbcCall
Spring framework는 JDBC DB 접근에 대해 위와 같은 접근 방법을 제공한다.

JdbcTemplate이 제공하는 기능
실행 : Insert나 Update같이 DB의 데이터에 변경이 일어나는 쿼리를 수행하는 작업
조회 : Select를 이용해 데이터를 조회하는 작업
배치 : 여러 개의 쿼리를 한 번에 수행해야 하는 작업

JdbcTemplate사용시 인자로 dataSource 넣음 - DI


DataSource 란?

DataSource는 JDBC 명세의 일부분이면서 일반화된 연결 팩토리이다. Spring은 DataSource로 DB와의 연결을 획득한다.

DataSource는 JDBC Driver vendor(Mysql, Oracle 등)별로 여러가지가 존재한다.
DataSource가 하는 일

1) DB Server와의 기본적인 연결
2) DB Connection Pooling 기능 (* 아래 참고)
3) 트랜젝션 처리
DataSource의 구현 예시
BasicDataSource (선택!)
PoolingDataSource
SingleConnectionDataSource
DriverManagerDataSource

Spring JDBC를 사용하려면 먼저, DB Connection을 가져오는 DataSource를 Spring IoC 컨테이너의 공유 가능한 Bean으로 등록해야 한다.

즉, DB와의 연결을 위한 DB Server에 관한 정보(Parameter)를 설정한 후 Bean으로 등록해야 DB와 연결할 수 있다.

커넥션 풀링은 미리 정해진 갯수만큼의 DB 커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때마다 Pool에서 꺼내서 하나씩 할당해주고 다시 돌려받아서 Pool에 넣는 식의 기법.
Spring에서는 DataSource를 공유 가능한 Spring Bean으로 등록해주어 사용할 수 있도록 해줌.


DB Server에 관한 정보(Parameter)를 설정 (* 설정 방법 아래 참고)
url, driver, username, password
BasicDataSource에 bean으로 등록

``` ```

  • DB Connection Pooling이란?

자바 프로그램에서 데이터베이스에 연결(Connection 객체를 얻는 작업)은 시간이 많이 걸린다.
만약, 일정량의 Connection을 미리 생성시켜 저장소에 저장했다가 프로그램에서 요청이 있으면 저장소에서 Connection 꺼내 제공한다면 시간을 절약할 수 있다. 이러한 프로그래밍 기법을 Connection Pooling이라 한다.
Connection Pooling을 이용하면 속도와 퍼포먼스가 좋아진다.

  • 정보(Parameter)들을 설정하는 방법

Property file을 하나 만들고 Parameter 정보들을 적는다.
${jdbc.password}와 같은 placeholder를 사용하여 이 Parameter 정보들을 주입한다.
DB Server에 관한 정보(Parameter)를 설정할 때 이 정보들을 hard coding 하지 않는다.
왜냐하면 나중에 Property file의 내용만 고치면 다른 모든 부분에 적용할 수 있기 때문이다.
예를 들어, pom.xml에서 springframework-version을 4.2.5.RELEASE로 설정했으면

org.springframework
에 해당하는 밑에 요소들은 ${org.springframework-version} 로 적어주면 알아서 버전에 맞는 것이 적용된다.

JDBC Driver 란?

JDBC Driver는 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터이다.

DB마다 Driver가 존재하므로, 자신이 사용하는 DB에 맞는 JDBC Driver를 사용한다.
DataSource를 JDBC Template에 주입(Dependency Injection)시키고 JDBC Template은 JDBC Driver를 이용하여 DB에 접근한다.

Spring 프로젝트에서 DB 프로그래밍을 위해 필요한 Library

    jdbc class: spring-jdbc
    org.springframework.jdbc.core.JdbcTemplate
    data source: commons-dbcp
    org.apache.commons.dbcp.BasicDataSource
    jdbc driver: mysql-connector-java
    com.mysql.jdbc.Driver

JDBC 와 DBCP

JDBC에서 가장 시간이 많이 소요되는 부분이 Connection 맺는 부분

Java 에서 Database 와 연결하기 위해 JDBC 필요
JDBC 이용해 생성한 Connection을 효율저그로 활용하기 위해 Connection 객체를 관리하는 것을 DBCP의 개념으로 본다.

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
servelt context 사용  (0) 2020.05.08
스프링 이해하기  (1) 2020.05.07
스프링_IOC개념  (0) 2020.05.07
반응형

IoC란 프로그램의 제어 흐름 구조가 바뀌는 것

일반적인 프로그램의 흐름 구조는 main()과 같은 프로그램이 시작되는 지점에서 사용할 오브젝트를 결정, 생성하고, 생성된 오브젝트 내의 메소드를 호출하는 작업을 반복하는 구조이다.
즉, 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조

IoC는 제어 흐름의 개념을 거꾸로 뒤집는 개념 이다.
오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않는다.

모든 제어 권한을 자신이 아닌 다른 대상에게 위임하는 것

프로그램의 시작을 담당하는 main()같은 엔트리 포인트를 제외하면 모든 오브젝트는 제어 권한을 위임받은 특별한 오브젝트에 의해 결정되고 만들어지는 것

<IoC 개념 정리>

  • 작업을 수행하는 쪽에서 Object를 생성하는 제어 흐름의 개념을 거꾸로 뒤집는 것.
  • IoC에서는 Object가 자신이 사용할 Object를 생성하거나 선택하지 않는다.
  • Object는 자신이 어떻게 생성되고 어떻게 사용되는 지 알 수 없다.
  • 모든 Object는 제어권한을 위임받은 특별한 Object에 의해서 만들어지고 사용된다.

IoC 구현방법

- DL (Dependency Lookup) - 의존성 검색
저장소에 저장되어 있는 빈(Bean)에 접근하기 위해서 개발자들이 컨테이너에서 제공하는 API를 이용하여
빈(Bean)을 Lookup 하는 것
- DI(Dependency Injection) - 의존성 주입
객체 자체가 아니라 Framework에 의해 객체의 의존성이 주입되는 설계 패턴
DL을 사용시에는 컨테이너에 대한 종속성이 증가하기 때문에, 이러한 종속성을 줄이기 위해서 DI를 사용
각 계층 사이, 각 객체(클래스)사이에 필요로 하는 의존 관계를 컨테이너가 자동으로 연결 해주는 것
각 클래스 사이의 의존 관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

- setter Injection
- constructor Injection
- Field Injection

-장점
Reduced Dependencies
-종속성이 감소한다.

  • components의 종속성이 감소하면 변경에 민감하지 않다.
    More Reusable Code
  • 재사용성이 증가한다.
  • 일부 인터페이스의 다른 구현이 필요한 경우, 코드를 변경할 필요없이 해당 구현을 사용하도록 components를 구성할 수 있다.
    More Testable Code
  • 더 많은 테스트 코드를 만들 수 있다.
  • Mock 객체는 실제 구현의 테스트로 사용되는 객체
  • 종속성을 components에 주입할 수 있는 경우 이러한 종속성의 Mock 구현을 주입할 수 있다.
  • 예를 들어, Mock 객체가 올바른 객체를 반환할 때, null을 반환할 때, 예외가 발생할 때 모두 처리한다.
    More Readable Code
  • 코드를 읽기 쉬워진다.
  • components의 종속성을 보다 쉽게 파악☆할 수 있으므로 코드를 쉽게 읽을 수 있다.

IoC 용어 정리

  • bean - 스프링에서는 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
    자바빈, EJB의 빈과 비슷한 오브젝트 단위의 어플리케이션 컴포넌트를 의미.
    스프링 빈은 스프링 컨테이너가 생성, 관계설정, 사용등을 제어해주는 오브젝트를 가리킨다.

  • bean factory : 스프링의 IoC를 담당하는 핵심 컨테이너. 빈을 등록/ 생성/조회/반환/관리 한다. bean factory를 바로 사용하지 않고 이를 확장한 Application Context를 이용한다. BeanFactory는 bean factory가 구현하는 Interface 이다. (getBean()등의 메소드가 정의)

  • application Context - bean Factory를 확장한 IoC 컨테이너
    빈을 등록/생성/조회/반환/관리 기능과 함께 스프링의 각종 부가 서비스를 추가로 제공한다. ApplicationContext는 interface이며 BeanFactory를 상속한다.

  • configuration metadata(설정정보/ 설정 메타정보)
    application context 혹은 bean factory 가 Ioc를 적용하기 위해 사용하는 메타정보
    스프링의 설정정보는 컨테이너에 어떤 기능을 설정하거나 조정하는 경우에 사용되기 하고, 주로 bean을 생성/구성하는 용도로 사용된다.

  • container(IoC container)
    IoC 방식으로 bean을 관리한다는 의미에서 bean factory나 application context를 가리킨다.
    (spring container = application context)
    application context는 그 자체로는 ApplicationContext인터페이스를 구현한 오브젝트를 의미한다.
    하나의 어플리케이션에서는 보통 여러 개의 ApplicationContext Object가 만들어진다.
    이를 통칭해서 spring container라고 부른다.
    객체를 관리하는 컨테이너

  • spring framework : IoC container, application context를 포함해서 스프링에서 제공하는 모든 기능을 통칭

참고문헌

https://gmlwjd9405.github.io/2018/11/09/dependency-injection.html

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
servelt context 사용  (0) 2020.05.08
스프링 이해하기  (1) 2020.05.07
스프링 jdbc 이해하기  (0) 2020.05.07

+ Recent posts