diff --git a/README.md b/README.md index ebeffaf..e4a0ed0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,137 @@ # spring-tutorial-21st CEOS back-end 21st spring tutorial project + +
+ +## Spring이란? +- 개발 초기에 개발자가 설정하고 관리해야 하는 대부분의 요소 + (= MVC 계층 구조, 클래스 생성자, 그 외 각 계층에서 필요한 객체 생성, 소멸, 의존성 관리 등의 기능)을 자동으로 처리해주는 프레임워크. +
+ +- 이를 통해 개발자는 개발 작업에 집중하고, 더 나아가 객체 간 관계의 설정 및 관리 작업을 더 쉽게 할 수 있습니다. +
+ +## Spring의 Bean은 무엇일까요? - Bean의 라이프 사이클에 대해! +- Bean : Spring 컨테이너에서 생성, 관리하는 재사용 가능한 **객체**입니다. +- Bean의 특징 + (1) 객체(Bean) 간 의존성(연결점)을 설정할 수 있습니다. + (2) Ioc, DI의 원리가 적용됩니다. +
+ +- Bean의 라이프 사이클 +1. @Component 또는 @Bean으로 등록된 객체가 생성됩니다. +2. 의존성 주입(@Autowired 등) +3. 초기화(Initaializing Bean, @PostConstruct -> Bean이 생성된 후 실행.) +4. 애플리케이션이 실행되면서 빈이 사용됩니다. +5. 소멸(Destroying Bean, @PreDestory -> Bean이 소멸되기 전 실행) : 애플리케이션 종료 시 정리 작업을 수행합니다. +
+ + + +## 스프링 어노테이션(Annotation)에 대해 +- 어노테이션은 무엇일까요? + 컴파일러에게 정보를 주는 **주석**( = 메타데이터) 역할을 합니다. + 사람이 코드에서 주석을 보고 코드에 대한 정보를 얻듯, + @ 뒤의 단어를 통해 컴파일러의 코드 생성에 정보를 주거나, 특정 행위를 하도록 유도합니다. + 주석은 프로그램에 영향을 끼치지 않지만 어노테이션은 프로그램의 동작에 다양한 영향을 줍니다. + +- 어노테이션의 종류 + + **(1) 표준 어노테이션 + (2) 메타 어노테이션 + (3) 사용자 어노테이션** + +
+ +### 1. 표준 어노테이션 +- 자바에서 기본적으로 제공하는 어노테이션 +- 종류 +1) @Component : 일반적인 Bean 등록 +2) @Service : 서비스 계층(비즈니스 로직 계층)에서 사용합니다. +3) @Repository : 데이터 접근 계층 (DAO)에서 사용합니다. +4) @Controller : MVC 패턴에서 컨트롤러 역할에 하는 클래스에 사용합니다. +5) @RestController : JSON 형태의 응답을 반환하는 API 컨트롤러에서 사용합니다. +6) @Override : 상위 클래스의 메서드를 오버라이딩 한다는 것을 알립니다. +7) @SuppressWarning : 컴파일 경고 메시지가 나타나지 않도록 합니다. + +
+ +### 2. 메타 어노테이션 +- 다른 어노테이션에서도 사용되는 어노테이션 +- 종류 +1) @Autowired → 자동으로 의존성을 주입합니다. +2) @Qualifier → 특정한 Bean을 지정하여 주입합니다. +3) @RequiredArgsConstructor → Lombok을 활용한 의존성을 주입합니다. + +
+ +### 3. 사용자 어노테이션 +- 사용자가 직접 정의하여 사용하는 어노테이션 +- 종류 +1) @Aspect → AOP를 정의하는 클래스. +2) @Before → 메서드 실행 전에 동작합니다. +3) @After → 메서드 실행 후 동작합니다. +4) @Around → 메서드 실행 전후로 동작합니다. + + + +
+ +## 단위 테스트 vs 통합 테스트 + +- 테스트를 하는 이유? +개발 과정에서의 문제점을 미리 발견할 수 있습니다. +JS에서 타입 체크를 하지 않아서 타입 문제가 발생한다면, +TS에서는 타입 지정을 미리 해서 타입 변환 문제를 미리 방지하는데, 이러한 논리와 유사합니다. +테스트를 미리 해봄으로써 발생할 수 있는 문제 상황을 줄일 수 있습니다. + +- 테스트의 종류 +1. 단위 테스트(Unit Test) +한 개의 메서드 또는 클래스만을 테스트합니다. +다른 컴포넌트(데이터베이스, 네트워크 등)와 분리하여 테스트하며, +독립적이고 빠르게 실행이 가능합니다. + + +3. 통합 테스트(Integration Test) +전체 시스템(데이터베이스, API, 서비스 등)을 포함하여 테스트합니다. +실제 DB, 외부 API 등과 연동되는 환경에서 실행합니다. +환경 설정이 필요하여 실행 속도가 단위 테스트보다 느립니다. + +
+ +## Spring이 지원하는 기술들 - IoC/DI, AOP, PSA + +1. **IoC** (Inversion of Control, 제어의 역전) +- 객체의 생성과 생명주기를 개발자가 직접 관리하는 것이 아니라, 스프링이 대신 관리합니다. +- 기존에는 new 키워드를 사용해 객체를 생성했지만, 스프링에서는 자동으로 생성합니다. + +2. **DI** (Dependency Injection, 의존성 주입) +- 객체 간의 의존성을 스프링이 관리해 줍니다. +- @Autowired, @Component, @Service 등을 활용하여 코드의 결합도를 낮출 수 있습니다. + +3. **AOP** (Aspect-Oriented Programming, 관점 지향 프로그래밍) +- 공통적인 기능(로깅, 트랜잭션 등)을 분리하여 관리합니다. +- @Aspect, @Before, @After, @Around 등의 어노테이션을 사용합니다. + +4. **PSA** (Portable Service Abstraction, 서비스 추상화) +- JDBC, 트랜잭션, 메시징 등 다양한 기술을 쉽게 사용할 수 있도록 스프링이 추상화를 제공합니다. + +
+ + +## 새롭게 알게 된 점 +스프링의 기본 문법과 이론에 대해 알 수 있는 기회였습니다. +이론에 집중해서 정리를 해 보았는데 다음에는 이론 + 실습을 적절히 섞어 작성해보려 합니다 : ] + + +
+ +--- + + +
+ + + +![image](https://github.com/user-attachments/assets/66338a13-8720-4e72-aa7b-a72512cd36eb) +