Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- object-creation
- design-pattern
- React
- SpringBoot
- 클라우드아키텍처
- QueryDSL
- 레벨1
- 글또
- constructor
- 다짐글
- 코딩테스트
- 글쓰기세미나
- 3계층 아키텍처
- OpenSearch
- 포트앤어댑터 아키텍처
- 글또10기
- Level2
- DevOps
- 클린 아키텍처
- HashMap
- 헥사고날 아키텍처
- 프로그래머스
- ReverseNested
- static-factory-method
- 코엑스그랜드볼룸
- builder-pattern
- 회고
- axios
- 가용영역
- UserLand
Archives
- Today
- Total
oguri's garage
Spring vs Spring Boot 핵심 차이점 본문
1. 관계 이해하기
비유: 자동차 vs 자율주행차
- Spring Framework = 고성능 스포츠카 🏎️
- 모든 걸 직접 조작해야 함 (수동 기어, 클러치 등)
- 강력하지만 숙련된 운전자가 필요
- Spring Boot = 자율주행 전기차 🚗⚡
- 대부분 자동으로 처리됨
- 목적지만 입력하면 알아서 운전
Spring Boot ⊂ Spring Framework
(Spring Boot는 Spring Framework 위에 구축된 편의 기능)
2. 핵심 차이점
2.1 구성(Configuration) 방식
Spring Framework - 수동 설정
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans">
<!-- 데이터베이스 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<!-- JPA 설정 -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.example.entity"/>
</bean>
<!-- 트랜잭션 매니저 설정 -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 컴포넌트 스캔 설정 -->
<context:component-scan base-package="com.example"/>
<!-- 웹 MVC 설정 -->
<mvc:annotation-driven/>
</beans>
Spring Boot - 자동 설정
# application.properties (이게 전부!)
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
@SpringBootApplication // 이 하나로 모든 설정 완료!
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.2 서버 실행 방식
Spring Framework
// 1. 톰캣을 별도로 설치해야 함
// 2. WAR 파일로 패키징
// 3. 톰캣에 배포
// 4. 복잡한 서버 설정 필요
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// 복잡한 초기화 코드...
}
}
Spring Boot
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 끝!
// 내장 톰캣이 자동으로 시작됨
}
}
2.3 의존성 관리
Spring Framework
<!-- pom.xml - 각각의 버전을 다 맞춰야 함 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.21</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.21</version> <!-- 버전 호환성 체크 필요 -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.21</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.21</version>
</dependency>
<!-- 데이터베이스 관련 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.21</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.9.Final</version> <!-- 호환성 체크 필요 -->
</dependency>
<!-- ... 수십 개의 의존성 ... -->
</dependencies>
Spring Boot
<!-- pom.xml - 스타터 의존성으로 간단하게 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 버전 명시 불필요! 자동 관리됨 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
3. 기능별 구분 기준
3.1 Spring Framework 고유 기능
핵심 엔진 기능들 - "자동차의 엔진, 바퀴, 브레이크"
// 1. 의존성 주입 (DI/IoC)
@Component
@Service
@Repository
@Autowired
// 2. 관점 지향 프로그래밍 (AOP)
@Aspect
@Before
@After
@Around
// 3. 트랜잭션 관리
@Transactional
// 4. MVC 패턴
@Controller
@RequestMapping
@ResponseBody
// 5. 데이터 액세스
@Repository
JdbcTemplate
3.2 Spring Boot 추가 기능
편의 기능들 - "자율주행, 자동 주차, 스마트 키"
// 1. 자동 구성 (Auto Configuration)
@SpringBootApplication
@EnableAutoConfiguration
// 2. 스타터 의존성
spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-security
// 3. 내장 서버
// 별도 설정 없이 Tomcat, Jetty 실행
// 4. 외부 설정 관리
@ConfigurationProperties
application.yml, application.properties
// 5. 액추에이터 (모니터링)
@Endpoint
/actuator/health
/actuator/metrics
// 6. 개발자 도구
spring-boot-devtools (핫 리로드)
// 7. 테스트 지원
@SpringBootTest
@WebMvcTest
@DataJpaTest
4. 실제 프로젝트 비교
4.1 간단한 REST API 만들기
Spring Framework (약 200줄)
// 1. WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
// ViewResolver, MessageConverter 등 설정
}
// 2. RootConfig.java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.example.repository")
public class RootConfig {
@Bean
public DataSource dataSource() {
// 데이터베이스 연결 설정
}
@Bean
public EntityManagerFactory entityManagerFactory() {
// JPA 설정
}
@Bean
public PlatformTransactionManager transactionManager() {
// 트랜잭션 매니저 설정
}
}
// 3. WebAppInitializer.java
public class WebAppInitializer implements WebApplicationInitializer {
// 서블릿 초기화 코드
}
// 4. 컨트롤러는 동일
@Controller
public class UserController { ... }
Spring Boot (약 10줄)
// 1. Application.java (이게 전부!)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 2. 컨트롤러는 동일
@RestController
public class UserController { ... }
// 3. application.yml
spring:
datasource:
url: jdbc:h2:mem:testdb
jpa:
hibernate:
ddl-auto: update
5. 언제 무엇을 사용해야 할까?
5.1 Spring Boot를 사용해야 하는 경우 (90%)
✅ 새로운 프로젝트 시작
✅ 빠른 프로토타이핑
✅ 마이크로서비스 아키텍처
✅ REST API 개발
✅ 표준적인 웹 애플리케이션
✅ 스타트업이나 작은 팀
5.2 Spring Framework를 직접 사용하는 경우 (10%)
✅ 매우 세밀한 설정이 필요한 경우
✅ 레거시 시스템과 통합
✅ 특별한 아키텍처 요구사항
✅ Spring Boot의 자동 설정이 방해되는 경우
✅ 메모리나 성능이 극도로 중요한 시스템
6. 핵심 정리
| 구분 | Spring Framework | Spring Boot |
|---|---|---|
| 역할 | 핵심 엔진 | 편의 기능 추가 |
| 설정 | 수동 (XML/Java Config) | 자동 (Convention over Configuration) |
| 시작 시간 | 복잡한 설정 필요 | 즉시 실행 가능 |
| 서버 | 외부 서버 필요 | 내장 서버 포함 |
| 의존성 | 수동 버전 관리 | 자동 버전 관리 |
| 학습 곡선 | 가파름 | 완만함 |
| 유연성 | 매우 높음 | 높음 (일부 제약) |
결론:
- Spring Boot는 Spring Framework를 더 쉽게, 더 빠르게 사용할 수 있게 해주는 상위 레이어이다.
- 마치 수동차에 자동 기능을 추가한 것처럼, 핵심 기능은 그대로 두고 편의성을 대폭 향상시킨 것
'개발하다 > Spring' 카테고리의 다른 글
| (Spring) @Transactional을 Service 계층에 적용해야 하는 이유와 올바른 사용법 (0) | 2025.10.10 |
|---|---|
| (Spring) Jackson 역직렬화 동작 방식과 안전한 코딩 패턴 (0) | 2025.10.04 |
| Lombok 어노테이션(@Builder, @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor, @Data) (0) | 2025.10.02 |
| QueryDSL Q-Type 클래스 - 개념, 생성, 활용법 (0) | 2025.10.01 |
| Spring 검증 어노테이션 (@Valid, @NotNull, @NotEmpty, @NotBlank) (1) | 2025.09.29 |