본문 바로가기
Everyday Study

2024.08.15(목) { ( @component,@Bean,@Autowired ), 커밋, Thread Context }

by xogns93 2024. 8. 15.

@Component와 @Bean의 차이점

  1. 등록 방식:
    • @Component: Spring의 컴포넌트 스캔에 의해 자동으로 빈이 등록됩니다. 즉, @Component 어노테이션이 붙은 클래스는 Spring이 자동으로 인스턴스를 생성하고, 이를 컨테이너에 등록합니다.
    • @Bean: 개발자가 직접 빈을 등록하기 위해 사용하는 어노테이션입니다. @Bean은 주로 @Configuration클래스 내의 메서드에 사용되며, 해당 메서드가 반환하는 객체를 Spring 컨테이너에 빈으로 등록합니다.
  2. 사용 위치:
    • @Component: 클래스 레벨에서 사용됩니다.
    • @Bean: 메서드 레벨에서 사용됩니다.
  3. 유연성:
    • @Component: 기본적으로 설정 없이 자동으로 빈을 등록하는데 유리합니다. 특정 패키지 내의 클래스를 자동으로 스캔하고 빈으로 등록할 때 사용됩니다.
    • @Bean: 복잡한 빈의 초기화나 구성이 필요한 경우 유용합니다. @Bean 메서드 내에서 조건에 따라 다른 객체를 반환하거나, 인스턴스를 생성하기 전에 추가적인 설정을 수행할 수 있습니다.

 

@Autowired와 @Component/@Bean의 차이점

  1. 역할:
    • @Autowired: 이미 등록된 빈을 다른 빈에 주입할 때 사용됩니다. @Component나 @Bean으로 등록된 빈이 다른 클래스에서 필요할 때, 해당 클래스의 필드, 생성자, 또는 메서드에 @Autowired를 사용해 의존성을 주입합니다.
    • @Component/@Bean: 빈을 Spring 컨테이너에 등록하는 역할을 합니다.
  2. 사용 위치:
    • @Autowired: 필드, 생성자, 또는 메서드에 사용됩니다.
    • @Component: 클래스 레벨에서 사용됩니다.
    • @Bean: 메서드 레벨에서 사용됩니다.
  3. 빈 주입:
    • @Autowired: Spring이 적절한 타입의 빈을 찾아서 자동으로 주입합니다.
    • @Component/@Bean: Spring 컨테이너에 빈을 등록하는 어노테이션입니다. 주입은 @Autowired를 통해 이루어집니다.

  • Property: 객체의 상태나 속성을 나타내는 변수로, getter와 setter 메서드를 통해 접근할 수 있는 인스턴스 변수입니다.
  • Properties: Java에서 설정 값을 관리하기 위해 키-값 쌍으로 데이터를 저장하는 클래스로, 주로 .properties파일 형태로 설정 정보를 외부 파일에 저장하여 사용할 수 있습니다.

JDBC API와 DataSource

JDBC API는 Java에서 데이터베이스와 상호작용하기 위해 제공되는 표준 인터페이스입니다. 이 API는 데이터베이스 연결을 열고, SQL 쿼리를 실행하며, 결과를 처리하는 데 필요한 다양한 인터페이스와 클래스를 제공합니다. JDBC API의 대부분은 인터페이스로 정의되어 있으며, 실제 구현은 데이터베이스 벤더(예: MySQL, Oracle 등)에서 제공하는 JDBC 드라이버에 의해 이루어집니다.

DataSource는 JDBC API의 일부로, 데이터베이스에 연결을 제공하는 인터페이스입니다. DataSource는 더 나은 연결 관리 및 성능을 위해 DriverManager를 대체할 수 있는 대안으로 자주 사용됩니다.

DriverManager와 DataSource의 차이점

  1. DriverManager:
    • 역할: JDBC 드라이버를 관리하고 데이터베이스 연결을 얻기 위해 사용되는 클래스입니다. DriverManager는 JDBC 1.0부터 사용된 전통적인 방법으로, 정적 메서드 getConnection()을 통해 데이터베이스 연결을 설정합니다.
Connection connection = 
    DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");

   

   2. DataSource:

  • 역할: JDBC 2.0부터 도입된 DataSource는 데이터베이스 연결을 얻기 위한 표준 인터페이스입니다. DataSource는 특히 커넥션 풀링, 트랜잭션 관리, JNDI(Java Naming and Directory Interface)와의 통합 등의 기능을 제공하는 경우에 더 유리합니다.
  • 장점: DataSource를 사용하면 데이터베이스 연결을 효율적으로 관리할 수 있으며, 애플리케이션 서버나 컨테이너에서 관리되는 경우 커넥션 풀링 등을 활용할 수 있습니다.
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("jdbc/myDataSource");
Connection connection = dataSource.getConnection();

정리

  • JDBC API: Java 애플리케이션에서 데이터베이스와 상호작용하기 위한 표준 인터페이스 집합입니다. 대부분의 JDBC API는 인터페이스로 정의되어 있으며, 구체적인 구현은 데이터베이스 드라이버가 제공합니다.
  • DriverManager: JDBC API의 초기 버전에서 데이터베이스 연결을 설정하기 위해 사용되는 클래스입니다. 주로 정적 메서드로 연결을 관리합니다.
  • DataSource: JDBC 2.0에서 도입된 인터페이스로, 데이터베이스 연결을 더 효율적으로 관리할 수 있는 방법을 제공합니다. 특히 커넥션 풀링을 지원하여 성능을 향상시킬 수 있습니다.

따라서, JDBC API는 데이터베이스와의 상호작용을 위한 인터페이스로서, DriverManager DataSource는 그 API를 통해 데이터베이스 연결을 관리하는 두 가지 방법입니다. DriverManager는 전통적인 방법이고, DataSource는 더 현대적인 방법으로, 커넥션 풀링 등 다양한 기능을 제공합니다.

 


  • 데이터베이스에서 테이블은 논리적으로 데이터를 조직화한 구조로, 실제 데이터는 파일로 저장됩니다.
  • 데이터베이스는 데이터를 관리하고 저장하기 위해 운영체제의 파일 시스템을 사용합니다.
  • 데이터베이스의 데이터, 인덱스, 로그 등은 모두 파일 형태로 운영체제의 파일 시스템에 저장되며, 파일 시스템이 이들을 물리적으로 관리합니다.

따라서 데이터베이스는 OS의 파일 시스템을 사용하여 데이터를 저장하고 관리하는 시스템이며, 테이블과 같은 논리적 구조를 통해 데이터를 조직적으로 관리합니다.

 

테이블 = 파일로 관리한다

데이터베이스도 결국 os의 파일시스템 쓴다


커밋(Commit)이란?

**커밋(commit)**은 데이터베이스 트랜잭션의 개념 중 하나로, 특정 트랜잭션 내에서 수행된 모든 변경 사항을 데이터베이스에 영구적으로 저장하는 작업을 말합니다. 커밋이 발생하면 트랜잭션 내에서 이루어진 모든 변경이 데이터베이스에 반영되며, 이 상태는 영구적입니다. 이후에 발생하는 시스템 장애나 다른 트랜잭션의 영향을 받지 않습니다.

커밋의 특징

  1. 영구성(Durability):
    • 커밋된 데이터는 데이터베이스에 영구적으로 저장됩니다. 즉, 커밋 후에는 데이터베이스에 대한 모든 변경 사항이 반영되고, 이후 시스템이 재부팅되거나 충돌이 발생하더라도 이 변경 사항은 유지됩니다. 이 특징은 ACID 트랜잭션 속성 중 하나인 영구성을 보장합니다.
  2. 트랜잭션 경계:
    • 커밋은 하나의 트랜잭션을 종료하는 신호로, 그 시점까지 수행된 모든 작업을 확정합니다. 반대로, 트랜잭션 내에서 문제가 발생하여 변경 사항을 되돌려야 할 경우 **롤백(rollback)**을 사용하여 트랜잭션 내의 모든 작업을 취소할 수 있습니다.
  3. 공유 및 가시성:
    • 커밋이 이루어지면 해당 트랜잭션 내의 변경 사항이 다른 사용자나 트랜잭션에서도 보이게 됩니다. 즉, 커밋 전까지는 해당 변경 사항이 트랜잭션을 수행한 사용자에게만 보일 수 있으며, 커밋 후에는 모든 사용자에게 노출됩니다.

Thread와 Thread Context

  1. Thread (스레드):
    • 정의: 스레드는 프로그램 내에서 실행되는 가장 작은 단위로, 소프트웨어의 실행 주체입니다. 하나의 프로세스는 여러 스레드를 가질 수 있으며, 각 스레드는 독립적으로 실행됩니다.
    • 역할: 스레드는 CPU가 실제로 명령어를 실행하는 단위입니다. 프로세스가 실행되면, 이 프로세스의 작업은 하나 이상의 스레드로 나뉘어 실행됩니다. 각 스레드는 자신만의 스택, 프로그램 카운터(PC), 레지스터 등을 가지고 있어 독립적으로 동작할 수 있습니다.
  2. Thread Context (스레드 컨텍스트):
    • 정의: 스레드 컨텍스트는 스레드가 실행되는 동안 필요한 모든 상태 정보를 말합니다. 여기에는 레지스터 값, 프로그램 카운터, 스택 포인터, 스레드 상태 등이 포함됩니다.
    • 역할: 스레드가 CPU에서 실행되다가 다른 스레드로 전환될 때, 현재 스레드의 상태를 저장하고 새로 실행될 스레드의 상태를 복구해야 합니다. 이 작업을 **컨텍스트 스위칭(Context Switching)**이라고 합니다. 컨텍스트 스위칭은 스레드 간의 전환을 매끄럽게 수행할 수 있도록 합니다.
  3. CPU 명령어 실행과 스레드:
    • CPU 명령어: CPU는 스레드에 의해 수행되는 명령어를 처리합니다. 스레드는 CPU가 실행해야 할 일련의 명령어를 포함하고 있으며, CPU는 스레드가 지시하는 작업을 수행합니다.
    • 스레드와 CPU: 한 번에 여러 스레드가 존재할 수 있지만, CPU는 한 번에 하나의 스레드만을 실행할 수 있습니다. 멀티코어 시스템에서는 여러 CPU 코어가 각각의 스레드를 병렬로 실행할 수 있습니다.