본문 바로가기

BackEnd/Java&Spring

Spring Framework를 알아보자

어쩌다보니 Spring 개발도 하게 된 나
오히려 좋아 (?)
Notion에 정리해뒀던거를 가져왔더니 형식이 많이 깨지넴

 

내가 찍음

 

참고로 Spring Framework의 스프링은 개발자가 편하게 유용하게 개발하길 바라며

봄날이 오길 바란다는 뜻이라고 한다 ㅋ

 


Spring Framework

정의

자바 기반의 웹 어플리케이션 개발을 위한 프레임워크

특징

  • 객체 지향 개발
  • Application 개발에 용이하도록 (빠르고 효율적) 기본 틀과 프로그래밍 모델, API 등을 제공함
  • 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공

🤮 라이브러리 vs 프레임워크

  • 라이브러리: 개발자가 필요한 기능이 있을 때 직접 가져와 사용하는 기능을 미리 구현해둔 것.
    • String은 java.lang.String에 미리 만들어진 기능
  • 프레임워크: 정해진 흐름에 맞게 개발자가 프로그램을 개발할 수 있도록 미리 구현되어 있는 것.
    • 스프링 프레임워크에서는 MVC라는 구조에서 개발자가 개발함

😪 MVC 패턴

  • Model, View, Controller
  • 어떻게 기능을 잘 나눠서 사용자가 잘 사용할 수 있도록 할 수 있을까?
  • 디자인 패턴 중 하나로 개발하는 규약을 정해서 쉽게 쓸 수 있는 형태로 만든 것.
    • 예능 프로 만들 때) 새로운 아이디어 → 보수 → 유지 ... 같은 규약
  • 사용자가 Controller를 조작 → Controller는 Model을 통해서 데이터를 가져옴 → View에서 이걸 사용자에게 표현해서 전달해줌

 


Spring 3가지 프로그래밍 모델

1. Spring Container

(또는 Application Context라고 불림)

  • 스프링은 런타임 엔진을 제공함
  • 설정 정보를 참고하여 App을 구성하는 Object를 생성하고 관리함 → 이 Object가 Bean(빈)임
    • 스프링 컨테이너가 관리해주는 Object
  • 의존성 갖는 객체에 DI(의존성 주입, Dependency Injection)를 통해 Object간 결합도록 낮춰줌
💡 🤢 Bean : Spring에서 Applicatiopn을 구성하는 Object

 

2. 공통 프로그래밍 모델

  • 스프링은 Bean이 생성되고 동작하는 틀을 제공해주고, 어떻게 코드를 작성해야하는지에 대한 기준도 제공함 → 이를 프로그래밍 모델이라고 함
  • 스프링은 크게 3가지 프로그래밍 모델을 지원함 (권장)

 

1) IoC / DI 👏

오브젝트의 생명 주기와 의존 관계에 대한 프로그래밍 모델.

  • 유연함
  • 확장성이 뛰어난 코드 작성 가능
  • 객체지향 설계 원칙
  • 디자인 패턴의 핵심 원리를 담고 있음
  • 주로 환경설정을 담당하는 XML 파일에 의해 설정되고 수행됨

 

IoC (Inversion of Control)

  • 말 뜻대로 제어의 역전
  • 사용자가 Object를 생성하지 않고 스프링이 진행 해줌 → 경량 컨테이너
  • Service, DAO 같은 객체를 사용자가 직접 생성 (new)를 하지 않음
  • @Autowired를 통해 받아 사용함

 

public class order {
	private customer customer;
  	
  	public order() {
  		this.customer = new customer();
  	}
  }
  // Spring 프로젝트
  public class order {

  	@Autowired
	private customer customer;

  }

 

  • 스프링 컨테이너 (IoC Container)는 프로젝트에서 사용되는 Object를 Bean으로 관리하고 있음
    • @Autowired를 통해 Object를 주입해줌
    • 기존 Java 에서는 new로 생성해서 파라미터로 다른 object로 보내거나 소멸함 → new & delete 등 사용자가 제어를 직접 진행함

 

💡 Spring에서는 제어를 사용자가 아니라, Spring Framework가 진행 해준다

😷 Spring Bean vs JAVA Bean

  • Spring Bean
    • Spring Container가 관리하는 객체
    • 개발자가 아닌 스프링 컨테이너가 생성해 생명 주기 관리를 해줌.
    • 필요한 곳에 의존성을 주입해주는 객체들을 의미
  • JAVA Bean
    • 데이터 전달을 위해 사용되는 자바 객체
    • 스프링의 DTO(VO)와 유사한 개념
    • private 변수와 Getter/Setter만을 가지고 있고 직렬화가 가능한 객체

 

DI (Dependency Ingection)

  • 말 그대로 의존성 주입
  • 스프링에서 IoC 구조를 만드는 방식
  • IoC는 다른 프레임워크와 스프링 차별점이 부족해서 만들어진 개념.

😬 DI 사용하는 이유

  • 객체간의 의존성을 줄이기 위함
  • 밖에서 객체를 생성해 넣어주기 때문에 재사용성 ↑, 수정 용이

 

// 기존 자바 프로젝트
class concept_api implements Post(){}
class concept_Spring implements Post(){}

class Blog_log() {
private Post post; // 블로그 글 클래스

  public Blog_log() {
  	this.post = new concept_api();
		this.post = new concept_Spring();
  }
}


기존 프로젝트는 CRUD 함수가 필요함;;;

private Post post;

    public Blog_log(Post post) {
    	this.post = new Post();
    }


의존성을 주입해 DI를 사용하면 Blog_log 하나의 클래스로 관리가 가능하다

2) PSA

Portable Service Abstraction, 포터블 서비스 추상화

  • 특정 환경이나 서버, 기술에 종속되지 않음 → 유연하게 App 개발 가능
  • 스프링은 추상화 계층으로 구체적인 기술/환경에 종속되지 않도록 해줌
    • MyBatis, JPA 등 세부 기술에 대한 에러도 추상화해서 에러를 처리하도록 해줌
    • 추상화를 위해 Proxy 패턴과 같은 디자인 패턴이 자주 사용된다고 함

 

3) AOP

Aspect Oriented Programming, 관점 지향 프로그래밍 (OOP 보다 좀 더 발전된 개념)

  • App에 공통적으로 나타나는 부가적인 기능을 독집적으로 모듈화하는 프로그래밍 모델
    • 로깅, 보안, 트랜잭션 등
  • 스프링은 AOP를 지원해서 엔터프라이즈 서비스를 적용하고도 책임을 분리하여 깰끔하게 함. 객체지향 스럽게 개발하도록 해줌.
  • 스프링은 @Transactional 이라는 선언적 트랜잭션 기능을 구현해서 AOP를 사용할 수 있게 해줌

🏢 Enterprise Service (엔터프라이즈 서비스)

  • 외부 데이터 조회 및 외부 시스템에서 데이터를 가져오기 위한 파이프라인.
  • Sync/Async 하게 데이터를 처리할 수 있음.
  • Web 서비스, HTTP 같은 다중 프로토콜을 사용할 수 있음

 

4) POJO (Plain Old Java Object)

자바가 너무 무거워서, 스프링에서 자바 개념만 기본적인거만 가져와서 하자! 한거

 

3. API

  • Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스
  • 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
  • 스프링은 엔터프라이즈 앱을 개발할 때, 다양한 영역에서 바로 활용할 수 있는 API를 제공함
  • 👀 Layerd Architecture(계층화 아키텍쳐)에서 필요한 주요 기술을 일관된 방식으로 사용할 수 있도록 함
    • function, class, 오픈 소스 기술 등등 지원해줌
    • ex) 클라이언트의 Get request를 처리하는 @GetMapping 같은 API를 제공함
  • 지니야~ 같은걸 만들고 싶다!?면 TTS 같은 UI는 구글이나 네이버꺼 API를 사용하여 개발할 수 있다

 


Spring MVC 구조

스프링 프레임워크는 MVC 구조로 이루어짐

💡 View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO

 

1) View

  • 사용자에게 보이는 화면
  • 스프링은 JSP를 통해 화면을 구성함
  • Controller를 통해 Backend 서버와 연결함

 

2) Controlloer

  • View와 Service 사이를 연결해줌.
  • 클라이언트에서 입력한 URL에 맞게 View를 보여주고, 데이터를 Service로 전달해줌
@RequestMapping(value = "/") 
public String home()
{
	service.method();
  return "index"; 
} // localhost:port/로 접속한 클라이언트에게 index.jsp를 반환한다.

 

3) Service

  • 실제 로직을 처리하는 역할. 모든 기능은 Service에서 만들어짐.
  • Controller를 통해 View에 연결되고, DAO를 통해 DB와 연결됨

 

4) DAO

  • Data Access Object
  • 프로젝트와 DB를 연결해줌
  • Mapper에 SQL을 명시하고 Mapper와 함께 DB 데이터를 주고 받음
  • JDBC, iBATIS(MyBatis), 하이버네이트 등 지원 기능 제공. 데이터베이스 프로그래밍 쉽게 가능

😬 Service의 Serviceimpl 와 DAO의 DAOimpl

  • interface를 구현한 구조

 

5) DTO

  • Data Transfer Object, VO(Value Object)라고도 불림
  • MVC 구조 사이사이에서 데이터 교환을 위한 오브젝트.
  • getter/setter 함수가 이에 해당됨
  • 주로 DB 테이블과 매칭됨

 

public class temp {

    private String id;
    private String pwd;

    public String getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getPwd() {return pwd;}
    public void setPwd(String pwd) {this.pwd = pwd;}
}

Layerd Architecture

(계층화 아키텍처)
Domain Model에서 사용하는 단어? ❓

  • 각 기능을 분리하여 분리된 각 기능(요소)는 응집도가 높아지고, 기능별 결합도는 낮아짐
  • 서로 다른 모듈을 분리해서 다른 모듈에 영향이 안가도록 하기 위한 방법
  • 스프링은 3가지로 나뉘어 처리함
  • 각 계층은 자신의 계층만 잘 처리하도록 충실, 책임을 짐
    • presentation 계층에 종속된 객체를 Service 계층으로 전달하는 등의 실수가 많음
    • 결합도 높게 하지말 것. 재사용 가능하게 할 것.

 

1) Presentation Layer

  • 웹 기반으로 HTTP Request, Response 처리하는 계층
  • 어떠한 요청과 응답 상태에 대한 데이터를 반환하는지에 대한 책임.
  • 작성한 Class를 Presentaion 계층으로 명시하기 위해서는 @Controller 또는 @RestController 로 Annotation을 사용해줘야함
  • 스프링은 HTTP 메시지를 수신하기 위해 Restful API에 맞는 Mapping Annotation을 제공함
    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping 등등등

 

2) Business(Service) Layer

비즈니스 서비스 로직을 담고 있는 계층

  • 요구사항에 맞게 비즈니스 로직을 작성하는 계층 → 일반적으로 서비스의 핵심 로직들이 주로 담겨 있음
  • 서비스 계층 명시할 때는 @Service 어노테이션 사용해야 함
  • 트랜잭션에 대한 관리도 서비스 계층에서 처리하는게 일반적인 패턴

 

3) Data Access Layer

DB와 연동되어 데이터에 접근하는 계층

  • 데이터를 저장하거나 조회하기 위해 DB에 접근하는 계층
  • @Repository 어노테이션 사용함
  • 스프링은 @Repository 가 붙은 어노테이션을 Bean으로 등록해줌.
  • 에러 추상화 같은 부가적인 기능도 제공해줌

 


참고 링크

https://mangkyu.tistory.com/156

 

[Spring] Spring에 대한 이해와 입문, Spring의 3가지 핵심 특징(IoC/DI, PSA, AOP)와 3가지 계층 구조(Controlle

Spring을 제대로 이용하기 위해서는 Spring이 갖는 기본 개념과 철학을 이해해야 한다. 이번에는 Spring에 입문하는 사람들을 위해 Spring에 대해 이해할 수 있는 내용을 작성해보고자 한다. 1. Spring에

mangkyu.tistory.com

https://velog.io/@duckchanahn/Spring-%EC%9D%B4%EB%A1%A0%EC%A0%95%EB%A6%AC

 

Spring 개념정리

Spring 이론 정리

velog.io

'BackEnd > Java&Spring' 카테고리의 다른 글

Spring Cron Expression  (0) 2023.01.25
StringUtils  (0) 2023.01.18
Looking For Annotation~  (0) 2023.01.16
Intellij) Junit Test Code 작성 시 "Execution failed for task" 해결 방법  (0) 2023.01.09
Web Server vs WAS  (0) 2022.04.25