spring-god-study / spring-basic

김영한님 스프링 기본 강의를 듣고 서로 인증하고 힘을 내며 잇쌰잇쌰하는 프로젝트
0 stars 3 forks source link

2021.07.24 / 2021.07.25 (주말) 인증 #18

Open kyupid opened 3 years ago

char-yb commented 3 years ago

강의명: 스프링 핵심원리 기본 수강날짜: 7.24 수강회차: 빈 생명주기 콜백 시작 ~ 프로토타입 스코프

빈 생명주기 콜백 시작

스프링 빈은 간단하게 아래와 같은 라이프사이클이 돈다. 객체 생성 -> 의존관계 주입

스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입(수정자, 필드 주입) -> 초기화 콜백(의존관계 끝) -> 사용 -> 소멸전 콜백 -> 스프링 종료

참고: 객체의 생성과 초기화를 분리하자. 단일 책임원칙으로 객체를 생성할 때는 정말 생성에 집중을 해야 한다. 메모리 할당까지 세팅을 완료해야 한다.

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.

인터페이스 InitializingBean, DisposableBean

초기화, 소멸 인터페이스 단점

빈 등록 초기화, 소멸 메서드 설정 정보 사용 특징

애노테이션 @PostConstruct, @PreDestory

정리

빈 스코프 빈 스코프란? 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.

스프링은 다음과 같은 다양한 스코프를 지원

프로토타입 스코프

  1. 싱글톤 스코프의 빈을 스프링 컨테이너에 요청한다.
  2. 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다.
  3. 이후에 스프링 컨테이너에 같은 요청이 와도 같은 객체 인스턴스의 스프링 빈을 반환한다

프로토타입 빈 요청1

  1. 프로토타입 스코프의 빈을 스프링 컨테이너에 요청한다.
  2. 스프링 컨테이너는 이 시점에 프로토타입 빈을 생성하고, 필요한 의존관계를 주입한다. 프로토타입 빈 요청2
  3. 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환한다.
  4. 이후에 스프링 컨테이너에 같은 요청이 오면 항상 새로운 프로토타입 빈을 생성해서 반환한다.

정리

만약에 호출해줄려면 적절하게 다 작성하고 destroy() 를 직접 호출을 해주고 close()해주어야 한다.

프로토타입 빈의 특징 정리

kyupid commented 3 years ago

스프링 핵심 원리 - 기본편 객체지향 설계와 스프링 예제만들기 초입부분 순수한 자바로만 서비스를 만든다는 건 무슨느낌일까 기대된다

char-yb commented 3 years ago

강의명: 스프링 핵심원리 기본편 수강회차: 프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 문제점 ~ 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결

프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 문제점

스프링 컨테이너에 프로토타입 빈 직접 요청 스프링 컨테이너에 프토토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 일단 듣자마자 이해는 잘 안됐다.

  1. 클라이언트A는 스프링 컨테이너에 프로토타입 빈을 요청한다.
  2. 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x01)한다. 해당 빈의 count 필드 값은 0이다.
  3. 클라이언트는 조회한 프로토타입 빈에 addCount() 함수를 호출하면서 count 필드를 +1 한다. 결과적으로 프로토타입 빈(x01)의 count는 1이 된다.

스프링 컨테이너에 프로토타입 빈 직접 요청2

  1. 클라이언트B는 스프링 컨테이너에 프로토타입 빈을 요청한다.
  2. 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x02)한다. 해당 빈의 count 필드 값은 0이다.
  3. 클라이언트는 조회한 프로토타입 빈에 addCount() 를 호출하면서 count 필드를 +1 한다. 결과적으로 프로토타입 빈(x02)의 count는 1이 된다.

싱클톤에서 프로토타입 빈 사용1 clientBean 은 싱글톤이므로, 보통 스프링 컨테이너 생성 시점에 함께 생성되고, 의존관계 주입도 발생한다.

  1. clientBean 은 의존관계 자동 주입을 사용한다. 주입 시점에 스프링 컨테이너에 프로토타입 빈을 요청한다.
  2. 스프링 컨테이너는 프로토타입 빈을 생성해서 clientBean 에 반환한다. 프로토타입 빈의 count 필드값은 0이다. 이제 clientBean 은 프로토타입 빈을 내부 필드에 보관한다. (정확히는 참조값을 보관한다.)

싱글톤에서 프로토타입 빈 사용2 클라이언트 A는 clientBean 을 스프링 컨테이너에 요청해서 받는다.싱글톤이므로 항상 같은 clientBean 이 반환된다.

  1. 클라이언트 A는 clientBean.logic() 을 호출한다.
  2. clientBean 은 prototypeBean의 addCount() 를 호출해서 프로토타입 빈의 count를 증가한다. count값이 1이 된다

싱글톤에서 프로토타입 빈 사용3 (가장 어렵다...) 클라이언트 B는 clientBean 을 스프링 컨테이너에 요청해서 받는다.싱글톤이므로 항상 같은 clientBean 이 반환된다. 여기서 중요한 점이 있는데, clientBean이 내부에 가지고 있는 프로토타입 빈은 이미 과거에 주입이 끝난 빈이다. 주입 시점에 스프링 컨테이너에 요청해서 프로토타입 빈이 새로 생성이 된 것이지, 사용 할 때마다 새로 생성되는 것이 아니다!

  1. 클라이언트 B는 clientBean.logic() 을 호출한다.
  2. clientBean 은 prototypeBean의 addCount() 를 호출해서 프로토타입 빈의 count를 증가한다. 원래 count 값이 1이었으므로 2가 된다.

무식하게 logic() 안에 applicationContext로 주입을 받아 사용하면 값은 2가 아닌 1이 된다.

여러 빈에서 같은 프로토타입 빈을 주입 받으면, 주입 받는 시점에 각각 새로운 프로토타입 빈이 생성된다. 예를 들어서 clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.

clientA prototypeBean@x01 clientB prototypeBean@x02 결국 프로토타입 빈을 사용하는 것은 사용할때 마다 새로 생성해서 사용할려고 하는 것이다. 이와 같은 문제를 아래 강의 회차에서 다룬다.

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결

ObjectFactory, ObjectProvider 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider 이다. ObjectFactory가 있지만 getObject 기능만 제공되어 따로 실습할 필요는 없다.

JSR-330 Provider: 자바 표준 (스프링에 의존하지 않는 기능)

특징

정리

dnjsrud3407 commented 3 years ago

강의명 : 스프링 핵심 원리 수강회차 <의존관계 자동 주입>

<빈 생명주기 콜백>

요약

dowon-ahn commented 3 years ago

HTTP 완벽가이드 란 책을 읽으며, 메모하는 글 입니다.

1.2 웹 클라이언트 서버

1.3 리소스

1.3.1 미디어 타입

e.g. HTML => text/html 라벨이 붙는다.

JPEG 이미지는 image/jpeg가 붙는다.

GIF 이미지는 image/gif가 된다.

1.3.2 URI

1.3.3 URL

1.3.4 URN

1.4 트랜잭션

1.4.1 메서드

1.4.2 상태코드

1.4.3 웹페이지는 여러 객체로 이루어질 수 있다.

1.5 메세지

1.6 TCP 커넥션

1.6.2 접속 / IP / 주소 그리고 포트번호

sablemarten commented 3 years ago

스프링 빈 조회

빈 조회라고 해서 잘 안 와닿았는데 복붙으로만 사용했던 부분에 대한 설명이었다. 자바와 스프링을 동시에 배웠을 때 왜 이것과 저것이 매칭되어서 작동하는 것인지 모르고 썼었는데, 실무에서 쓸 때 생각하면서 써보도록 할 수 있을 것 같다.

arangeblue commented 3 years ago

강의명 : 스프링 MVC 1편 수강회차 : 스프링 MVC 섹션 0~1 / 웹 어플리케이션의 이해

내용

웹 시스템 구성


서블릿 : 비즈니스 로직 실행이라는 가장 중요한 로직을 제외한 거의 모든 HTTP처리 업무를 지원


서블릿 컨테이너 : WAS안에는 서블릿 컨테이너가 있는데 이는 객체 생성, 호출, 관리까지 해준다.

cxz5309 commented 3 years ago

스프링 핵심 원리 - 기본편

5. 싱글톤 컨테이너

싱글톤 패턴

  1. static영역에 객체 instance를 미리 하나 생성해서 올려둔다.
  2. 이 객체 인스턴스가 필요하면 오직 getInstance()메서드를 통해서만 조회할 수 있다.
  3. 생성자를 private로 막아서 혹시라도 외부에서 new 키워드로 생성되는 것을 막는다.

싱글톤 컨테이너

싱글톤 방식의 주의점

@Configuration과 싱글톤

bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70

@Configuration 을 적용하지 않고, @Bean 만 적용하면 어떻게 될까?

bean = class hello.core.AppConfig

  • 이 출력 결과를 통해서 AppConfig가 CGLIB 기술 없이 순수한 AppConfig로 스프링 빈에 등록된 것을 확인할 수 있다
  • 당연히 인스턴스가 같은지 테스트 하는 코드도 실패하고, 각각 다 다른 MemoryMemberRepository 인 스턴스를 가지고 있다

정리

juvelop17 commented 3 years ago

회원 리포지토리 테스트 케이스 작성

개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.

회원 리포지토리 메모리 구현체 테스트

CMD + P : 사용 가능한 파라미터 타입 확인