현재 스프링의을 정확히 이해하기 위해서
10일동안 복습을 진행하려고한다.
DAY 1: Spring의 기본 ~ DI,AOP 핵심개념 짚어가기
[Spring Mvc ↓]
DAY2 : API, 서비스, 예외처리
DAY3 : JDBC
DAY4 : JPA
DAY5 : 트랜젝션 + 테스팅
DAY 6: API문서화
DAY 7: APP 빌드/실행배포
순으로 복습 블로깅을 시작하려고 한다.
정확한 내용을 이해하고 활용하기 위함이 목적이고,
개인적인 공부를 위해 작성 되었으니 틀린부분 지적은 언제나 환영합니다!!! ㅎㅎ
review의 과정
1. 어떤 문제가 발생했는지..
2. 해결하기 위해 어떤 시도를 했는지..
3. 해결이 되었는지 해결이 되지 않았는지..
4. 어떤 방법으로 해결이 되었는지..
Spring Framework의 기본
Spring Framework란?
목표:
- Spring Framework이 무엇인지 이해할 수 있다.
- Spring Framework을 왜 배워야하는지 이해할 수 있다.
- Spring Framework과 다른 Framework와의 차이를 이해할 수 있다.
Framework이란?
소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것. ( Collections Framework 콜렉션도 프레임워크다.)
즉 프로그래밍 상에서의 Framework은 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공한다.
장점:
효율적인 코드 작성 가능 : Framework이 라이브러리 형태로 제공함으로써 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있도록 함.
정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있다 : 유지보수 이외에도 비슷한 기능을 개발할때 코드의 재사용이 용이하고 기능의 확장또한 쉽게 확장이 가능.
단점:
Framework에 대한 학습이 필요: 추가로 Spring이라는 Framework에 대한 학습이 필요
자유롭고 유연한 개발이 어렵다 : Framework에 규약을 벗어나기가 어렵다.
point
즉 프로그래밍 상에서의 Framework은 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공한다.
Framework와 Library의 차이?
Library는 애플리케이션을 개발하는 데 사용되는 일련의 데이터 및 프로그래밍 코드. 즉 애플리케이션을 개발할 때 필요한 기능을 미리 구현해놓은 집합체 이다.
ex) 자동차에서 차체가 Framework 이고, 다양한 기능을 제공하는 부품이 Library.
한번 정해진 Framework를 교체하는일은 어렵지만, Library는 쉽게 교체가 가능하며 필요한 Library들을 선택적으로 사용할 수 있다는 뜻이다.
즉 결과적으로 애플리케이션에 대한 제어권의 차이가 있다.
개발자가 짜 놓은 코드내에서 필요한 기능이 있으면 해당 라이브러리를 호출해서 사용하는 것이 Library이고,
애플리케이션 흐름의 주도권이 개발자가 아닌 Framework에 있는 것이 Framework의 특징이다.
-> 제어의 역전 IOC(Inversion Of Control)의 개념임.
point
* Framework은 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있도록 해준다.
* Library는 애플리케이션 흐름의 주도권이 개발자에게 있는 반면, Framework은 애플리케이션 흐름의 주도권이 개발자가 아닌 Framework에 있다.
* Spring Framework이 도입되기 전에는 JSP나 Servlet 기술을 사용한 Model1, Model2 아키텍쳐를 기반으로 한 Java 웹 애플리케이션을 제작하였다.
* Spring MVC 방식이 도입됨으로써 Java 웹 애플리케이션의 제작 방식이 획기적으로 변하게 되었다.
* Spring MVC 설정의 복잡함과 어려움을 극복하기 위해 Spring Boot이 탄생하게 되었다.
Spring 짚고 넘어갈 내용.
1. Java Servlet은 현재 거의 사용하지 않지만, Spring MVC 같은 Java 기반의 웹 애플리케이션 내부에서 여전히 사용이 되고 있다. (https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF)
2. 서블릿 컨테이너(Servlet Container)란?
서블릿 컨테이너(Servlet Container)는 서블릿(Servlet) 기반의 웹 애플리케이션을 실행해주는 것부터 시작해서 Servlet의 생명 주기를 관리하며, 쓰레드 풀(Thread Pool)을 생성해서 Servlet과 Thread를 매핑 시켜주기도 한다.
(https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88)
3. 아파치 톰캣(Apache Tomcat)은 서블릿 컨테이너의 한 종류로써 Spring MVC 기반의 웹 애플리케이션 역시 기본적으로 아파치 톰캣에서 실행 된다.
(https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%ED%86%B0%EC%BA%A3)
Spring Framework의 특징
목표:
POJO / IoC / DI / AOP / PSA 가 무엇인지 알고 필요한 이유를 설명할 수 있어야 한다.
POJO(Plain Old Java Object) = Java로 생성하는 순수한 객체
두 가지 정도의 기본적인 규칙은 지켜주면 POJO 프로그래밍이라고 한다.
1. Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
2. 특정 환경에 종속적이지 않아야 한다.
POJO 프로그래밍이 필요한 이유
* 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
* 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거 함으로써 코드가 깔끔해진다.
* 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
* 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해진다.
* 객체지향적인 설계를 제한없이 적용할 수 있다.(가장 중요한 이유)
point
* POJO란 순수한 Java 객체를 의미한다.
* POJO 프로그래밍이란 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법이다.
* POJO 프로그래밍을 효과적으로 적용하기 위해서는 특정 기술에 대한 지식보다는 JDK의 API에 대한 지식과 객체지향적인 사고방식과 설계를 위한 훈련이 우선시 되어야 한다.
* Spring Framework은 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA 라는 기술을 제공한다.
IoC(Inversion of Control)?
애플리케이션 흐름의 주도권이 뒤바뀐 것을 바로 IoC(Inversion of Control)라고 한다.
아래와 같은 코드가 있다면
public class minsExample {
public static void main(String[] args) {
System.out.println("Hello min!");
}
}
main() -> System클래스를 통해 out멤버 변수인 println()을 호출한다.
이와같이 순차적으로 실행하는 것이 애플리케이션의 일반적인 흐름이다.
이와 반대로 IoC는 제어의 역전이 일어나게 되겠지?
↓
IoC코드 예제는 중요 내용이기에 -> DI(Dependency Injection), AOP, PSA를 모두 정리한 후에
따로 새로운 게시글로 포스팅할 예정이다. (# IoC , DI 적용 코드)
DI(Dependency Injection) 의존성 주입
IoC(제어의 역전)는 서버 컨테이너 기술, 디자인 패턴, 객체 지향 설계 등에 적용하게 되는 일반적인 개념인데 반해 DI(Dependency Injection)는 IoC 개념을 조금 구체화 시킨 것이라고 볼 수 있다.
객체지향 프로그래밍에서 의존성이라고 하면 대부분 객체 간의 의존성을 말한다.
즉
클래스의 생성자로 객체를 전달 받는 코드가 있다면,
‘아, 객체를 외부에서 주입 받고 있구나. 의존성 주입이 이루어 지고 있구나’ 라고 생각해도 된다.
point
* new 키워드를 사용해서 의존 객체를 생성할 때, 클래스들 간에 강하게 결합(Tight Coupling)되어 있다라고 합니다.
(인터페이스, 스프링 프레임워크를 사용하면 해결됨. 스프링 사용 추천.)
* 애플리케이션 흐름의 주도권이 사용자에게 있지 않고, Framework이나 서블릿 컨테이너 등 외부에 있는 것 즉, 흐름의 주도권이 뒤바뀐 것을 IoC(Inversion of Control)라고 한다.
* DI(Dependency Injection)는 IoC 개념을 조금 구체화 시킨 것으로 객체 간의 관계를 느슨하게 해준다.
* 클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립하게 된다.
* 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다.
* 어떤 클래스가 인터페이스 같이 일반화 된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling)되어 있다고 한다.
* 객체들 간의 느슨한 결합은 요구 사항의 변경에 유연하게 대처할 수 있도록 해준다.
* 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.
* Spring에서는 애플리케이션 코드에서 이루어지는 의존성 주입(DI)을 Spring에서 대신 해준다.
PSA와 AOP는 다음 포스팅에서 마저 정리하도록 하겠다.
*알아두면 좋은 내용
1. Spring을 사용한 웹 요청을 처리할때에도 내부적으로는 Servlet을 사용한다
2. 객체지향 설계 원칙
(https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)
DAY1 남은내용: AOP, PSA / Spring Boot / DI, AOP 재정리. [코드 작성해가며] ↓
다음주제 : AOP, PSA
https://mininkorea.tistory.com/44
'JAVA > Spring' 카테고리의 다른 글
Java 기반 컨테이너 설정방법 (Spring 어노테이션 활용) (0) | 2023.03.13 |
---|---|
스코프(Scope) 란? /SpringFramework (1) | 2023.03.13 |
Spring Boot 이란? [Spring Boot은 왜써?] (0) | 2023.03.10 |
Aggregate? (애그리거트) 객체지향 프로그래밍 중요 개념 / Java Spring 학습 (0) | 2023.02.21 |
JDBC(Spring JDBC)란? / 스프링 JDBC 알고넘어가기! ^^ (0) | 2023.02.20 |
댓글