The A :

728x90
반응형

Today I Lean

Spring Framework 기본

 

 

 

학습목표 및 개념정리

# Spring Framework 소개

- Spring Framework이 무엇인지 이해할 수 있다.

- Spring Framework을 배워야 하는 이유를 알 수 있다.

- Spring Framework과 다른 Framework의 차이를 이해할 수 있다.

 

# Spring Framework 특징

- POJO (Plan Old Java Object)의 의미와 필요성을 이해할 수 있다.

- IoC (Inversioin of Control) / DI (Dependency Injection)의 의미와 필요성을 이해할 수 있다.

- AOP (Aspect Oriented Programming, 관심지향 프로그래밍) 의 의미와 필요성을 이해할 수 있다.

- PSA (Portable Service Abstraction)의 의미와 필요성을 이해할 수 있다.

 

# Spring Framework 모듈 구성

- Spring Framework의 아키텍처를 버드 아이뷰 관점에서 이해할 수 있다.

- Spring Framework 모듈에 대해 알 수 있다.

- Spring Framework에서 지원하는 모듈의 종류를 알 수 있다.

 

#  Spring Boot 소개

- Spring Boot 가 무엇이고, 왜 사용해야 하는지 알 수 있다.

 

 

 

배운 것

# Spring Framework 소개

1. Framework 이란?

 : 어떤  대상의 큰 틀이나 외형적인 구조 즉, 애플리케이션을 만들기 위한 틀 or 구조를 의미

 

- 자바의 인터페이스 (Interface)

 : 자바에서의 Collection은 Map, Set, List와 같은 인터페이스와, 인터페이스를 구현한 구현체들의 집합

 → 프로그래밍 상에서의 Framework은 "프로그래밍을 하기 위한 어떠한 틀이나 구조"를 의미

 

 

- 장단점

장점 단점
▪ 효율적인 코드 작성
다양한 기능을 Framework이 라이브러리 형태로 제공하기 때문에 개발자가 핵심 로직 개발에만 집중할 수 있도록 해줌

정해진 규약이 있어, 효율적으로 애플리케이션 관리가능
정해진 규약에 맞게 코드를 작성하기 때문에 빠르고 쉽게 문제점 파악이 가능, 코드의 재사용이 용이하고 기능의 확장도 쉬움
 사용하고자 하는 Framework에 대한 학습이 필요
Framework에서 정한 규약을 배워야 함

자유롭고 유연한 개발이 어려움
Framework의 규약을 벗어나기 어려움

 

 

 

2. Framework과 Library의 차이

- Library란?
 : 애플리케이션을 개발하는데 사용되는 일련의 데이터 및 프로그래밍 코드

 → 필요한 기능을 미리 구현해 놓은 집합체


- 차이점

  Framework Library
구성요소 뼈대 뼈대 안의 부품
교체유무 한 번 정해지면 교체가 어려움 쉽게 교체 가능하고 선택해서 사용 가능
사용 방법 메서드 내에 코드를 미리 작성해 두면, Framework에서 사용 필요한 기능헤 해당하는 라이브러리를 호출하여 사용
주도권 Framework 개발자

 

 

 

3. Spring Framework 이란?

- 장점

  • POJO (Plan Old Java Object) 기반의 구성
  • DI (Dependency Injection) 지원
  • AOP (Aspect Oriented Programming, 관심지향 프로그래밍) 지원
  • Java 언어 사용 : 메서드의 입출력의 타입을 강제함(잦은 수정과 보완시 오류방지)

 

*기업용 엔터프라이즈 시스템 기업용 엔터프라이즈 시스템이란 기업의 업무(기업 자체 조직의 업무, 고객을 위한 서비스 등)를 처리해 주는 시스템을 의미합니다. 기업용 엔터프라이즈 시스템은 대량의 사용자 요청을 처리해야 하기 때문에 서버의 자원 효율성, 보안성, 시스템의 안전성이나 확장성 등을 충분히 고려해서 시스템을 구축하는 것이 일반적입니다.

 

 

 

4. Spring Framework를 배워야 하는 이유

 → 객체지향 설계 원칙에 맞고 재사용과 확장이 가능한 애플리케이션 개발 스킬 향상

 → 보다 나은 성능과 서비스의 안전성이 필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축하기 위한 능력

 

 

 

 

 

# Spring Framework 특징

1. POJO (Plan Old Java Object)

- POJO 란?
 : IoC/DI, AOP, PSA를 통해 달성할 수 있는 것
 → "객체지향프로그램인 Java로 생성하는 순수한 객체" 를 의미 

 

 

- POJO 프로그래밍 이란?

 : 순수 자바의 객체만을 이용해서 코드를 작성하는 것

 → Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 함

 

 

- POJO 프로그래밍이 필요한 이유

  • 특정 환경이나 기술에 종속되지 않으면, 확장과 재사용이 가능한 유연한 코드작성 가능
  • 저레벨의 기술과 환경에 종속적인 코드를 제거함으로서 코드가 깔끔해 짐
  • 디버깅이 상대적으로 쉬움
  • 특정 기술이나 환경에 종속되지 않아 테스트가 단순해짐
  • 객체지향적인 설계를 제한없이 사용할수 있음

 

 

- POJO와 Spring Framework의 관계

 → Spring Framework은 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA라는 기술을 제공함

 

 

 

* SOLID (객체 지향 설계 원칙)

SRP (Single Responsivility Principle) : 단일 책임의 원칙

  • 클래스가 제공하는 기능들은 하나의 책임을 수행하는데 집중해야 한다는 원칙
SRP를 잘 지킬때 SRP를 지키지 않을 때
▪ 응집력이 높아짐
▪ 결합도가 낮아짐
▪ 코드의 가독성이 좋아짐
▪ 테스트의 범위가 작아짐 (유지보수 편리)
▪ 응집력이 낮아짐
▪ 결합도가 높아짐
▪ 서로 다른 애플리케이션에 배포될 때 해당 애플리케이션에서 사용하지 않는 기능도 포함됨
▪ 하나의 속성의 여러 의미를 가지는 오류가 생김
    • AOP는 별도의 부가 기능을 핵심로직에서 분리했기 때문에 SRP의 원칙을 지켰다고 볼 수 있음

 

OCP (Open Close Principle) : 개방 폐쇄의 원칙

  • 확장에는 열려있고, 변경에는 닫혀 있어야 한다는 원칙
  • 변하는 것(Open)과 변하지 않는 것(Close)을 잘 구분하면 OCP를 지키기 용이함
  • 변하지 않는 것은 변하는 것의 구현에 의존하지 않고, 인터페이스를 통해 느슨하게 의존하도록 함
  • 디자인 패턴 중, 전략패턴의 전략 인터페이스는 Open에 해당되고 Context는 Close에 해당함
  • 예시 ↓
변하지 않는 것 (Close) 변하는 것 (Open)
움직인다는 사실 스틱, 오토, 크루즈컨트롤 등

 

LSP (The Liskov Substitution Principle) : 리스코브 치환의 원칙

  • subclass의 객체는 superclass의 참조변수에 대입해서 superclass의 역할을 하는데에 문제가 없어야 한다는 원칙
  • OCP 원칙의 기반이 됨
  • subclass(자식) - superclass(부모) : 상속관계

 

ISP (Interface Segregation Principle) : 인터페이스 분리의 원칙

  • 인터페이스의 단일 책임을 위한 원칙
  • 일반적인 하나의 인터페이스를 조금 더 구체적으로 쪼개는 것이 좋다는 것
  • 예시 ↓
하나의 인터페이스 구체화 한 인터페이스
자동차의 움직임 앞으로 간다, 뒤로 간다, 멈춘다

 

DIP (Dependency Inversion Principle) : 의존성 역전의 원칙

  • 자주 변경되는 구체화된 클래스에 의존하지 않고, 추상화된 클래스에 의존하는것을 의미
  • 구체 클래스가 추상 클래스에 의존하므로 의존관계가 역전된 형태
  • 예시 ↓
Spring Framework의 IOC 컨테이너 느슨한 연결 측면에서의 DIP 이벤트 드리븐 방식
직접 객체를 생성하는 것이 아니라 프레임워크에서 객체 제공 추상 클래스에서 구체 클래스의 car 메서드를 호출하는 것
 → car 메서드 호출시, 그것의 구체 클래스는 무엇인지 알 필요 없음
이벤트 리스너를 등록하고 car 메서드를 통해 해당 이벤트 처리
 → car 메서드 호출시, 구체적인 이벤트 리스너가 무엇인지 알 필요 없음

 

 

 

2. IoC (Inversioin of Control)

- IoC 란?
 : 애플리케이션 흐름의 주도권이 뒤바뀐 것

 : 서버 컨테이너 기술, 디자인 패턴, 객체 지향 설계 등에 적용하는 일반적인 개념

 

 

- 일반적인 Java 콘솔의 제어권

public class Example2_10 {
    public static void main(String[] args) { // 애플리케이션이 시작되는 지점 : 엔트리 포인트(Entry point)
        System.out.println("Hello IoC!");
    }
}

 : 일반적으로는 main 메서드가 종료되면 애플리케이션의 실행이 종료 됨

 

 

- 서블릿컨테이너의 제어권

 : 서블릿 컨테이너가 서블릿을 제어 → 애플리케이션의 주도권은 서블릿 컨테이너에 있음

  • 서블릿 컨테이너에는 서블릿 사양에 맞는 서블릿 클래스만 존재하지 별도의 main() 메서드가 존재하지 않음
  • 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직(service() 메서드)이 서블릿을 직접 실행
  • main() 메서드가 필요없음

 → 서블릿과 웹 애플리케이션 간에 IoC(제어의 역전)의 개념이 적용

 

 

 

 

3. DI (Dependency Injection)

 : IoC의 개념을 조금 더 구체화 한 것

 : Dependency →  의존적인 / Injection → 주입

 → 클래스들 간의 강한 결합을 느슨한 결합으로 만들어 줌

 

 

- 의존성 주입 이란?

 

 : A 클래스가 B 클래스의 기능을 사용 할 때 → "A클래스는 B클래스에 의존한다" 라고 함

public class CafeClient {
	public static void main(String[] args) {
    	MenuService menuService = new MenuService();
        MenuController menucontroller = new MenuController(menuService);	// 의존관계 성립
        List<Menu> menuLit = controller.getMenu();
    }
}

public class MenuController {
	private MenuService menuService;
    
    public MenuController (MenuService menuService) {	// 의존성 주입
    	this.menuService = menuService;
    }
    public List<Menu> getMenus() {
    	return menuService.getMenuList();
    }
}

 → 생성자의 파라미터로 어떠한 객체를 전달하는 것을 "외부에서 객체를 주입" 한다고 함

 → 의존성 주입 : 생성자를 통해 어떤 클래스의 객체를 전달 받는 것

 

 

- 의존성 주입이 필요한 이유

  : 현재 클래스 내부에서 외부 클래스의 객체를 생성하기 위한 'new' 키워드의 사용여부를 결정하기 위함

  • 애플리케이션 코드 내부에 직접적으로 new 키워드를 사용 할 경우 객체지향 설계의 관점에서 중요한 문제가 발생할 수 있음
  • new 키워드를 사용하여 의존객체를 생성하면 클래스들간에 강하게 결합(Tight Coupling)되어 있다고 함 (느슨한 결합 필요)

 → 즉, new 키워드를 사용하여 객체를 생성하면 참조클래스가 바뀔경우 이 클래스를 사용하는 모든 클래스를 수정해야 함

 

*스텁(Stub) : 메서드가 호출되면 미리 준비된 데이터를 응답하는 것 (고정된 데이터 리턴)

 → 멱등성을 가짐

 

 

- 느슨한 의존성 주입 방법

 : 인터페이스 - 임플리먼츠

 → 업캐스팅 사용 (인터페이스 타입의 변수에 인터페이스의 구현객체 할당)

 → 어떤 클래스가 일반화된 구성 요소(인터페이스) 에 의존할 때, 클래스들이 느슨한 결합(Loose Coupling)이라고 함

 

 

- Spring 기반 애플리케이션의 의존성 주입

 : Config 클래스에 정의해 둔 객체를 Spring의 도움을 받아서 메인 클래스에 제공

 → Spring 기반의 애플리케이션에서는 Spring이 의존 객체들을 대신 주입해 줌

 

*Config 안에서 new 키워드로 객체 생성시

  • Config는 Spring Framework의 영역에 해당하며, 실제 애플리케이션의 핵심 로직에 관여하지 않음
  • 따라서 객체지향의 원칙에 위배되지 않음

 

 

 

 

4. AOP (Aspect Oriented Programming

- AOP 란?
 : 관심 지향 프로그래밍

 → 애플리케이션에 필요한 기능 중, 공통적으로 적용되는 공통기능에 대한 관심

 

 

- 공통 관심 사항, 핵심 관심 사항

  공통 관심 사항 (부가적인 관심사항) 핵심 관심 사항
  Cross-cutting concern Core concern
예시
(커피주문 애플리케이션)
로깅, 보안, 트랜잭션 커피메뉴 등록, 커피 주문기능, 주문 변경
사용되는 곳 애플리케이션 전반에 두루 사용됨 핵심 로직

 → 즉, 애플리케이션의 핵심로직에서 공통적으로 사용되는 기능들을 분리하는 것

 

 

- AOP가 필요한 이유

  • 코드의 간결성 유지
  • 객체 지향 설계 원칙에 맞는 코드 구현
  • 코드의 재사용

 

 : 만약 애플리케이션에서 트랜잭션관련 코드가 중복해서 있다면  → 중복된 코드를 공통화해야함 (AOP)

 

 → 애플리케이션 전반에 걸쳐 적용되는 공통기능 (트랜잭션, 로깅, 보안, 트레이싱, 모니터링) 등을 비즈니스 로직에서 깔끔하게 분리하여 재사용 가능한 모듈로 사용할 수 있음

 

 

 

5. PSA (Portable Service Abstraction)

- PSA 란?
 : 추상화 (Abstraction)의 개념

 → 어떤 클래스의 본질적 특성만 추출해서 일반화 하는 것

 

 

- 추상화를 하는 이유

 : 추상화된 상위 클래스에서 하위클래스의 기능을 사용하는 것

→ 일관된 서비스 추상화 (PSA)의 기본 개념

 

 

- 서비스 추상화 기법

: 인터페이스를 통해 간접적으로 연결(느슨한연결)되어 클라이언트가 일관된 방식으로 해당 서비스의 기능을 사용할 수 있게 함

 → 서비스의 기능에 접근하는 방식을 일관되게 유지, 기술자체를 유연하게 사용할 수 있도록 하는 것

 

 

- PSA의 필요성

: 기술이 변경되더라도 최소한의 수정으로 요구사항을 반영하기 위함

 → 애플리케이션의 요구사항 변경에 유연하게 대처 가능

 

 

 

 

# Spring Framework 모듈 구성

1. 아키텍처(Architecture) 란?

 : 어떠한 것에 대한 컨셉

 → 최대한 심플해야 함

 

- 시스템 아키텍처

 :  하드웨어와 소프트웨어 모두 포함하는 어떤 시스템의 전체적인 구성

 → 해당 시스템이 어떤 하드웨어로 구성되고 어떤 소프트웨어를 사용하는지 대략적으로 파악 가능

 → 해당 시스템의 구성 요소들 간의 상호작용과, 동작원리 등이 표현될 수 있음

 

 

- 소프트웨어 아키텍처

 :  하드웨어를 제외한 컴퓨터 내의 모든 프로그램의 구성

  • 계층화 패턴 (Layered pattern)
  • 클라이언트-서버 패턴 (Client-server pattern)
  • 마스터-슬레이브 패턴 (Master-slave pattern)
  • 파이프-필터 패턴 (Pipe-filter pattern)
  • 브로커 패턴 (Broker pattern)
  • 피어 투 피어 패턴 (Peer-to-peer pattern)
  • 이벤트-버스 패턴 (Event-bus pattern)
  • MVC 패턴 (Model-view-controller pattern)
  • 블랙보드 패턴 (Blackboard- pattern)
  • 인터프리터 패턴 (Interpreter pattern)

 

 

- 애플리케이션 아키텍처

 : 응용프로그램 or 클라이언트의 요청을 처리하는 서버 까지 

 

* 계층형 아키텍처 (N-티어)

API 계층 (API Layer) 
 : 클라이언트의 요청을 받아들임 (표현계층 이라고도 불림
서비스 계층 (Service Layer)
 : API계층에서 전달받은 요청을 업무 도메인의 요구사항에 맞게 처리 (애플리케이션의 핵심로직을 가진 핵심계층)
데이터 엑세스 계층 (Data Access Layer)
 : 비즈니스 계층에서 처리된 데이터를 데이터베이스 등의 데이터 저장소에 저장하기 위함

 → 도메인 (Domain) : 비즈니스 적인 어떤 업무영역의 지식들을 서비스 계층에서 비즈니스 로직으로 구현 해야 하는 것

 

 

 

 

2. 아키텍처로 보는 Spring Framework 모듈(Module) 구성

- 모듈 이란?
 : 지원되는 여러 기능을 목적에 맞게 그룹화 하여 묶어 놓은 것

  • Java의 패키지 단위로 묶여 있음
  • 관련 기능을 제공하기 위한 클래스들이 포함되어 있음
  • 일반적으로 모듈은 재사용이 가능하도록 라이브러리 형태로 제공됨

 → Spring Framework에서는 약 20여개의 모듈을 통해 다양한 기능을 제공함

 

 

 

3. 모듈 설명

- Core Container

 : 스프링 프레임 워크의 핵심인 빈의 생명주기, 설정, 처리방법을 관리하는 스프링 컨테이너

 → 모든 스프링 모듈은 코어 컨테이너 기반으로 구축


▪ Beans

  • 스프링 DI기능의 핵심인 빈 팩토리와 DI 기능 제공
  • 빈 메타정보, 빈 리더, 빈 팩토리 구현
  • 프로퍼티 에디터가 포함되어 있음

▪ Core

  • 대부분의 다른 스프링 모듈에서 필요로 하는 공통기능을 갖는 핵심 모듈
  • 스프링에서 사용 하는 주요 어노테이션, 컨버터, 상수, 유틸리티 클래스 등을 제공함

▪ Context

  • 애플리케이션의 Context 기능 제공
  • 콘텍스트를 만드는데 필요한 대부분의 기능을 가짐
  • 빈 스캐너, 자바 코드 설정 기능, 표현식, 스크립트 언어 지원 등의 주요한 기능을 담고 있음
  • 단순한 빈 팩토리가 아닌, 엔터프라이즈 애플리케이션 프레임워크로 사용하기 위해 반드시 필요한 모듈

▪ SpEL

  • 스프링 표현 언어 기능 제공

 

 

- AOP & Aspect & Instrumentation

▪ AOP

  • 스프링은 AOP 모듈을 통해 관점 지향 프로그래밍을 지원함

▪ Aspects

  • 스프링이 제공하는 AspextJ AOP를 사용할 때 필요한 모듈

▪ Instrument

  • 특정 애플리케이션 서버에서 사용할 클래스 계츨 지원 및 클래스 로더 구현 제공

 

 

- Messaging

  • Message, MesageChannel, MessageHandler 등의 스프링 통합 프로젝트를 포함함
  • 메시지 기반 애플리케이션을 구축하는 역할 (Spring MVC의 어노테이션 기반 모델과 비슷)

 

 

 

- Data Access / Integaration

 : 스프링은 JDBC, ORM, Transaction 등의 서비스 추상화를 통해 데이터에 쉽게 접근하는 방법을 제공함

 

▪ JDBC

  • Java JDBC 프로그래밍을 비교적 쉽게 할 수 있도록 제공하는 모듈

▪ ORM

  • JPA, JDO 및 Hibernate를 포함
  • 널리 사용되는 관계형 매핑 API에 대한 통합 계층을 제공
  • ORM을 통해 간단한 선언적 트랜잭션 관리 기능과 Spring이 제공하는 기능을 O/R 매핑 프레임워크로 사용할 수 있음

▪ OXM

  • JAXB, XMLBeans 등과 같은 객체/XML 매핑의 추상화 계층 제공

▪ JMS

  • Java Messaging Service의 약자
  • 메시지 생성 및 사용을 위한 기능 제공

▪ Transaction

  • Spring-TX 모듈
  • 특수 인터페이스를 구현하는 클래스와 모든 POJO에 대하여 선언적 트랜잭션 관리를 지원

 

 

- Web

 : 스프링은 다양한 MVC 프레임워크를 사용할 수 있지만, 자체제공하는 Spring MVC 모듈이 있음

 → 스프링의 리모팅 기술로 RMI, Hessian, HTTP 호출자, REST API 모듈 등을 제공


▪ WebSocket

  • 웹소켓 지원

▪ Servlet

  • 스프링 MVC 기능 제공
  • 전통적인 MVC와 @MVC 모두 포함

▪ Web

  • 웹 애플리케이션 이용에 편리한 기능 제공
  • Multipart-File Upload 기능, 서블리 리스너, LoC 컨테이너 초기화 같은 기본적인 웹 지향 통합 기능 지원

▪ Portlet

  • 포틀릿 환경 미러 서블릿 기반 기능에 사용될 MVC 구현을 제공

 

 

- Test

  • 테스트에 전념할수 있도록 제공하는 모듈
  • JUit, TensNG, 테스트 컨텍스트 프레임워크, Mock 오브젝트 등을 이용하여 테스트 진행

 

* 정리 *

  • 스프링 프레임워크는 총 20여개의 모듈로 구성됨
  • 각 모듈은 모두 사용하지 않고 필요한 것만 사용하도록 설계되어 있음
  • 큰 규모의 애플리케이션(엔터프라이즈급)을 구축하더라도 용이하게 사용 가능
  • IoC/DI, AOP, MVC, TEST등의 핵심적인 모듈로 편리하게 애플리케이션 개발

 

 

 

# Spring Boot 소개

1. Spring Boot 란?

 : Spring 설정의 복잡함으로 Spring Framework의 편리함을 제대로 사용할 수 없어서 만들어진 Sprinf Project중 하나

 

 

2. Spring Boot 를 사용해야 하는 이유

- XML 기반의 복잡한 설계 방식 지양

 : Spring Boot 사용으로 개발자는 Spring의 복잡한 설정에서 벗어날 수 있음

 

 

- 의존 라이브러리의 자동 관리

 : Spring Boot 의 starter모듈 구성 기능이 애플리케이션에서 필요한 라이브러리를 자동으로 설정해 줌

 

 

- 애플리케이션 설정의 자동 구성

 : Spring Boot 는 starter모듈을 통해 설치되는 의존 라이브러리를 기반으로 애플리케이션의 설정을 자동으로 구성함

 

 

- 프로덕션급 애플리케이션의 손쉬운 빌드

 : 직접 빌드한 결과물을 War 파일 형태로 WAS(Web Application Server)에 올릴 필요가 없음

 → bootJar 명령을 더블 클릭하면 자동으로 빌드결과물이 생성 됨

*WAS (Web Application Server)란?

 : 구현된 코드를 빌드해서 나온 결과물을 실제 웹 애플리케이션으로 실행되게 해주는 서버

 → Java에서는 '서블릿 컨테이너'라고도 불림 (Java에서 대표적인 WAS는 Tomcat)

 

 

- 내장된 WAS를 통한 손쉬운 배포

 : Spring Boot는 Apache Tomcat이라는 WAS를 내장하고 있기 때문에 별도의 WAS를 구축할 필요가 없음

 → Spring Boot를 통해 빌드된 jar 파일을 이용해서 'java -jar 파일명.jar' 라는 명령어만 입력하면 실행 가능

 

 

 

 

 

 

 

*****

 

 

 

 

Tomorrow Chapter

# DI (Dependency Injection)

# AOP (Aspect Oriented Programming

 

 

 


 

 

↓ 이전 글 ↓

 

[코드스테이츠] 05_25_TIL :

Today I Lean 리눅스 맛보기 & 개념정리 학습목표 및 개념정리 # 데이터베이스 설계 - 데이터 간의 다양한 관계를 알수 있다. - 합리적이고, 효율적으로 데이터베이스를 구성하는 방법을 이해한다.

theflower01.tistory.com

 

↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓

 

'IT/코드스테이츠 부트캠프' 카테고리의 글 목록

Flower, Plant, Study

theflower01.tistory.com

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading