Post

[Spring] 왜 스프링인가?

why spring

[Spring] 왜 스프링인가?

프로그래밍에서 디자인 패턴은 객체 간 유연한 관계 설정과 유지보수를 위해 필수적이다. 그러나 순수 Java로 디자인 패턴을 직접 구현하면 여러 불편함이 발생한다. Spring 프레임워크는 이러한 과정을 자동화하여 생산성을 크게 높여 준다.

🤔 순수 Java에서의 짐작 가능한 불편함

객체 생성과 연결

  • 개발자가 new로 객체를 일일이 생성하고 의존성을 설정해야 한다.

생명주기 관리 부재

  • 객체의 생성과 소멸 시점을 개발자가 직접 제어해야 한다.

테스트의 어려움

  • 강한 결합 구조에서는 Mock 객체로 대체하기가 번거롭다.

자동화 부족

  • 로깅, 트랜잭션, 보안, 캐싱 등을 매번 수작업으로 작성해야 한다.

Spring을 사용하면 쉬워지는 이유

Spring의 IoC(Inversion of Control) 컨테이너는 여러 디자인 패턴을 내장하여 개발자의 반복 작업을 줄여 준다.

디자인 패턴순수 Java 구현 예시Spring 적용 방식
DI (의존성 주입)UserService svc = new UserService(new UserRepo());@Component + @Autowired로 자동 주입
Singletonprivate static instance 직접 관리모든 Bean이 기본적으로 싱글톤 스코프
Factory Method별도 팩토리 클래스 작성@Configuration@Bean 메서드 사용
Proxy / AOP수작업으로 프록시 클래스 작성@Aspect, @Around로 자동 프록시 생성
Template Method추상 클래스 상속 후 구현JdbcTemplate, RestTemplate 등 제공
Observer이벤트 처리 로직 직접 구현ApplicationEventPublisher + @EventListener

예시: 트랜잭션 처리 비교

  • 순수 Java 방식
1
2
3
4
5
6
7
8
9
10
11
12
Connection conn = dataSource.getConnection();
try {
  conn.setAutoCommit(false);
  withdraw(conn, from, amount);
  deposit(conn, to, amount);
  conn.commit();
} catch (Exception e) {
  conn.rollback();
  throw e;
} finally {
  conn.close();
}
  • Spring + AOP 방식
1
2
3
4
5
6
7
8
@Service
public class AccountService {
    @Transactional
    public void transferMoney(Account from, Account to, int amount) {
        withdraw(from, amount);
        deposit(to, amount);
    }
}

@Transactional만 선언하면 트랜잭션 시작, 커밋·롤백, 자원 해제를 Spring이 자동으로 처리한다.

결론: Spring을 선택해야 하는 이유

  • 보일러플레이트 코드 감소
  • 테스트 용이성 향상
  • 로깅, 트랜잭션, 보안 등 공통 기능 자동화
  • 확장성 있고 유연한 아키텍처 구축

이미 검증된 Spring의 추상화를 활용하면, 반복 작업을 줄이고 핵심 비즈니스 로직에만 집중할 수 있다. 개발 생산성과 유지보수성이 모두 향상된다.

This post is licensed under CC BY 4.0 by the author.