본문 바로가기

우아한테크코스

📋 Spring Core 막 적은 강의 노트

2021-04-20글

객체의 의존 관리는 스프링이 한다.
스프링은 개발자를 대신해서 객체들을 생성하고 관리하는 일을 한다.

ChessService에서 ChessDao 의존하기

image-20210420104423745

변경에 취약하다

의존 관계를 개발자가 직접 관리하려면 복잡하다.
스프링 컨테이너가 관리해준다.

컨테이너

담아놓는 용기
스프링에서는 스프링이 활용할 객체들을 담아놓은 용기를 말한다.

Bean으로 등록하는 기준?

프로그램 별로 공통적으로 쓸 수 있는 대상
레이어에 대한 객체들을 재사용할 수 있는데 이들을 빈으로 관리한다.
상태가 없는 객체를 빈으로 등록한다. -> 빈으로 등록 하려면 상태가 없어야 한다.

설정의 메타 데이터(Configuration Metadata)를 이용해 스프링 컨테이너에 담아놓는다.
컨테이너에 담으면 빈으로 등록된다.

스프링이 객체를 관리하게 하려면

  • 객체 관리 대상 알려주기
  • 객체들 간의 의존성 정의하기

컨테이너 설정 방법 - 빈 등록 방법

@ComponentScan : 등록할 빈을 스캔할 classpath를 지정 (@SpringBootApplication 내부에 속해있는 애너테이션)

@Component : ComponentScan 클래스 하위에 특정 애너테이션이 붙은 클래스를 스프링 빈으로 지정

![image-20210420110038067](/Users/jyejye/Library/Application Support/typora-user-images/image-20210420110038067.png)

의존성 주입

생성자 주입(without 스프링 컨테이너)

수정자 주입(without 스프링 컨테이너)

필드를 통해 주입할 수도 있다.
스프링에서는 XML, 어노테이션, 자바 클래스를 통해 의존성을 주입할 수 있다.

@Autowired를 붙여준다. 생성자 매개변수의 값이 필요하구나를 알 수 있다.

특정 컴포넌트 어노테이션을 붙인다고 해서 특정 의미가 부여되는 것은 아니고,

Repository는 도메인 객체의 생명주기를 관리하며 Public Operation을 제공합니다. 이에 Domain Layer에 해당합니다. 도메인 모델과 생애주기가 같기 때문이죠.
실제 구현체인 SimpleJpaRepository는 Infrastructure Layer에 해당합니다.
이렇게 추상에 의존하고 구체에 의존하지 않도록 구성함으로써(DIP) 유연성있는 시스템을 구성할 수 있습니다.
반면, DAO는 CRUD와 1:1로 매칭되어 Persistence Operation을 적극적으로 드러냅니다.
즉, repository는 도메인 모델의 일부로 보며 추상인 반면, dao는 추상이 필수는 아니라고 생각합니다.

http://egloos.zum.com/aeternum/v/1160846

https://stackoverflow.com/questions/8550124/what-is-the-difference-between-dao-and-repository-patterns

빈은 기본적으로 싱글턴 스코프

컨테이너는 개념적인 것 컨텍스트는 객체의 일원

갠적으로 어노테이션은 막붙이기 좋고(빠르게 개발하기)
xml에 명시하면 일률적으로 내가 어떻게 관리하고 있는지 눈에 들어와서 좋았습니다.

image-20210420114253606

서비스 레이어는 어떤 역할을 할까요?

도메인 로직들의 순서를 보장하면서, 서비스 트랜잭션 관리를 한다.
객체들의 비지니스 플로우를 관리해준다.
비지니스 로직은 도메인으로!

Pojo

스프링에서 스프링 빈으로 관리하고 싶은 객체
스프링 설정이 가해지기 전 상태의 객체를 POJO라고 한다.

포조는 순수한 자바 객체를 의미

Java Bean :

자바빈은 포조라고 할 수 있지만 포조는 자바빈이라고 하긴 애매하다.

image-20210420120440979

뷰 컨트롤러를 분리했다고 보면 됨 그런 차원에서 의미가 있따.

맞아유 config가 코드 양이 좀 더 짧은 거 같아서 더 좋은 거 같아여! 어차피 configuration은 대부분 만들어 놓으니 다른 클래스 안만들어도 되구!