1. Spring과 Singleton Pattern??
필자가 Spring 프레임워크를 공부하면서 가장 먼저 접했던 개념은 Singleton Pattern이었던 것 같다.
학기중에 OODP(객체지향 설계패턴)수업에서 배우기도 했던 싱글톤 패턴이기도 해서 이해하기 쉬웠던 것 같다.
Singleton Pattern이 뭘까?
간단하게, 싱글톤 패턴은 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
Spring에서는 Bean이라고 부르는 객체들이 기본적으로 Singleton으로 관리된다.
예를 들어, 다음과 같은 서비스 클래스가 있다고 가정해보겠다.
@Service
public class UserService {
private static int instanceCount = 0;
public UserService() {
instanceCount++;
System.out.println("UserService 인스턴스 생성 횟수: " + instanceCount);
}
}
이 클래스는 Spring이 관리하는 Bean으로 등록되며, 애플리케이션이 실행되는 동안 단 하나의 인스턴스만 생성된다다.
콘솔에는 "UserService 인스턴스 생성 횟수: 1"만 출력될 것이다!
2. Component Scanning
그렇다면 Spring은 어떻게 우리가 작성한 클래스들을 찾아서 Bean으로 등록할까?
바로 Component Scanning이라는 메커니즘을 통해서이다.
Component Scanning은 특정 패키지 이하의 모든 클래스들을 검사하면서 Spring Bean으로 등록할 대상을 찾는 과정이다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
위와 같이 @SpringBootApplication 어노테이션이 선언된 클래스의 패키지를 시작으로 하위 패키지들을 모두 검사하면서 Spring Bean으로 등록할 대상을 찾는다고 보면된다.
3. 주요 Spring 어노테이션을 살펴보자!!
@Component
가장 기본이 되는 어노테이션으로, Spring Bean으로 등록하고자 하는 클래스에 선언한다.
@Component
public class EmailService {
public void sendEmail(String to, String subject) {
// 이메일 전송 로직
}
}
이 클래스는 Spring이 자동으로 감지하여 Bean으로 등록하고 관리한다.
@Controller
웹 요청을 처리하는 컨트롤러 클래스임을 나타낸다.
@Controller
public class UserController {
@GetMapping("/users")
public String getUsers(Model model) {
return "users";
}
}
이 클래스는 웹 요청을 처리하며, 주로 View를 반환하는 역할을 담당한다.
@Service
비즈니스 로직을 처리하는 서비스 계층의 클래스임을 나타낸다.
@Service
public class ProductService {
public void processOrder(Order order) {
// 주문 처리 로직
}
}
이 클래스는 실제 비즈니스 로직이 구현되는 곳으로, 여러 Repository를 조합하여 작업을 처리한다.
@Repository
데이터 접근 계층의 클래스임을 나타낸다.
@Repository
public class UserRepository {
public User findById(Long id) {
// 데이터베이스 접근 로직
return user;
}
}
이 클래스는 데이터베이스 작업을 담당하며, JPA나 MyBatis 등의 실제 데이터 접근 기술을 사용한다.
@Autowired
의존성 주입을 위해 사용되는 어노테이션이다.
@Service
public class OrderService {
@Autowired
private ProductRepository productRepository;
public void createOrder() {
// 상품 조회 및 주문 생성 로직
}
}
이 코드에서는 ProductRepository가 자동으로 주입되어 OrderService에서 사용할 수 있게된다.
@Configuration과 @Bean
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
return dataSource;
}
}
이 설정 클래스는 데이터베이스 연결을 위한 DataSource Bean을 생성하고 등록한다.
'Spring' 카테고리의 다른 글
[Spring] JdbcTemplate으로 데이터베이스 접근하기! (0) | 2025.01.20 |
---|---|
[Spring] 🔎 DataSource와 트랜잭션 개념정리 🔎 (2) | 2025.01.20 |
[Spring] Controller의 Return Type과 Parameter 가이드 👍 (1) | 2025.01.20 |
[Spring] POJO, IoC, DI, AOP, Filter 핵심 개념 완벽 정리 🧹 (2) | 2025.01.19 |
[Spring] ⚡️ Spring MVC와 Spring Boot 개념 정리 ⚡️ (0) | 2025.01.19 |