어쩌다보니 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 |