spring-god-study / spring-basic

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

2021.07.26 (월) 인증 #24

Open kyupid opened 3 years ago

arangeblue commented 3 years ago

강의명 : 스프링 MVC 1편 수강회차 : 스프링 MVC 섹션 1 마무리

내용

멀티쓰레드

  1. 쓰레드
    • 어플리케이션 코드를 하나 하나 순차적으로 실행하는 것은 쓰레드
    • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
    • 쓰레드가 없다면 자바 어플리케이션 실행이 불가
    • 쓰레드는 한번에 하나의 코드 라인만 수행
    • 동시 처리가 필요하면 쓰레드를 추가로 생성

이슈

장점

단점

  1. 쓰레드 풀
    : 쓰레드 풀에 미리 쓰레드를 담아두고 요청이 올 때마다 제공해주고 다 쓴 쓰레드는 다시 풀에 반환하게 하는 것 쓰레드 풀보다 많은 요청이 왔을 때, 거절 또는 대기를 할 수 있다. 즉 서버가 죽는 것을 막을 수 있음

특징

사용

장점

실무 팁

쓰레드 풀의 적정 수

WAS의 멀티 쓰레드 지원

narafu commented 3 years ago

스프링 기본편 섹션 4. 스프링 컨테이너와 스프링 빈

수강완료

//

<이번 주 수강계획> 화 : 섹션5, 6 수 : 섹션7 목 : 섹션8, 9 금 : 섹션10

char-yb commented 3 years ago

강의명: 스프링 핵심원리 기본편 수강회차: 웹 스코프 ~ 스코프와 프록시

웹 스코프

웹 스코프 종류

먼저 클라이언트 A가 요청을 한다. 컨트롤러에서 뭔가 request와 관련된 스코프를 조회한다. 로깅을 가져온다고 가정하면 공통 로그를 가져오면 A 클라이언트 전용으로 객체가 생성된다. 서비스 객체에서 로그를 또 조회한다. 그러면 http request가 같으면 같은 인스턴스를 바라보게 된다.

클라이언트 B가 동시에 들어온다고 가정한다. 클라이언트 B니까 스프링이 다른 요청이라고 생각해서 완전 별도의 http request 관련된 로거를 가지는 빈 객체를 생성해준다. B의 요청이 서비스까지 넘어가면 서비스 로직에서 스코프를 조회하면 이미 만들어 놓은 걸 반환해준다.

결론은 http request에 맞춰서 각각 할당된다. 정리하면 클라이언트A가 요청을 하면 A전용 스프링 빈이 만들어지고 운영되다가 A가 요청이 나가면 destroy가 된다. B가 요청을 하면 B전용이 생성이 되서 운영이 되다가 http request가 들어오면 동시에 request스코프를 파괴한다.

request 스코프 예제 만들기 spring-boot-starter-web 라이브러리를 추가하면 스프링 부트는 내장 톰켓 서버를 활용해서 웹 서버와 스프링을 함께 실행시킨다. 스프링 부트는 웹 라이브러리가 없으면 우리가 지금까지 학습한 AnnotationConfigApplicationContext 을 기반으로 애플리케이션을 구동한다. 웹 라이브러리가 추가되면 웹과 관련된 추가 설정과 환경들이 필요하므로 AnnotationConfigServletWebServerApplicationContext 를 기반으로 애플리케이션을 구동한다.

request 스코프

여기서 중요한 점!

스코프와 Provider 위 코드의 에러를 해결하기 위한 첫 번째 해결 방법은 Provider를 사용하는 것이다. ObjectProvider 덕분에 ObjectProvider.getObject() 를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다. ObjectProvider.getObject() 를 호출하시는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다. ObjectProvider.getObject() 자체를 LogDemoController , LogDemoService 에서 각각 한번씩 따로 호출해도(=ObjectProvider DL를 하는데) 같은 HTTP 요청이면 같은 스프링 빈이 반환된다!

스코프와 프록시 proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해준다.

CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다.

특징 정리

주의점 하기 전, 중급편에서 다룰 AOP가 다 이렇게 돌아간다. 가짜를 만들고 돌아간다. 여기서 중요한 점은 클라이언트의 코드를 고치지는 않는다. 스프링 컨테이너가 가진 큰 장점이다. 전체 고객 요청 당 어떤 URL이 들어와 몇초씩 걸리는 지 다 찍고싶으면 AOP와 프록시 기술을 사용하면 정말 쉬워진다고 한다.

주의점

kyupid commented 3 years ago

회원 도메인 설계의 문제점

다른 저장소로 변경할 때 OCP 원칙? DIP를 잘 지키고 있을까? 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음 라는 말이 무슨 말일까.. 잘 와닿지 않는다. 김영한 - 스프링 기본 https://github.com/kyupid/core

dnjsrud3407 commented 3 years ago

강의명 : 스프링 핵심 원리 강의 회차 <빈 스코프>

요약

kimminju commented 3 years ago

2021.07.27 섹션2

  1. grade(enum)
    • basic, vip
  2. 회원 entity 1) id(Long), name(String), grade(Grade) 2) 생성자 ( getter/setter/생성자 자동완성 (Generate))
    • 단축키 : MacOS(Cmd + n) / Win/Linux(Alt + Insert)
    • 클래스 소스 내에서 마우스 우측 버튼 클릭 -> generate 를 클릭하면 해당 클래스의 필드 변수를 기준으로 getter/setter/생성자(Constructor)들을 자동으로 만들 수 있음
  3. 인터페이스 MemberRepository
    1) 저장(save) 2) 회원id찾기(findById)
  4. 구현체 MemoryMemberRepository
    • hashMap 동시성 이슈떄문에 실무에서는 ConcurrentHashMap로 쓴다
  5. 인터페이스 MemberService 1) 회원가입(join) 2) 회원조회(findMember)
  6. 구현체 MemberServiceImpl
  7. MemberApp 1) window 기준 ) psvm + ctrl + space -> 메인메소드 생성 2) window 기준 ) soutv + ctrl + space -> system.out.println
  8. 회원도메인 설계의 문제점
    • 다른 저장소로 변경할 때 OCP 원칙 잘지키나?
    • DIP를 잘 지키고 있을까?(추상화, 구체화 의존)
    • 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음
cxz5309 commented 3 years ago

6. 컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기

등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한 다. 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.

  1. @Configuration
  2. @Component
  3. @ComponentScan
    • @ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.
    • 이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
    • 빈 이름 기본 전략: MemberServiceImpl 클래스 memberServiceImpl
    • 빈 이름 직접 지정: 만약 스프링 빈의 이름을 직접 지정하고 싶으면 @Component("memberService2") 이런식으로 이름을 부여하면 된다
  4. @Autowired 의존관계 자동 주입
    • 생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
    • 이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다

탐색 위치와 기본 스캔 대상

탐색 위치

컴포넌트 스캔 기본 대상

컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.

필터

FilterType은 5가지 옵션이 있다.

  1. ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
    • ex) org.example.SomeAnnotation
  2. ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
    • ex) org.example.SomeClass
  3. ASPECTJ: AspectJ 패턴 사용
    • ex) org.example..*Service+
  4. REGEX: 정규 표현식
    • ex) org.example.Default.*
  5. CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
    • ex) org.example.MyTypeFilte

중복 등록과 충돌

  1. 자동 빈 등록 vs 자동 빈 등록
    • ConflictingBeanDefinitionException 예외 발생
  2. 자동 빈 등록 vs 수동 빈 등록
    • 수동 빈 등록이 우선권을 가진다.(수동 빈이 자동 빈을 오버라이딩)
    • -> 버그가 아닌데 버그인 더러운 버그 발생
    • 그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다!