[CS] Spring 에 관련해서 정리

장준혁·2024년 5월 15일

computer science

목록 보기
9/11
post-thumbnail

최근들어 코딩테스트 공부만을 지속 하다 보니 기존에 알고 있던 cs지식 들이 점점 잊혀져 가고 있음을 자각 했다.

이번 글에서는 점점 사라지고있는 spring 및 java에 관련 된 cs에 대해서 작게나마 정리 해 보겠다.

🤔 Spring 이란?

엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크 이다.

결국 Java 기반으로 애플리케이션 을 개발하기 위한 프로그래밍 기술의 집합, 애플리케이션을 개발하기 위해서는 많은 코드들과 기술이 필요한데 이런 대중적인 기술들을 더 쉽게 사용할 수 있도록 제공 해주는 오픈소스 프레임 워크 인 것 이다.

spring 을 사용할 때 적용시킬 기술들을 선택해서 사용 할 수 있으며 다양한 기술의 버전이 충돌 함에 따라 얻는 문제점들은 spring boot 에서 자동적으로 버전 관리를 함으로써 해결 된다.

설정 문제를 boot에서 간단히 해결 할 수 있기 때문에 개발자는 비지니스 로직을 구현하는데 더 집중 할 수 있다.

📚 Spring 특징

📗 POJO(Plain Old Java Object)

위 이미지는 IoC/DI, AOP, PSA를 통해 POJO를 만족할 수 있다는 것을 의미 한다.

Plain Old Java Object는 순수하게 java로 설계됨으로써 java의 특성인 객체 지향을 만족하면서 필요에 따라 재활용 될 수 있어야 한다.

POJO에 애플리케이션의 핵심 로직과 기능을 담아서 설계하고 개발하는 방식을 POJO 프로그래밍 이라고 한다.

만약 순수 java에서 제공하는 기술이 아닌 외부 기술을 적용하여 로직을 작성할 경우 추후 해당 기술이 신기술로 교체되거나 더이상 지원되지 않음에 따라 변경이 필요할 경우 해당 기술이 적용된 모든 코드를 변경 해줘야 한다.

📌 POJO 프로그래밍이 필요한 이유

  • 특정 환경 과 기술에 적용되지 않을때 재사용이 가능하고 확장이 가능하다.
  • 환경에 종속적인 코드를 제거 함으로써 코드가 간결해지고 디버깅하기에 유리 하다
  • 특정 기술과 환경에 종속적이지 않기 때문에 테스트가 단순 해진다.
  • 객체지향적인 설계를 적용 할 수 있다.

📗 IOC (Inversion Of Control)

번역 하면 제어의 역전 이라고 칭할 수 있겠다.

비즈니스 로직을 작성하다보면 객체를 생성하는 경우가 잦은데 객체를 생성할때마다 매번 생명주기를 하나하나 직접 관리하기는 번거롭다고 생각한다.

따라서 매번 객체를 생성 하고 생명주기를 관리 하는 것을 스프링 컨테이너가 담당함에따라서 개발자의 부담을 덜어준다.

기존에 객체의 생성 및 생명유지를 위해 작성 된 코드들이 빠지면서 코드가 간결해지고 보다 관리함에 있어서 안정성이 좋아 질 것 이다.

📗 DI (Dependency Injection)

의존관계 주입 또는 의존성 주입 이라고 부르며 DI는 외부에서 객체 간의 관계(의존성)를 결정해 주는데 즉, 객체를 직접 생성하는 것이 아니라 외부에서 생성후 주입시켜 주는 방식이라고 할 수 있다.

class A{
	new b = new B();
    생략
}

class B{
	생략
}

예를들어 A 클래스가 B클래스를 이용할 때 A는 B에 의존한다 라고 표현 할 수 있을 것 이다.
A는 B없이는 작동 할 수 없으며 의존대상인 B가 변경된다면 A에게 영향을 미치게 되며 강한 결합도를 가진다.

내부에서 B가 정의 되어 작동 하지않고 B클래스를 추상화 하여 정의하고 외부에서 정의된 B 객체가 주입된다면 B클래스가 추상화 범위 내에 변경 된다 하더라도 A 클래스가 변경되지 않도록 할 수 있게되며 결합도를 낮출 수 있다.

Spring에서 DI 방법에는 총 3가지가 있다.

  • 생성자 주입
  • 필드 주입
  • Setter 주입

✔ 생성자 주입

현재 가장 권장되는 의존 관계 주입은 생성자 주입 방식이다.
spring 공식 문서에서도 생성자 주입을 권장 하고 있으며 Lombok을 사용 한다면 @RequiredArgsConstructor를 통해서 의존성 주입이 가능하다.

생성자 주입은 생성자의 호출 시점에 1회 호출되는 것이 보장된다. 그렇기 때문에 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용할 수 있다.

@Service
pulbic class UserService {
	// final 붙일 수 있음
	private final UserRepository userRepository;

	// @Autowired (생략 가능)
	public UserService(UserRepository userRepository) {
		this.userRepository= userRepository;
		}
}

✔ 필드 주입

Intellij 에서 필드 주입방식을 사용 할 경우 Field injection is not recommended 경고 문구가 발생한다.

외부에서 수정이 불가능하므로 수정이 불가능한 필드 주입은 테스트 코드를 작성 함에 있어서는 사용가치가 떨어질 수 있다.


@Service
public class UserService {
	@Autowired
	private UserRepository userRepository;
}

✔ setter 주입

주입받는 객체가 변경될 가능성이 있는 경우에 주로 사용한다.

private class UserService {
	private UserRepository userRepository;
	@Autowired
	public void setUserRepository(UserRepository userRepository) {
		this.userRepository = userRepository;
	}
}

📗 AOP(Aspect Oriented Programming)

관점 지향 프로그래밍이라고 불린다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것.
공통된 로직이나 기능을 하나의 단위로 묶는 것을 모듈화라 칭한다.

만약 구현 코드의 기능이 조금씩 다르고 각 코드의 로깅, 성능을 측정하는 부분의 코드는 같다고 가정 했을때 로깅, 성능 측정 부분의 코드는 하나로 묶을 수 있을 것이다.

위와 같이 수정한다면 핵심 구현 코드의 수정은 필요하지 않으면서 공통 기능은 묶게 된다.

관점 지향 프로그래밍에서는 소스코드에서 반복적으로 사용하는 코드를 하나로 묶어서 모듈화하여 재사용성과 유지 보수성을 높일 수 있는 강점을 가지고 있다.

spring에서는 런타임 시점에 프록시 객체를 생성하여 공통 기능을 삽입 하는 방식으로 AOP를 구현 한다.

  • Aspect - 공통적인 기능들을 모듈화 한것을 의미.
  • Target - Aspect가 적용될 대상을 의미하며 메소드, 클래스 등이 이에 해당.
  • Join point - Aspect가 적용될 수 있는 시점을 의미하며 메소드 실행 전, 후 등이 될 수 있다.
  • Advice - Aspect의 기능을 정의한 것으로 메서드의 실행 전, 후, 예외 처리 발생 시 실행되는 코드를 의미.
  • Point cut - Advice를 적용할 메소드의 범위를 지정한다.

프록시는 메서드 오버라이딩 개념으로 동작하기 때문에, 스프링 AOP는 메서드 실행 시점에만 AOP를 적용 할 수 있고 스프링 컨테이너가 관리할 수 있는 빈에만 적용 가능하다.

참고

https://velog.io/@sujin1018/%EC%8A%A4%ED%94%84%EB%A7%81-Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EB%B0%A9%EB%B2%95-%EB%B0%8F-%EC%83%9D%EC%84%B1%EC%9E%90-%EC%A3%BC%EC%9E%85-%EB%B0%A9%EB%B2%95%EC%9D%98-%EC%9E%A5%EC%A0%90

https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

profile
wkd86591247@gmail.com

0개의 댓글