Open kyupid opened 3 years ago
스프링 핵심 원리 - 기본편 객체지향 설계와 스프링 예제만들기 초입부분 순수한 자바로만 서비스를 만든다는 건 무슨느낌일까 기대된다
강의명: 스프링 핵심원리 기본편 수강회차: 프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 문제점 ~ 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 문제점
스프링 컨테이너에 프로토타입 빈 직접 요청 스프링 컨테이너에 프토토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 일단 듣자마자 이해는 잘 안됐다.
스프링 컨테이너에 프로토타입 빈 직접 요청2
싱클톤에서 프로토타입 빈 사용1 clientBean 은 싱글톤이므로, 보통 스프링 컨테이너 생성 시점에 함께 생성되고, 의존관계 주입도 발생한다.
싱글톤에서 프로토타입 빈 사용2 클라이언트 A는 clientBean 을 스프링 컨테이너에 요청해서 받는다.싱글톤이므로 항상 같은 clientBean 이 반환된다.
싱글톤에서 프로토타입 빈 사용3 (가장 어렵다...) 클라이언트 B는 clientBean 을 스프링 컨테이너에 요청해서 받는다.싱글톤이므로 항상 같은 clientBean 이 반환된다. 여기서 중요한 점이 있는데, clientBean이 내부에 가지고 있는 프로토타입 빈은 이미 과거에 주입이 끝난 빈이다. 주입 시점에 스프링 컨테이너에 요청해서 프로토타입 빈이 새로 생성이 된 것이지, 사용 할 때마다 새로 생성되는 것이 아니다!
무식하게 logic() 안에 applicationContext로 주입을 받아 사용하면 값은 2가 아닌 1이 된다.
여러 빈에서 같은 프로토타입 빈을 주입 받으면, 주입 받는 시점에 각각 새로운 프로토타입 빈이 생성된다. 예를 들어서 clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.
clientA prototypeBean@x01 clientB prototypeBean@x02 결국 프로토타입 빈을 사용하는 것은 사용할때 마다 새로 생성해서 사용할려고 하는 것이다. 이와 같은 문제를 아래 강의 회차에서 다룬다.
프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
ObjectFactory, ObjectProvider 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider 이다. ObjectFactory가 있지만 getObject 기능만 제공되어 따로 실습할 필요는 없다.
JSR-330 Provider: 자바 표준 (스프링에 의존하지 않는 기능)
특징
정리
강의명 : 스프링 핵심 원리 수강회차 <의존관계 자동 주입>
<빈 생명주기 콜백>
요약
동적으로 빈을 선택하여 서비스를 수행하고 싶을 때 빈을 모두 스프링 컨테이너에 저장하고 따로 Map 형태로도 저장하여 동적으로 선택해서 사용하면 된다
자동으로 빈을 등록하는 경우 : 대체로 자동으로 빈을 등록하는 것을 우선으로 한다
수동으로 빈을 등록하는 경우는 애플리케이션의 기술 지원 빈 즉 기술적인 문제나 공통 관심사를 처리할 때 주로 사용된다
또한 다형성을 활용하는 비즈니스 로직은 수동 빈을 사용하는 경우 한 눈에 알아볼 수 있어서 유지보수에 좋다
스프링 빈의 이벤트 라이프사이클은 아래와 같다 스프링 컨테이너 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
스프링 컨테이너를 생성하고 의존관계를 주입한 후 초기화 메서드를 사용하고 싶을때, 객체 빈이 소멸 직전에 부를 메서드를 사용하고 싶을 때 스프링에서 지원하는 콜백이 있다
인터페이스 형식은 이제 사용하지 않고 주로 @PostConstruct, @PreDestory 를 메서드 위에 선언하여 사용하는 편이다
단 외부라이브러리를 사용할 경우에는 @Bean(initMethod='') 형식을 사용한다
HTTP 완벽가이드 란 책을 읽으며, 메모하는 글 입니다.
전 세계의 웹브라우저, 서버, 웹 애플리케이션은 모두 HTTP(Hypertext Transfer procol)를 통해 대화한다.
HTTP는 신뢰성있는 데이터 전송 프로토콜을 사용하기 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되거나 꼬이지 않음을
보장한다.
1.2 웹 클라이언트 서버
웹 콘텐츠는 웹서버에 존재하고, 웹 서버는 HTTP 프로토콜로 의사소통하기 때문에 보통 HTTP 서버라고 불린다.
클라이언트는 서버에게 HTTP 요청을 보내고 서버는 요청된 데이터를 HTTP 응답으로 돌려준다.
1.3 리소스
웹 서버는 웹 리소스르 관리하고 제공한다.
리소스는 웹 콘텐츠의 원천이며, HTML을 포함하여 모든 구분할 수 있는 데이터를 의미한다.
(반드시 정적 파일일 필요는 없으며, 요청에 따라 콘텐츠를 생산하는 프로그램이 될 수도 있다.)
1.3.1 미디어 타입
인터넷은 수천가지의 데이터 타입을 다루기 때문에, HTTP는 웹에서 전송되는 객체 각각에 MIME 타입이라는 데이터 포맷 라벨을 붙인다. (Multipurpose Internet Mail Extensions)
MIME 타입은 사선(/)으로 구분된 주 타입과 부 타입으로 이루어진 문자열 라벨이다.
e.g. HTML => text/html 라벨이 붙는다.
JPEG 이미지는 image/jpeg가 붙는다.
GIF 이미지는 image/gif가 된다.
1.3.2 URI
1.3.3 URL
URIL은 특정 서버의 한 리소스에 대해 구체적인 위치를 서술한다.
오늘날의 대부분의 URI는 URL이다.
1.3.4 URN
유니폼 리소스의 이름으로, URN은 콘텐츠를 이루는 한 리소스에 대해 그 리소스의 영향을 받지 않는 유일무이한 이름 역할을 한다.
아직널리 채택되지 않음.
1.4 트랜잭션
1.4.1 메서드
HTTP는 HTTP 메서드라고 불리는 여러가지 종류의 요청 명령을 지원한다. 모든 HTTP 요청 메세지는 한 개의 메서드를 갖는다.
널리 쓰이는 메서드로는 GET / PUT / DELETE / POST / HEAD 가 있다.
1.4.2 상태코드
1XX : 요청이 수신되어 처리중
2XX : 요청 정상 처리
3XX : 요청을 완료하려면 추가 행동이 필요
4XX : 클라이언트 오류
5XX : 서버오류, 서버가 정상 요청을 처리하지 못함
1.4.3 웹페이지는 여러 객체로 이루어질 수 있다.
웹 페이지를 구성하기 위해, 여러 서버에 데이터를 요청할 수 있다. (웹 페이지는 보통 하나의 리소스가 아닌 리소스의 모음이다.)
웹 페이지는 첨부된 리소스들에 대해 각자 별개의 HTTP 트랜잭션을 필요로한다. ( = 리소스 별로 HTTP 트랜잭션이 발생)
1.5 메세지
1.6 TCP 커넥션
인터넷 자체가 대중적으로 TCP / IP에 기초하고 있다.
TCP / IP는 패킷 교환 네트워크 프로토콜의 집합이다.
TCP / IP는 각 네트워크와 하드웨어의 특성을 숨시고, 어떤 종류의 컴퓨터나 네트워크든 서로 신뢰성 있는 의사소통을 하게 해 준다.
TCP의 특징 ( 오류없는 데이터 전송 / 순서에 맞는 전달(보낸순서대로 도착) / 조각나지 않는 데이터 스트림(언제 어떤 크기로든 전송O))
1.6.2 접속 / IP / 주소 그리고 포트번호
HTTP 클라이언트가 서버에 메세지를 전송할 수 있게 되기 전에, 인터넷 프로토콜 주소와 포트번호를 사용해 클라이언트와 서버사이에 TCP / IP 커넥션을 맺어야 한다.
HTTP URL에 포트번호가 없는 경우 기본값 80을 가정한다.
스프링 빈 조회
빈 조회라고 해서 잘 안 와닿았는데 복붙으로만 사용했던 부분에 대한 설명이었다. 자바와 스프링을 동시에 배웠을 때 왜 이것과 저것이 매칭되어서 작동하는 것인지 모르고 썼었는데, 실무에서 쓸 때 생각하면서 써보도록 할 수 있을 것 같다.
강의명 : 스프링 MVC 1편 수강회차 : 스프링 MVC 섹션 0~1 / 웹 어플리케이션의 이해
내용
웹 시스템 구성
WAS는 정적리소스, 어플리케이션 로직 모두 제공, WAS가 너무 많은 역할을 담당, 서버 과부하 우려
가장 비싼 어플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있음
WAS 장애시 오류 화면도 노출 불가능
정적 리소스는 웹서버가 처리
웹서버는 어플리케이션 로직 같은 동적인 처리가 필요하면 WAS에 요청을 위임
WAS는 중요한 어플리케이션 로직 처리 전담
또한 효율적인 리소스 관리, 정적리소스가 많아지면 웹 서버 증설, 어플리케이션 리소스가 많이 사용되면 WAS 증설
WEB 서버는 잘 죽지 않아서 1번처럼 WAS 장애가 떴을 때 WEB으로도 처리 가능
서블릿 : 비즈니스 로직 실행이라는 가장 중요한 로직을 제외한 거의 모든 HTTP처리 업무를 지원
서블릿 컨테이너 : WAS안에는 서블릿 컨테이너가 있는데 이는 객체 생성, 호출, 관리까지 해준다.
bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70
bean = class hello.core.AppConfig
- 이 출력 결과를 통해서 AppConfig가 CGLIB 기술 없이 순수한 AppConfig로 스프링 빈에 등록된 것을 확인할 수 있다
- 당연히 인스턴스가 같은지 테스트 하는 코드도 실패하고, 각각 다 다른 MemoryMemberRepository 인 스턴스를 가지고 있다
개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
@Test
: 테스트할 메소드를 지정하는 어노테이션Assertions.assertEquals(expected, actual);
Assertions.assertThat(actual).isEqualTo(expected);
CMD + P
: 사용 가능한 파라미터 타입 확인
@AfterEach
: 각 메소드가 끝날 때마다 실행되는 메소드를 지정하는 어노테이션
강의명: 스프링 핵심원리 기본 수강날짜: 7.24 수강회차: 빈 생명주기 콜백 시작 ~ 프로토타입 스코프
빈 생명주기 콜백 시작
스프링 빈은 간단하게 아래와 같은 라이프사이클이 돈다. 객체 생성 -> 의존관계 주입
스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입(수정자, 필드 주입) -> 초기화 콜백(의존관계 끝) -> 사용 -> 소멸전 콜백 -> 스프링 종료
참고: 객체의 생성과 초기화를 분리하자. 단일 책임원칙으로 객체를 생성할 때는 정말 생성에 집중을 해야 한다. 메모리 할당까지 세팅을 완료해야 한다.
스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.
인터페이스 InitializingBean, DisposableBean
초기화, 소멸 인터페이스 단점
빈 등록 초기화, 소멸 메서드 설정 정보 사용 특징
코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
종료 메서드 추론
애노테이션 @PostConstruct, @PreDestory
정리
빈 스코프 빈 스코프란? 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.
스프링은 다음과 같은 다양한 스코프를 지원
프로토타입 스코프
프로토타입 빈 요청1
정리
핵심은 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다는 것이다.
클라이언트에 빈을 반환하고, 이후 스프링 컨테이너는 생성된 프로토타입 빈을 관리하지 않는다.
프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다.
그래서 @PreDestory 같은 종료 메서드가 호출되지 않는다.
싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행 되지만, 프로토타입 스코프의 빈은 스프링 컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행된다.
프로토타입 빈을 2번 조회했으므로 완전히 다른 스프링 빈이 생성되고, 초기화도 2번 실행된 것을 확인할 수 있다.
싱글톤 빈은 스프링 컨테이너가 관리하기 때문에 스프링 컨테이너가 종료될 때 빈의 종료 메서드가 실행되지만, 프로토타입 빈은 스프링 컨테이너가 생성과 의존관계 주입 그리고 초기화 까지만 관여하고, 더는 관리하지 않는다.
따라서 프로토타입 빈은 스프링 컨테이너가 종료될 때 @PreDestory 같은 종료 메서드가 전혀 실행되지 않는다.
만약에 호출해줄려면 적절하게 다 작성하고 destroy() 를 직접 호출을 해주고 close()해주어야 한다.
프로토타입 빈의 특징 정리