Framwork?
- Frame을 가지고 하는 작업 또는 구조물의 뼈대나 틀을 말한다.
- SW의 시선으로 바라본다면 비지니스 로직이 빠진 뼈대만 갖춰진 반제품 형태의 애플리케이션이라고 볼 수 있다.
컴퓨터 프로그래밍에서 소프트웨어 프레임워크는 소기의 목적을 달성하거나 복잡한 문제를 해결하고 서술하는 데 사용되는 기본 개념 구조이다. 간단히 뼈대, 골조, 프레임워크라고도 한다. - 위키백과 -
예시 )
파워포인트 [프레임워크] + 발표내용[비즈니스 로직]
전자레인지[프레임워크] + 음식[비즈니스 로직]
Spring Framework
- 자바 애플리케이션 개발을 위한 경량 framwork
- 스프링 부트랑 다른 개념인 것을 유의!!
- 프레임워크는 비즈니스 로직하고는 무관한 귀찮고 어려우며 모듈화를 할 수 있는 일들을 담당한다.
spring + 비즈니스 로직 = 애플리케이션
다시 말해서, 개발자는 프레임에 적합한 비즈니스 로직를 공급하는데 집중해야한다.
- 다만 그만큼 별도의 설정을 해줘야 한다.
예시)
JDBC작업
스프링을 몰랐을 때 | 스프링을 알았을 때 | ||
개발자 | DB관리, TX처리, 비즈니스로직,JDBC코드 사용, 예외관리 | 개발자 | 비즈니스 로직 |
스프링 | X | 스프링 | DB관리, TX처리, 비즈니스로직,JDBC코드 사용, 예외관리 |
- DataSource(데이터소스) 설정
- DB 연결 URL, 사용자명, 비밀번호, 드라이버 클래스를 XML이나 Java Config에 명시.
- Connection Pool 설정
- HikariCP, Tomcat Pool 등 어떤 커넥션 풀을 사용할지, 최대/최소 커넥션 수 등을 개발자가 직접 Bean 등록.
- PlatformTransactionManager(트랜잭션 매니저) 설정
- JDBC의 경우 DataSourceTransactionManager, JPA나 Hibernate 사용 시 JpaTransactionManager 등을 명시적으로 Bean 등록. ...등
개발자는 이런 설정들을 수동으로 해줘야 한다.
Spring Boot
- 스프링 애플리케이션을 개발하는 일종의 템플릿이다.
- 스프링 부트는 스프링 프레임워크를 더욱 쉽게 사용할 수 있도록 도와주는 확장 도구라고 볼 수 있다.
- 스프링의 복잡한 설정을 자동화 해주고, 단위 테스트 강화로 프로젝트 안정성 강화 하였다.
- Auto Configuration으로 DataSource 자동 등록
- application.properties 혹은 application.yml에 spring.datasource.url, spring.datasource.username, spring.datasource.password와 같은 프로퍼티만 설정하면, 스프링 부트가 DataSource Bean을 자동으로 생성.
- 커넥션 풀 자동 설정
- 프로젝트에 포함된 라이브러리를 보고 HikariCP(기본), Tomcat Pool 등으로 자동 선택 후 풀 사이즈나 타임아웃 값을 기본값으로 설정.
- 필요하면 spring.datasource.hikari.maximum-pool-size=10 같은 식으로 프로퍼티로만 간단히 수정.
- 트랜잭션 매니저 자동 등록
- 데이터 액세스 계층 기술(JDBC, JPA 등)에 맞게 DataSourceTransactionManager나 JpaTransactionManager를 자동으로 Bean 등록.
- @SpringBootApplication 안에 이미 @EnableTransactionManagement 등이 포함되어 있어, 별도 설정 없이 @Transactional이 동작.
스프링 부트에서는 스프링에서의 설정들을 자동으로 해준다.
설정 항목 | 전통 스프링(부트 이전) | 스프링 부트 |
DataSource 설정 | XML 또는 Java Config 파일에 데이터베이스 URL, 사용자명, 비밀번호, 드라이버 클래스 등 모든 정보를 직접 명시하여 Bean 등록 필요 | application.properties 또는 application.yml에 간단히 프로퍼티만 지정하면, Auto Configuration이 자동으로 DataSource Bean을 생성 |
커넥션 풀 | HikariCP, Tomcat Pool 등 원하는 커넥션 풀을 선택하고, 관련 설정(최대/최소 커넥션 수 등)을 직접 Bean으로 등록 | 의존성에 포함된 커넥션 풀 라이브러리 기반으로 기본값으로 자동 설정되며, 필요한 경우 프로퍼티로 간편히 수정 가능 |
트랜잭션 매니저 | JDBC의 경우 DataSourceTransactionManager, JPA의 경우 JpaTransactionManager 등을 XML이나 Java Config로 명시적으로 등록 | 사용 중인 데이터 액세스 기술에 맞게 적절한 트랜잭션 매니저가 자동으로 등록되며, @EnableTransactionManagement와 함께 기본적으로 동작 |
트랜잭션 AOP 설정 | XML <tx:annotation-driven> 또는 Java Config에서 트랜잭션 어드바이저를 직접 설정하여 AOP 기반 트랜잭션 처리를 구성 | Auto Configuration에 포함되어 별도의 추가 설정 없이 @Transactional을 통해 자동으로 적용됨 |
예외 변환 | 각 기술(JDBC, JPA 등)에 따라 발생한 예외를 직접 처리하거나 변환하는 코드를 구현, 혹은 별도 설정 필요 | 스프링 부트 스타터에 포함된 예외 변환 계층이 자동으로 작동하여, 일관된 DataAccessException 계층으로 예외를 변환 |
JdbcTemplate 등 유틸 | 필요한 경우 JdbcTemplate, NamedParameterJdbcTemplate 등의 Bean을 XML 또는 Java Config 파일에 직접 등록 | 해당 의존성(spring-boot-starter-jdbc)만 추가하면, 자동으로 유틸 클래스들이 등록되어 바로 DI(의존성 주입)하여 사용 가능 |
로깅 설정 | Log4j, Logback 등의 로깅 프레임워크를 직접 설정하고, SQL 로그 등 필요한 로그 출력 설정을 수동으로 구성 | 기본 제공되는 로깅 설정과 Auto Configuration을 통해 합리적인 기본 로그 설정이 자동으로 적용되며, 필요 시 프로퍼티로 간단히 조정 가능 |
테스트 환경 구성 | @RunWith(SpringJUnit4ClassRunner.class), @ContextConfiguration 등을 사용하여 별도의 테스트 설정 파일(XML/Java Config) 관리<br/>Mock 객체나 임베디드 DB 등을 직접 설정 필요 | @SpringBootTest, @WebMvcTest, @DataJpaTest 등 다양한 테스트 어노테이션 제공<br/>내장된 테스트 지원 스타터(spring-boot-starter-test)를 통해 환경 구성이 자동화됨 |
다시 말해서, 개발자는 프레임에 적합한 비즈니스 로직를 공급하는데 더!!!!! 집중해야한다.
Spring Framework 핵심 특징
다시 스프링으로 돌아와서 스프링 프레임워크의 특징에 대해서 알아보자.
1. IoC/DI,DL
IoC(제어의 역전)
- 기존 방식:
우리가 직접 필요한 객체(예: 서비스, DAO 등)를 new 연산자로 생성하거나 직접 관리함
예) 자동차를 직접 부품에서 조립 - IoC 적용 방식:
"누가 객체를 만들어줄까요?"라는 문제를 외부(컨테이너)에게 맡기는 것
예) 자동차를 조립하는데 필요한 부품들을 누군가 미리 준비해 놓으면, 조립만 하면 되는 것
-> 즉, 객체 생성 및 관리의 권한이 개발자에서 컨테이너로 넘어가게 되는 것을 말한다.
DI(의존성 주입) - Dependency Injection
- DI 개념:
IoC의 한 형태로, 필요한 객체(의존성)를 외부 컨테이너가 "주입"해주는 것
예) 자동차를 조립할 때, 엔진이나 바퀴 같은 부품이 이미 준비되어 있어, 조립 시에 그냥 "받아다 쓰는" 상황 - 장점:
개발자는 "어떻게 부품을 만드는지" 걱정할 필요 없이, 준비된 부품만 사용하면 됩니다.
-> 그래서 코드가 더 깔끔하고, 관리하기 쉬워집니다.
DL(의존성 조회) - Dependency Lookup
- DL 개념:
DI와는 반대로, 필요한 객체를 외부 컨테이너에서 "찾아오는" 방식
예) 자동차 조립 중에 직접 창고에 가서 부품을 가져오는 방법- DI와의 차이:
- DI는 누군가(컨테이너)가 미리 부품(객체)를 주입해 주는 방식
- DL은 개발자가 필요할 때 직접 부품(객체)을 찾아서 사용하는 방식
- DI와의 차이:
- 단점: DL 방식은 코드가 컨테이너에 의존하게 되어, 결합도가 높아지고 테스트나 유지보수가 어려워질 수 있습니다.
2. AOP( Aspect Oriented Programming관점지향프로그래밍)
- AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법이다.
- 이는 문제를 해결하기 위한 핵심관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍 함으로서 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 한다.
예시)
금융사이트
- 핵심 관심 사항: 금융 거래의 비즈니스 로직에 집중 (예: 예금 조회, 거래, 이체)
- 공통 관심 사항: 로깅, 보안, 트랜잭션 관리 등 여러 기능에 공통으로 적용되는 부가 로직을 한 곳에 모아 관리
이렇게 분리하면, 개발자가 핵심 비즈니스 로직 작성에 집중할 수 있고, 나중에 로깅이나 보안 정책이 변경되어도 공통 관심 사항의 코드만 수정하면 되어 유지보수성이 향상된다.
3. PSA(Portable Service Abstraction : 이식 가능한 서비스 추상화)
- 어렵고 복잡한 개념을 특정 환경에 종속되지 않고 쉽게 사용할 수 있게 추상화된 레이어 제공
- 스프링이 제공하는 주요 특징 중 하나로, 다양한 환경과 기술에서 일관성 있게 사용할 수 있는 “추상화 레이어(Abstraction Layer)”를 의미
- 예) 데이터 접근 계층의 PSA를 통해, JPA, MyBatis, JDBC 등 서로 다른 기술을 사용해도 트랜잭션 처리나 예외 변환 등은 스프링이 동일한 방식으로 지원한다.
4. POJO (Plain Old Java Object)
- “특정 프레임워크나 기술에 종속되지 않은 순수 자바 객체”를 의미한다.
- 즉, 스프링 같은 프레임워크가 제공하는 특정 인터페이스나 클래스를 반드시 상속받거나, 특정 애노테이션을 강제적으로 달 필요가 없는, 일반적인 자바 코딩 규칙에 따라 작성한 객체다.
- DI, AOP, PSA를 하기 위해 이제까지 하던 대로 그냥 평범하게 객체를 만들면 된다.
쉽게 말해서, 스프링 프레임워크가 다 지원해주니깐 우리는 괜히 어렵게 구현할 필요없이 수순 자바를 하면 되는 것이다.
스프링 프레임워크가 내부적으로 POJO에 대해 필요한 기능을 자동으로 적용해 주기 때문에, 개발자가 POJO 객체 자체를 작성할 때 특별한 제약 없이 작성할 수 있다는 점을 강조한 것입니다.
'SpringBoot' 카테고리의 다른 글
DI(Dependency Injection) - (3) (0) | 2025.04.18 |
---|---|
DI(Dependency Injection) - (2) (0) | 2025.04.18 |
DI(Dependency Injection) - (1) (1) | 2025.04.18 |
세션과 JWT의 차이 (0) | 2025.01.12 |
SpringBoot 잡동사니 (0) | 2025.01.12 |