본문으로 바로가기

spring을 사용하고 있지만 개념에 대한 이해가 부족해서 적어보는 글

궁금한 것 위주로 작성한 글이라서 뒤죽박죽 할 수 있습니다. 

 

 

*Spring

Java기반 엔터프라이즈 수준의 애플리케이션을 개발하기 위한 기능을 제공하는 프레임워크

간단하게 개발을 편하게 해주는 프레임워크

 

Spring은 POJO를 기반으로 개발을 지원하는 툴이다.

여기서 POJO란 '순수한 자바 객체'를 의미한다. 어느 클래스를 상속받지 않고 단순 getter/setter로 이루어진 객체를 말한다. 

 

Class Person {
	private name;
    private age;
    
    getter();
    setter();
...
}

Spring이전 Servlet을 보면 웹 개발 시 HttpServlet... 등 을 상속받아 구현하는 것을 볼 수 있다. Spring에서는 이러한 종속적 환경을 최소화한다고 말할 수 있다. 

 

 

Spring의 구조는 위와 같고 AOP, DAO, Context, Web.. 등의 장점을 가진다고 한다. 용어에 대해서는 앞으로 천천히 작성해 볼 예정이다. 

 

 

 

Spring의 핵심 기술들 

 

1. IoC ( Inversion of Control - 제어의 역전)

spring하면 꼭 따라오는 용어 IoC

 

  • spring 이전 개발자들은 객체를 직접 선언/생성하고 메소드를 호출해야하는 번거로움이 있는 반면, spring에서는 이러한 흐름을 Container가 담당한다. 
  • 즉, 개발자가 직접적으로 생성하거나 의존관계에 관여하는게 아닌 Spring에 의해 객체가 생성되고 의존관계가 형성되기 때문에 제어의 역전(IoC) 이라고 말한다. 
  • Spring의 설정대로만 하면 그에 따라 Bean을 생성하고 의존관계를 통해(Dependency Lookup) 주입 (Dependency Injection)해준다. 

 

예제를 통해 IoC를 살펴본다면 

Class Person {
	Galaxy galaxy;
    
    public Person() {
    	galaxy = new Galaxy();
    }
}

Class Person {
	Iphone iphone;
    
    public Person() {
    	iphone = new Iphone();
    }
}

Class Galaxy implements Phone {
	...
}

 

 

Person이라는 클래스에 휴대폰 기기를 등록하는 필드가 있다고 가정한다.  위 코드에서 Person은 Galaxy 혹은 Iphone이라는 객체와 의존관계를 맺고있다고 한다. 

Person은 직접 Galaxy 혹은 Iphone을 생성하여 사용하고 있다. 그리고 이렇게 생성된 객체는

Class Main {
	Person person = new Person();
}

직접 생성을 통해 사용되어진다. 

 

 

spring을 적용한다면 

Class controller {
	@Autowired
	Person person;
}

Class Person {
	@Qualifier("galaxy")
    Phone phone;
}

person을 직접 생성할 필요 없이 Spring Container에서 Person을 Bean으로 등록하고 알아서 주입까지 해준다는 것이다. 

개발자는 의존관계에 관여할 필요가 없어지는 것이다.

 

2. AOP ( Aspect Oriented Programming - 관점 지향 프로그래밍)

AOP는 관점지향 프로그래밍을 말한다. 개발을 하다보면 서비스에 공통으로 필요한 보안, 인증, 로그 기록 과 같은 기능이 있는 반면, 각 서비스의 핵심이 되는 비즈니스 로직이 따로있다. 

Class Service {
	// 보안처리 
    
    핵심 기능 ~~
    
    // 로그 기록
}

만약 공통 부분이 떼어지지 않는다면 모든 Service에 위와 같은 코드 형식으로 구성될 것이다. 이러한 형태는 후에 유지보수에도 좋지 않고

작은 변경에도 버그가 남발하는 참사가 일어날 수 있다. 

 

AOP는 이러한 형태에서 보안처리, 로그 기록 같은 공통 기능을 따로 떼어내어 서비스는 서비스만의 핵심 기능에만 집중할 수 있도록 제공한다. 

 

Aspect는 Pointcut + Advice를 의미하며

Pointcut은 어느 부분에 공통 기능을 삽입할 것인지 정의하는 것이고

Advice는 공통 모듈 자체를 의미한다.

 

Spring은 Proxy를 기반으로 AOP를 지원한다. 

Aspect가 적용되는 클래스(객체)에 대해 프록시를 만든다. 

AOP대상 클래스에 직접적으로 접근하는 것이 아닌 프록시에 접근하는 것이다. 

 

 

 

3. PSA ( Portable Service Abstraction )

특정 서비스를 추상화 시킴으로 개발자는 내부 로직을 알 필요 없이 추상화 된 API만 잘 사용하면 되는 기능

 

@Transactional 이라는 어노테이션을 보면 ,

 

Spring에서는 jdbc를 사용할 수 도있고 JPA를 사용하는 경우가 있지만 개발자는 @Transactional 이라는 추상화된 계층을 사용하며 commit, rollback처리를 할 수 있게되는 것이다.