1. Spring
- Spring FrameWork이다. (+ Websocket은 채팅시 필요한 기술)
1-1. CQRS패턴 - for 유지보수
1-1-1. CQRS 구조

- Command와 Query로 구조를 나눠서, Query는 조회를 맡고, Command는 그 외에 것들을 처리하는 구조로 만들어진다.
- Command에서는 Application, Domain, Infrastructure, DB, MSA 구조로 되어 있다.
- Application에서는 사용자로부터 값을 받고 처리하기 위해서 DB로 접근하기 위한 층이자, DB로부터 받아온 데이터를 처리하여 사용자에게 값을 주는 역할
- Domain에서는 DB로부터 받아온 값들을 저장하고, 관리하며, Application에서 요청하는 데이터를 보내주는 역할
- Infrastructure에서는 DB나, 외부 API나 MS로부터 값을 받아올 수 있도록 하는 역할
1-1-2. CQRS 흐름

- 위와 같은 흐름 및 의존성을 가지고 있다.
- 특이한 점은 DB에서 직접 값을 받아오는 Infrastructure 계층에서의 Repository가 Domain의 Repository로 의존성을 가진다는 점이다.
- 이는 DIP(Dependency Inversion Principle)로 하위 구현체의 존재를 모르게 (타입,구현 은닉)하여, Infrastructure의 Repository에서 값이 변경되어도, 다른 계층에서 영향을 받지 않도록 하기위함이다.
- 이를 수행하기 위해, Domain에는 Interface로 Repository 클래스를 만들고, Infrastructure에서 실제로 DB 작업을 하는 Impl 클래스를 만든다.
1-2. Spring Bean
- Spring에서 Bean이란 IOC에 의해서 자동으로 관리되는 재사용 가능한 컴포넌트(재사용이 가능하므로, 사용할 때마다 매번 객체를 통해 등록해줄 필요 X)
- Spring은 POJO를 bean으로 등록하여 관리하는데, bean으로 등록하는 방식은 총 3가지가 존재한다
- java Bean 형태(@Bean)
- xml(xml 파일 생성)
- Annotation(@Controller, @Service, @Repository, @Component) -> 주로 사용
- Annotation으로 등록
=> @Controller나 @Service등 Annotation을 달면, Spring Container에서 알아서 bean으로 인지해서 객체를 만들어 준다( 기본 생성자 필요 )
=> 설정(Configuration)파일에 @Configuration와 @ComponentScan(basePackages: 적용할 경로) 를 등록해줘야 Container에서 알아서 인지한다.
+) Configuration 파일 대신 xml 파일로 대체 가능
=> @Controller, @Service, @Repository, @Component를 달아주면 해당 클래스의 이름(맨 앞글자는 소문자)으로 Bean이 등록된다.
2. Spring 3대 축

- Spring을 통해서 알아야 할 3가지 중요 요소이다.
2-1. IoC Container(객체 생성, 소멸)

- IoC(Inversion of Control)은 사용자가 입력만 하면 Spring에서 설정파일을 보고 객체를 직접 등록해주고 주입해줌으로 제어(주도권)가 역전되었다는 의미
- Spring에서는 우리가 JAVA로 만든 POJO(아직 Bean으로 관리되지 X)라는 일반적인 객체와 설정파일을 Spring Container에 넘겨주면 Spring에서 알아서 Bean으로 관리하며 작동시켜줌
2-2. DI(의존성 주입)
2-2-1. Dequendency Injection
의존이란?
=> B라는 클래스가 변경되었을 때,A라는 클래스에도 영향을 미치다.(B는 A에 의존관계이다.)
- has a 관계 (의존, 연관 관계)
- 객체 간의 의존 관계를 Bean 설정을 통해서 자동으로 Spring Container가 인지할 수 있도록 해줌 (결합도 낮춤, 유지보수 용이 => A와 B, B와 C가 의존관계 일때, A가 수정되어도 C에 영향 미치지 X)
- new 연산자를 이용해서 객체를 따로 생성해줄 필요 X
- 의존성 주입은 3가지 존재
1. 생성자 주입 (이 방식을 주로 사용)
2. setter 주입
3. 필드 주입 (필드 위에 @Autowired를 달아서 사용) - 권장 X
- 필드 주입의 단점
: 1. java의 reflection 기술( 접근 제어자를 무시하고 모든 것이 적용 가능 : Bad)
: 2. 필드가 많아 주입받을 것이 많을 경우 @Autowired를 너무 많이 선언해야함
- setter 주입의 단점
: 1. setter로 의존성을 주입하면, 아무나 값을 집어 넣을 수 있음
: 2. method 이름마다 필드의 이름으로 설정되다 보니 보안 유지 X
: 3. 같은 객체의 주소에 할당되어 동등 비교 X
: 4. 필드에 final로 의존성 주입을 받지 못한다. (고정되지 X)
2-2-2. DI Annotaion