
Spring에 대한 기초 개념을 정리한 글 입니다.
Spring은 자바 기반 엔터프라이즈 애플리케이션 개발을 단순화하고 유연성을 높이기 위한 오픈소스 프레임워크입니다.
위와 같은 장점 때문에 사용하지만 조금 더 구체적인 내용을 알아보겠습니다.
Spring IoC 컨테이너(BeanFactory 또는 ApplicationContext)가 객체(Bean)를 생성하고 관리.
예시: 개발자가 new 키워드로 객체를 생성하지 않고, Spring이 설정 파일이나 어노테이션을 통해 객체를 주입.(아래 코드 참조)
@Bean: Spring IoC 컨테이너에서 특별하게 관리하는 객체
@Configuration: Spring에서 설정 클래스임을 나타내는 어노테이션(@)
// 일반 클래스
class Car {
void drive() {
System.out.println("Driving a car!");
}
}
@Configuration
class AppConfig {
@Bean
public Car car() { // 메서드 이름이 Bean의 기본 ID가 됨
return new Car();
}
}
public class Main {
public static void main(String[] args) {
// IoC 컨테이너 생성 (ApplicationContext)
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Bean을 컨테이너에서 호출 (new 없이 사용)
Car myCar = context.getBean(Car.class);
myCar.drive();
// 출력 : Driving a car!
}
}
@Autowired 같은 어노테이션으로 직접 필드에 주입(권장 X).public class UserService {
private UserRepository userRepository;
// 생성자 주입
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Component
public class UserService {
// Bean으로 등록됨
}
| 개념 | 설명 |
|---|---|
| Aspect (관점) | 공통 기능을 모듈화한 클래스 (e.g: 로깅, 트랜잭션 관리) |
| Join Point (연결 지점) | Advice가 적용될 수 있는 지점 (메서드 실행 등) |
| Advice (부가 기능) | 실행될 공통 코드 (e.g: 실행 시간 측정) |
| Pointcut (적용 대상 지정) | Advice를 적용할 대상(메서드, 클래스) 지정 |
| Weaving (위빙) | Advice를 실제 객체에 적용하는 과정 |
@Service
public class UserService {
public void createUser(String name) {
System.out.println("👤 사용자 " + name + " 생성 완료!");
}
}
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service.UserService.*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
System.out.println("⏳ 실행 시간: " + (System.currentTimeMillis() - start) + "ms");
return result;
}
}
✅ 비즈니스 로직과 공통 기능 분리 → 코드 가독성 증가
✅ 중복 코드 제거 → 유지보수 편리
✅ 로깅, 보안, 트랜잭션 관리 등 다양한 공통 기능 적용 가능
Controller: 요청을 처리하는 로직(@Controller).
Model: 데이터를 담는 객체.
View: 사용자에게 보여줄 화면(JSP, Thymeleaf 등).
클라이언트 요청 → DispatcherServlet
Handler Mapping → 적절한 Controller 호출
Controller → Model 생성 및 View 반환
View 렌더링 → 클라이언트 응답.
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Hello, Spring!");
return "home"; // home.html 반환
}
}
| 구분 | 내용 |
|---|---|
| 장점 | DI/IoC: 의존성 주입으로 코드 결합도 ↓, 테스트 쉬움 |
| 경량화: POJO 기반, 불필요한 복잡성 제거 | |
| 모듈화: Spring Boot, Security 등 필요한 기능만 골라 사용 가능 | |
| 통합성: JDBC, JPA 등 기존 기술과 쉽게 연동 | |
| 생산성: 설정 자동화로 개발 속도 ↑ | |
| 커뮤니티: 풍부한 자료와 활발한 지원 | |
| 단점 | 학습 곡선: 방대한 기능 때문에 초보자가 익히기 어려움 |
| 복잡성: 커스터마이징 많아지면 설정이 꼬일 수 있음 | |
| 성능: 의존성 주입으로 약간의 오버헤드 발생 가능 | |
| 추상화: 내부 동작 파악이 어려울 수 있음 | |
| 의존성 충돌: 모듈 많을 때 버전 관리 주의 필요 |
Spring Boot는 Spring 프레임워크를 기반으로 설정을 자동화하고 빠른 개발을 지원하는 경량화된 솔루션입니다.
Spring Boot는 Spring의 설정을 자동화하고, 빠른 개발을 지원하는 확장판입니다. 기본 설정을 제공하며, 내장 서버(Tomcat 등)를 포함해 별도 WAS 없이 실행 가능합니다.
자동 설정: Spring Boot가 자동으로 환경에 맞는 설정을 처리.
스타터 의존성: 기능별로 필요한 라이브러리를 한번에 모아서 설정.
프로퍼티 파일 설정: application.properties 또는 application.yml 파일을 통해 설정.
자바 기반 설정: 자바 클래스를 이용해 직접 설정을 작성하는 방법.
| 구분 | 스프링 (Spring) | 스프링 부트 (Spring Boot) |
|---|---|---|
| 설정 | 수동 설정 (XML, Java Config) | 자동 설정 (Auto-Configuration) |
| 개발 속도 | 초기 설정 많아 느림 | 최소 설정으로 빠름 |
| 배포 | WAR 파일, 외부 WAS 필요 | JAR 파일, 내장 서버로 독립 실행 |
| 의존성 관리 | 수동으로 버전 관리 | BOM으로 자동 관리 |
| 목적 | 유연성, 대규모 프로젝트 | 빠른 개발, 마이크로서비스 |
스프링은 유연성을, 스프링 부트는 편의성과 속도를 강조한 차이가 핵심입니당.