🏃‍♀️
Today I Learned
  • Today I Learned
  • algorithm
    • Binary Search (이진 탐색)
    • Brute Force Search (완전탐색)
    • DFS와 BFS
    • Dijkstra Algorithm (다익스트라 알고리즘)
    • Dynamic Programming (동적 계획법)
    • Floyd-Warshall Algorithm (플로이드-워셜 알고리즘)
    • Greedy
    • 정렬 알고리즘(Sorting Algorithm)
  • data-structure
    • Array, List, LinkedList
    • Graph vs Tree
    • Hash, Map, HashMap
    • Heap
    • Stack, Queue (스택, 큐)
  • database
    • Database Lock
    • Execution Plan
    • Index
    • Join Algorithm
    • MySQL 사용자 권한부여
    • Normalization (정규화)
    • Row-Oriented vs Column-Oriented
    • Transaction
    • 트랜잭션 격리 수준 (Transaction Isolation Level)
    • VARCHAR의 길이제한
  • 디자인 패턴의 종류
    • Abstract Factory Pattern
    • Adapter Pattern
    • Bridge Pattern
    • Builder Pattern
    • Chain of Responsibility Pattern
    • Class Diagram
    • Command Pattern
    • Composite Pattern
    • Decorator Pattern
    • Facade Pattern
    • Factory Method Pattern (팩토리 메소드 패턴)
    • Flyweight Pattern
    • Iterator Pattern
    • Mediator Pattern
    • Memento Pattern
    • Observer Pattern
    • Prototype Pattern
    • Proxy Pattern
    • SOLID
    • Singleton Pattern
    • State Pattern
    • Strategy Pattern
    • Template Method
    • UML
    • 객체지향_패러다임
  • docker
    • Docker
    • Docker Network
  • etc
    • Block vs Non-block, Sync vs Async
  • git
    • Git Merge vs Git Rebase
    • 자주 사용하는 Git 명령어 모음
  • java
    • Annotation
    • Exception Handling (예외 처리)
    • Generic
    • JVM
    • Java 코드의 실행 과정
    • Lambda Expression
    • Object Class
    • Optional
    • Primitive Type & Reference Type
    • Reflection
    • Serialize And Deserialize
    • Stream
    • String, StringBuilder, StringBuffer
    • Tiles
    • Type Casting
    • 왜 Java의 정렬 함수 sort()는 static 메소드일까?
    • 추상클래스와 인터페이스의 차이
    • effective-java
      • Item 1. 생성자 대신 정적 팩토리 메서드를 고려하라
      • Item 10. equals는 일반 규약을 지켜 재정의(오버라이딩)하라
      • Item 11. equals를 오버라이딩할 거면 hashCode도 오버라이딩하라
      • Item 12. toString은 항상 오버라이딩하라
      • Item 13. clone 오버라이딩은 주의해서 진행하라
      • Item 14. Comparable을 구현할지 고려하라
      • Item 15. 클래스와 멤버의 접근 권한을 최소화하라
      • Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
      • Item 17. 변경 가능성을 최소화하라
      • Item 18. 상속 대신 컴포지션을 사용하라
      • Item 19. 상속을 고려해 설계하고 문서화하라. 그렇지 않았다면 상속을 금지하라
      • Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라
      • Item 20. 추상 클래스보다는 인터페이스를 우선하라
      • Item 21. 인터페이스는 구현하는 쪽을 생각해 설계
      • Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라
      • 태그 달린 클래스보다는 클래스 계층구조를 활용
      • Item 24. 멤버 클래스는 되도록 static으로 만들라
      • Top Level Class는 한 파일 당 하나만 선언하라
      • Item 26. 로우 타입(raw type)은 사용하지 말라
      • Item 27. 비검사 경고를 제거하라
      • Item 28. 배열보다는 리스트를 사용하라
      • Item 29. 이왕이면 제네릭 타입으로(클래스로) 만들라
      • Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
      • Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
      • Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
      • Item 6. 불필요한 객체 생성을 피하라
      • Item 7. 다 쓴 객체 참조를 해제하라
      • Item 8. finalizer와 cleaner의 사용을 피하라
      • Item 9. try-finally보다는 try-with-resources를 사용하라
  • linux
    • Linux의 Permission
  • network
    • OSI 7 Layer
    • Subnet
    • 그림으로_배우는_http_&_network_basic
  • python
    • 파이썬의 재귀 제한(Recursion Limit)
  • server
    • CI & CD
    • Cache
    • Cloud Service
    • REST API
    • 정적 서버(Web Server)와 동적 서버(Web Application Server, WAS)
  • spring
    • Configuration
    • @RequestParam, @RequestBody, @ModelAttribute
    • AOP (Aspect Oriented Programming)
    • 의존성 자동 주입
    • Bean Scope (빈의 유효 범위)
    • [Error] Bean could not be injected because it is a JDK dynamic proxy
    • Component Scan
    • 🐱‍👤 Component vs Bean
    • 여러 개의 @Configuration(설정 파일)을 사용하는 방법
    • DI (Dependency Injection, 의존성 주입)
    • Filter, Interceptor, (Spring) AOP
    • IoC Container
    • Nested Class의 Bean 등록
    • Profile
    • Properties
    • Spring Bean의 생명주기(life-cycle)
    • Spring vs Spring Boot
    • Thymeleaf
    • jpa
      • Dirty Checking
      • JPA의 Fetch 전략
      • JPA N+1 Problem
    • spring-boot
      • Spring Web Layer (스프링 웹 계층)
      • Spring Boot
    • spring-mvc
      • Argument Resolver
      • Filter
      • Interceptor
      • RestController
      • Validator
      • Exception Handling
      • Spring MVC
    • spring-security
      • Spring Security
  • testing
    • Test Double (테스트 더블)
    • 화이트박스 테스트, 블랙박스 테스트
  • web
    • Browser Caching
    • CORS
    • HTTP Header
    • HTTP와_HTTPS
    • 🛡️OAuth
    • PRG Pattern
    • Query Parameter, Path Variable
    • 🟢🟡🔴 Status Code (상태 코드)
    • WebSocket
    • application/octet-stream
    • Cookie-Session
    • JWT
    • multipart/form-data
Powered by GitBook
On this page
  • 빈 스코프
  • Singleton
  • Prototype
  • Request
  • Session
  • Application
  • 관리 범위 지정
  • 빈 스코프가 중요한 이유
  1. spring

Bean Scope (빈의 유효 범위)

빈 스코프

스코프란, 유효 범위를 뜻한다. 빈 스코프를 달리함으로써 빈의 생성, 사용, 소멸 시점을 달리할 수 있다. 빈 스코프는 다음의 5종류가 있다.

  1. Singleton (기본)

  2. Prototype

  3. Request

  4. Session

  5. Application

Singleton

싱글톤이란, 클래스의 인스턴스가 단 하나만 생성되도록 하는 디자인 패턴을 말한다.

스프링 컨테이너 내부의 빈들은 기본적으로 싱글톤으로 관리된다. 즉, 한 번만 생성되고 이것을 getBean을 통해 여러 곳에서 주입받아 이용하는 방식으로 운영된다.

Singleton의 경우 빈의 생성 주기는 다음을 따른다.

  1. 스프링 컨테이너 생성

  2. 빈 등록 및 의존성 주입

  3. 초기화 콜백

  4. 빈 사용

  5. 소멸 전 콜백

  6. 빈 소멸

  7. 스프링 컨테이너 소멸

즉, 스프링 컨테이너가 생성된 직후 빈도 생성되고, 스프링 컨테이너가 소멸되기 직전 빈도 소멸된다.

Prototype

빈 스코프를 프로토타입으로 지정하면 getBean 메서드를 호출할 때마다 새로운 객체를 생성하여 반환한다.

즉, 스프링 컨테이너는 빈의 생성 및 등록까지만 관여하고 이후의 생명주기에는 관여하지 않는다.

유일하게 스프링 컨테이너가 소멸 시점을 관리해주지 않는 스코프 타입인 것이다.

따라서, 빈 스코프를 프로토타입으로 지정하는 경우 스프링 컨테이너의 소멸 시점에 함께 소멸되지 않기 때문에 개발자가 소멸 시점을 관리해야 함에 주의해야 한다.

Request

빈 스코프를 Request로 지정하면 HTTP 요청이 컨트롤러에 도착할 때 빈이 생성되고 HTTP 응답이 반환될 때 빈이 소멸한다.

Session

빈 스코프를 Session으로 지정하면 웹 세션이 생성될 때 빈이 생성되고 웹 세션이 종료될 때 빈이 소멸한다.

Application

빈 스코프를 Application으로 지정하면 웹 서블릿 컨텍스트가 생성될 때 빈이 생성되고 소멸할 때 빈이 소멸한다.

관리 범위 지정

@Scope 어노테이션을을 이용하면 된다.

@Bean
@Scope("singleton") // default

@Bean
@Scope("prototype") // prototype

빈 스코프가 중요한 이유

빈 스코프에 따라 빈의 생성, 소멸 시점이 달라진다.

빈의 생성/소멸 시점을 확실하게 알면 해당 시점에 호출되는 콜백 함수를 통해 특정 로직(ex: Logging)을 수행할 수 있다.

Previous의존성 자동 주입Next[Error] Bean could not be injected because it is a JDK dynamic proxy

Last updated 2 years ago