[Spring] Spring Boot / Spring / Spring MVC, @Primary / @Qualifier, @Component / @Bean, Prototype / Singleton, @PostConstruct @PreDestroy, JDBC, Hibernate, JPA, Spring Data JPAWeb_Backend/Spring2024. 1. 25. 15:38
Table of Contents
Spring Boot vs Spring vs Spring MVC
Spring
- 개요:
- 자바 기반의 프레임워크로, 기업 환경에서 대규모 응용 프로그램을 개발하기 위한 종합적인 솔루션을 제공한다.
- 모듈화, DI (의존성 주입), AOP (관점 지향 프로그래밍) 등을 지원하여 유연하고 확장 가능한 애플리케이션을 만들 수 있다.
- Spring Framework 구성요소:
- Core Container: IoC 컨테이너, 빈 팩토리 등이 포함되어 있으며, DI를 지원한다.
- Data Access/Integration: JDBC, ORM 등 데이터 액세스 및 통합을 위한 모듈 제공.
- Web: 웹 애플리케이션 개발을 위한 모듈로 Spring MVC 포함.
- AOP (Aspect-Oriented Programming): 관점 지향 프로그래밍을 지원하는 모듈.
- Instrumentation: 클래스 로딩 및 변경을 위한 인스트루멘테이션 지원.
- Messaging: 메시지 기반의 애플리케이션을 구축하기 위한 모듈.
Spring MVC
- 개요:
- Spring에서 제공하는 웹 애플리케이션 개발을 위한 프레임워크.
- 모델-뷰-컨트롤러 (MVC) 아키텍처를 기반으로 한다.
- 특징:
- MVC 아키텍처: 모델(데이터), 뷰(사용자 인터페이스), 컨트롤러(로직 처리)를 분리하여 유지보수 및 확장성을 향상시킨다.
- HTTP 및 RESTful 지원: 다양한 HTTP 메서드 및 RESTful 웹 서비스를 구현할 수 있다.
- 빠른 개발 및 유연성: 애노테이션을 사용하여 간단한 설정으로 빠르게 웹 애플리케이션을 개발할 수 있다.
Spring Boot
- 개요:
- Spring 기반의 애플리케이션을 빠르게 개발하고 실행할 수 있도록 도와주는 프로젝트.
- 기본 설정이 자동화되어 있어 별도의 설정 없이도 간단한 명령어로 애플리케이션을 실행할 수 있다.
- 특징:
- 스타터 (Starter) 패키지: 특정 기술 스택을 사용하는 데 필요한 모든 종속성이 사전 구성된 패키지를 제공하여 개발자가 간편하게 프로젝트를 시작할 수 있다.
- 자동 구성 (Auto Configuration): 클래스패스 내에서 라이브러리를 감지하고 자동으로 설정하여 빠르게 개발할 수 있도록 도와준다.
- 장애 내구성 (Production-Ready): 기본적인 보안, 성능, 모니터링 등의 기능을 내장하여 생산 환경에 적합하게 만들어진다.
결론
- Spring: 기업 환경에서 다양한 기능을 제공하는 전체적인 프레임워크.
- Spring MVC: 웹 애플리케이션을 개발하기 위한 MVC 아키텍처를 제공하는 Spring의 모듈.
- Spring Boot: 높은 생산성을 제공하는 스타터 패키지와 자동 구성으로 Spring 기반 애플리케이션을 쉽게 개발하고 실행할 수 있게 도와주는 프로젝트.
자바 스프링 프레임워크를 통한 자바 객체 생성
@Primary vs @Qualifier
@Primary
- 목적:
- 여러 개의 빈(Bean) 중에서 주요한(primary) 빈을 지정하는 데 사용된다.
- 사용 시나리오:
- 여러 구현체 중에서 하나를 기본(primary)으로 선택하고자 할 때 사용된다.
- 사용 방법:
@Primary
어노테이션을 해당 빈의 클래스나 메서드에 적용한다.
- 예시:
@Component @Primary public class PrimaryBean implements MyInterface { // ... }
@Qualifier
- 목적:
- 특정한 빈을 주입할 때 어떤 빈을 사용할지 지정하는 데 사용된다.
- 사용 시나리오:
- 여러 개의 동일한 타입의 빈이 존재하고 특정 빈을 주입하고자 할 때 사용된다.
- 사용 방법:
@Qualifier
어노테이션을 주입 받는 필드, 생성자 매개변수, 또는 메서드 매개변수에 적용하고, 해당하는 빈의 이름을 지정한다.
- 예시:
@Component public class ConsumerBean { private final MyInterface myBean; @Autowired public ConsumerBean(@Qualifier("specificBean") MyInterface myBean) { this.myBean = myBean; } // ... }
결론
@Primary
은 여러 구현체 중에서 기본(primary)으로 사용할 빈을 지정하는 데에 사용된다.@Qualifier
는 여러 동일한 타입의 빈 중에서 특정한 빈을 주입할 때 사용된다.- 두 어노테이션은 함께 사용될 수도 있다.
@Primary
로 주요 빈을 지정하고,@Qualifier
를 통해 특정 빈을 명시적으로 선택할 수 있다.
@Component vs @Bean
@Component
- 목적:
- 클래스를 Spring의 빈으로 등록하기 위해 사용된다.
- 사용 시나리오:
- 주로 개발자가 작성한 클래스를 빈으로 등록하고자 할 때 사용된다.
- 사용 방법:
@Component
어노테이션을 클래스에 적용한다.
- 예시:
@Component public class MyComponent { // ... }
@Bean
- 목적:
- 메서드를 통해 직접 빈을 정의하고 등록하기 위해 사용된다.
- 사용 시나리오:
- 개발자가 직접 메서드를 통해 빈을 정의하고 구성하고자 할 때 사용된다.
- 사용 방법:
@Bean
어노테이션을 메서드에 적용한다. 해당 메서드가 반환하는 객체가 빈으로 등록된다.
- 예시:
@Configuration public class MyConfiguration { @Bean public MyBean myBean() { return new MyBean(); } }
공통점
- 둘 다 Spring에서 IoC 컨테이너에 빈을 등록하는 역할을 한다.
차이점
@Component
는 클래스에 적용되며, 해당 클래스의 객체가 빈으로 등록된다.@Bean
은 메서드에 적용되며, 메서드가 반환하는 객체가 빈으로 등록된다. 일반적으로@Configuration
어노테이션이 적용된 클래스에서 사용된다.
어떤 것을 사용해야 할까?
@Component
는 주로 외부 라이브러리나 프레임워크 등을 Spring 컨테이너에서 관리하고자 할 때 사용된다.@Bean
은 주로 개발자가 직접 작성한 클래스의 빈을 등록하고자 할 때 사용되며, 특히 Java 기반의 Configuration 클래스에서 자주 활용된다.
결론
@Component
는 클래스 수준에서 사용되며, 클래스를 빈으로 등록한다.@Bean
은 메서드 수준에서 사용되며, 메서드의 반환값을 빈으로 등록한다. 주로 Configuration 클래스에서 활용된다.
자바 스프링 프레임워크 고급 기능 알아보기
Prototype vs Singleton(스프링 프레임워크 Bean 유효 범위 비교)
Spring Framework에서 빈(Bean)의 유효 범위(scope)에는 주로 "prototype"과 "singleton"이라는 두 가지가 사용됨.
Prototype Scope
- 목적:
- 빈을 요청할 때마다 새로운 인스턴스를 생성하여 반환한다.
- 사용 시나리오:
- 매 요청마다 새로운 객체가 필요한 경우 사용된다.
- 상태를 가지고 있어서는 안 되거나, 상태를 공유하면 안 되는 경우에 유용하다.
- 설정 방법:
@Scope("prototype")
어노테이션을 클래스에 적용하거나 XML 설정에서<bean>
태그에scope="prototype"
을 추가한다.
@Component
@Scope("prototype")
public class MyPrototypeBean {
// ...
}
Singleton Scope
- 목적:
- 컨테이너 당 하나의 빈 인스턴스만 생성하고, 이를 계속해서 재사용한다.
- 사용 시나리오:
- 여러 곳에서 같은 객체를 공유해야 하는 경우 사용된다.
- 상태를 가진 빈을 사용하는 경우, 해당 상태를 여러 곳에서 공유해야 할 때 유용하다.
- 설정 방법:
- 기본적으로 스프링 빈은 싱글톤 스코프이기 때문에 별도의 설정이 필요하지 않다. 단, 명시적으로
@Scope("singleton")
을 사용할 수 있다.
- 기본적으로 스프링 빈은 싱글톤 스코프이기 때문에 별도의 설정이 필요하지 않다. 단, 명시적으로
@Component
public class MySingletonBean {
// ...
}
차이점
- 인스턴스 생성 방식:
- Prototype: 매 요청마다 새로운 인스턴스를 생성한다.
- Singleton: 컨테이너 당 하나의 인스턴스를 생성하고 재사용한다.
- 상태 관리:
- Prototype: 상태를 가지고 있을 수 있고, 여러 클라이언트 간에 상태가 공유되지 않는다.
- Singleton: 상태를 가질 수 있으며, 여러 클라이언트 간에 상태가 공유된다.
- 메모리 사용:
- Prototype: 매 요청마다 새로운 인스턴스를 생성하므로 메모리 사용이 높을 수 있다.
- Singleton: 하나의 인스턴스를 계속해서 재사용하므로 메모리 사용이 상대적으로 적다.
어떤 것을 사용해야 할까?
- 일반적으로는 Singleton을 사용하는 것이 권장됩니다. 상태를 가지는 빈이나 공유해야 하는 리소스가 있을 때 효과적이며, 메모리 사용을 절약할 수 있습니다.
- Prototype은 특별한 상황에서만 사용되어야 합니다. 예를 들어, 매 요청마다 완전히 새로운 객체가 필요한 경우에 사용됩니다. 다만, 이 경우 메모리 사용이 증가할 수 있으므로 주의가 필요합니다.
@PostConstruct
and @PreDestroy
@PostConstruct
- 목적:
- 빈이 초기화된 후에 실행할 메서드를 지정한다.
- 사용 시점:
- 빈이 생성된 후 초기화 작업을 수행해야 할 때 사용된다.
- 의존성 주입 후 초기화를 해야하는 경우 유용하다.
- 사용 방법:
@PostConstruct
어노테이션이 적용된 메서드를 선언한다.
- 예시:
@Component public class MyBean { @PostConstruct public void init() { // 초기화 작업 수행 } }
@PreDestroy
- 목적:
- 빈이 소멸되기 전에 실행할 메서드를 지정한다.
- 사용 시점:
- 빈이 소멸되기 직전에 정리 작업을 수행해야 할 때 사용된다.
- 사용 방법:
@PreDestroy
어노테이션이 적용된 메서드를 선언한다.
- 예시:
@Component public class MyBean { @PreDestroy public void cleanup() { // 정리 작업 수행 } }
결론
@PostConstruct
와@PreDestroy
어노테이션은 각각 빈 초기화와 소멸 시의 동작을 지정할 때 사용된다.
JDBC, Hibernate, JPA, Spring Data JPA
JDBC (Java Database Connectivity)
- 개요:
- 자바 애플리케이션과 데이터베이스 간의 연결을 제공하는 자바 API.
- SQL 쿼리를 실행하고 관계형 데이터베이스와 상호 작용할 수 있는 방법을 제공한다.
- 특징:
- 수동적인 데이터베이스 처리: SQL 쿼리를 직접 작성하고 처리해야 한다.
- 직접적인 커넥션 관리: Connection, Statement, ResultSet 등을 명시적으로 열고 닫아야 한다.
- 좋은 성능: 직접적인 접근으로 인해 일부 상황에서 더 나은 성능을 제공할 수 있다.
Hibernate
- 개요:
- 객체 관계 매핑 (ORM)을 위한 프레임워크로, 자바 객체와 데이터베이스 테이블 간의 매핑을 자동화한다.
- JDBC의 복잡성을 줄이고 객체 지향 프로그래밍을 편리하게 할 수 있도록 도와준다.
- 특징:
- ORM 기능 제공: 자바 객체와 데이터베이스 테이블 간의 매핑을 어노테이션 또는 XML 설정을 통해 정의하고 제공한다.
- 캐시 기능: 성능 향상을 위해 데이터베이스 결과를 캐싱할 수 있다.
- 높은 생산성: 데이터베이스와 상호 작용하는 코드를 최소화하고 객체 중심의 코드 작성을 가능하게 한다.
JPA (Java Persistence API
- 개요:
- 자바에서 객체 관계 매핑을 위한 표준 인터페이스.
- Hibernate, EclipseLink 등의 구현체가 JPA 표준을 따르고 있으며, 개발자는 특정 구현체에 종속되지 않고 JPA 인터페이스를 사용할 수 있다.
- 특징:
- 표준 인터페이스: JPA는 인터페이스를 정의하고, 구현체는 이 인터페이스를 구현하여 객체와 데이터베이스 간의 매핑을 지원한다.
- 객체 지향적인 쿼리 언어: JPQL (Java Persistence Query Language)을 사용하여 객체 지향적인 방식으로 데이터베이스 쿼리를 작성할 수 있다.
- 트랜잭션 관리: JPA는 트랜잭션을 관리하며, 객체의 변경 사항을 트랜잭션 단위로 처리한다.
Spring Data JPA
- 개요:
- 스프링에서 JPA를 쉽게 사용할 수 있도록 도와주는 프로젝트.
- JPA의 기능을 더 쉽게 사용하고 빠르게 개발할 수 있도록 스프링 기반의 기능을 제공한다.
- 특징:
- Repository 인터페이스: 데이터베이스 조작을 위한 공통 메서드를 제공하는 Repository 인터페이스를 사용하여 데이터베이스와 손쉽게 상호 작용할 수 있다.
- 쿼리 메서드: 메서드 이름에 따라 자동으로 쿼리를 생성해주는 쿼리 메서드를 지원한다.
- 동적 쿼리 생성: 조건에 따라 동적으로 쿼리를 생성할 수 있는 기능을 제공한다.
결론
- JDBC: 수동적이고 직접적인 데이터베이스 처리를 위한 자바 API.
- Hibernate: ORM 프레임워크로, 객체와 데이터베이스 간의 매핑을 자동화해주는 기능을 제공한다.
- JPA: 자바에서 ORM을 위한 표준 인터페이스로, 구현체에 독립적으로 사용할 수 있다.
- Spring Data JPA: 스프링에서 JPA를 더 편리하게 사용하기 위한 프로젝트로, Repository 인터페이스와 다양한 기능을 제공한다.
'Web_Backend > Spring' 카테고리의 다른 글
@Yanako :: Yana's coding story
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!