> For the complete documentation index, see [llms.txt](https://injun-woo30000.gitbook.io/growth-log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://injun-woo30000.gitbook.io/growth-log/daily-review/2021/april/2021-04-01-thu.md).

# 2021-04-01(Thu)

| 항목         | 내용            |
| ---------- | ------------- |
| 학습 날짜      | 2021-04-01(목) |
| 학습 시간      | 11:00\~23:00  |
| 학습 범위 및 주제 | spring        |
| 학습 목표      | spring을 학습하자! |
| 동료 학습 방법   | -             |

## 상세 학습 내용

### 스프링 빈과 의존관계

스프링은 스프링 컨테이너가 생성될 때, 객체 인스턴스를 '스프링 빈'이라는 이름으로 생성하고 관리한다. 생성자에 `@Autowired`가 연관된 스프링 빈을 스프링 컨테이너에서 찾아서 넣어준다. 의존성 주입을 프레임워크 차원에서 편하게 해주는 셈. 참고로 `@Autowired` 를 통한 DI는 `helloController`, `memberService` 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

스프링 빈은 두 가지 방법으로 등록할 수 있다.

1. 컴포넌트 스캔과 자동 의존관계 설정
   * `@Component` 어노테이션이 있으면 스프링 빈으로 자동 등록된다. `@Controller`, `@Service`, `@Repository` 도 내부 코드를 뜯어보면 `@Component` 어노테이션을 포함하고 있다.
   * 이렇게 등록되는 스프링 빈 객체는 기본적으로 싱글톤이다. (설정으로 바꿀 수 있긴 함)
   * 참고로 컴포넌트 스캔은 `@SpringBootApplication` 어노테이션이 정의된 클래스가 속한 패키지의 하위 요소들이 대상이다.
2. 자바 코드로 직접 스프링 빈 등록하기
   * `@Configuration` 어노테이션과 함께 설정 클래스를 생성한다. 이 때 `@Bean` 어노테이션으로 스프링 빈 객체를 생성한다.
   * 메모리 리포지토리를 다른 리포지토리로 변경하는 등의 객체변경시 수정해야할 코드가 컴포넌트 스캔 방식에 비해 적다는 장점이 있다.

### 스프링에서 의존성 주입 방식 3가지

* 필드 주입
  * 주입시 설정을 디테일하게 바꾸기 어려으므로 권장되지 않는다.
* setter 주입
  * 의존관계가 실행 중에 동적으로 변하는 경우가 거의 없는 반면, setter 주입은 동적 변경할 여지를 남기기 때문에 권장되지 않는다.
* 생성자 주입
  * 실무에서 가장 권장되는 방식이다.

rails와 비슷하면서 달라서 흥미로운 것들이 있다. rails에서는 엔드포인트들을 `route.rb` 파일에 명시한 반면, 스프링은 파일마다 어노테이션으로 맵핑한다. 그리고 재밌게도, rails에서는 어떤 요청이 들어오든 `params` 객체를 호출해서 query나 body에 포함된 값을 key 값을 인덱스 삼아 value를 확인할 수 있었다. 반면 스프링부트에서는 key 값에 대응하는 프로퍼티를 가진 객체를 만들어서 요청을 받는다. 이건 개인적으론 생산성 저하 요인이 될 수 있겠다 싶지만, 엔드포인트와 연결된 메서드 내에서만 조작될 수 있도록 제한하기 편하겠다 싶다. 편의성 vs 안정성이랄까. 그리고 rails에서는 DB migrate 내역을 남길 수 있게끔 커맨드 기반으로 DB 테이블을 조작한다. 반면 spring boot는 DB migrate 내역은 셀프로 남겨야하는듯 하다. 그냥 기초적인 spring boot 예제여서 그런가?

## 학습 내용에 대한 개인적인 총평

흠 재밌긴한데 갈길이 멀다!

## 다음 학습 계획

* 디자인패턴 학습
