Spring 핵심 원리 강좌 수강 후 정리

망7H·2021년 4월 25일
1

Kafka 관련 애플리케이션이나 Elasticsearch 관련 애플리케이션을 작성하려는데 Spring 프레임워크 관련 지식이 부족하여 인프런의 강좌 중 스프링 핵심 원리 - 기본편를 수강하고 몇 가지 기록해두고 싶은 것에 대해 포스팅하려 합니다.

객체 지향 설계

객체지향 개발의 5대 원리 SOLID

  • SRP (Single Responsibility Principle)
    단일 책임 원칙.
    작성된 클래스는 하나의 기능만을 가지며 클래스가 제공하는 서비스는 하나의 책임만을 가져야 한다.
  • OCP (Open Close Principle)
    개방폐쇄의 원칙.
    확장에는 열려있어야 하지만, 변경에는 닫혀 있어야 한다.
  • LSP (Liskov Substitution Principle)
    리스코브 치환의 원칙.
    서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
  • ISP (Interface Segregation Principle)
    인퍼테이스 분리의 원칙.
    자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
  • DIP (Dependency Inversion Principle)
    의존성역전의 원칙.
    실제 사용 관계는 바뀌지 않고, 추상을 매개로 컴포넌트 간의 관계를 단순화하기 위한 원칙이다.

이번에 참고했던 스프링 강좌에서는 스프링의 편리함을 보여주기 위해
기능을 확장할 때 클라이언트 코드가 영향을 받게 되는 OCP 위반인 것과
클라이언트 코드가 추상을 의존하여야 하는데 구현 클래스를 의존하는 것 DIP 위반을 해결하는 법을 알려주는 것으로 시작한다.

인터페이스에만 의존하도록 설계하라
역할과 구현을 분리하여 각각의 책임을 확실히 분리한다.
그리고, 역할에 맞는 구현을 넣어주는 설정을 사용한다.
(추후 @Configuration의 기능을 하게 되는 클래스)


스프링 컨테이너 & 스프링 빈

ApplicationContext(스프링 컨테이너)를 사용하여
@Configuration의 @Bean이 붙은 메서드를 스프링 컨테이너에 스프링 빈으로 등록한다.
(※ 스프링 빈으로 등록하도록 만드는 다른 어노테이션들도 있지만, 여기서는 @Configuration만 명시하였음.)
이렇게 등록한 빈을 조회하는 방법은 여러가지가 있는데, 그 중 아래의 방법들을 자주 사용함.
getBean(빈 이름, 빈 타입): 빈 이름과 타입으로 스프링 빈 조회 (2개 이상이면 오류 발생)
getBean(빈 타입): 빈 타입에 해당하는 스프링 빈 조회 (2개 이상이면 오류 발생)
getBeansOfType(빈 타입): 빈 타입에 해당하는 모든 빈 조회

아무튼, 스프링 빈을 조회하는 메서드는 여러가지가 있다.
ApplicationContext(스프링 컨테이너)는 파라미터로 전달받은 클래스 (또는 XML)를 사용하여 BeanDefinition 이라는 스프링 빈 설정 메타 정보를 만듬.
(좀 더 정확히 얘기하면 ---BeanDefinitionReader라는 걸 사용해서 BeanDefinition을 생성한다고 함.)
BeanDefinition에는 @Bean을 통해 만들어진 스프링 빈에 대한 메타 정보를 갖고 있음.
메타 정보 중 기억할만큼 중요한 몇 가지로는 Scope, InitMethodName, DestroyMethodName 정도가 있다. (물론 그 밖의 나머지 것들도 중요함.)

싱글톤 컨테이너

자바에서는 객체를 Singleton으로 생성하기 위해, instance 정적 변수를 사용하고, 생성자를 private으로 처리는 등의 코딩을 해주어야 한다.
하지만 스프링 컨테이너는 스프링 빈을 기본적으로 Singleton으로 관리한다.
어떻게 Singleton으로 관리할까?
스프링 컨테이너를 생성하고 설정 정보(CLASS or XML)를 지정했을 때, 이미 스프링 빈을 Singleton으로 생성한다.
getBean() 메서드를 사용해서 확인해보아도 스프링 빈을 조회할 때 생성되는 것이 아닌 이미 생성된 스프링 빈을 가져옴.

위와 같은 Singleton을 보장받기 위해서 @Configuration을 적용하고 @Bean을 사용하면 바이트코드를 조작할 수 있는 CGLIB 기술이 Singleton을 보장해준다.

@Autowired

@Autowired를 사용한 의존성 주입은 4가지 방식이 있음.
@Autowired가 동작하려면 당연히 스프링 컨테이너가 관리하는 스프링 빈이어야 한다.

  • 생성자 주입
    생성자 호출 시점에 1번만 호출되는 것 보장됨.
    해당 클래스가 스프링 빈으로 사용될 예정일 때 생성자가 1개이면 @Autowired를 생략해도 자동 주입 됨.
  • 수정자 주입 (setter)
  • 필드 주입 : 가장 안 좋은 방법
  • 일반 메서드 주입



강좌에는 포스팅에 적은 것 외에 많은 개념 정의와 예제 코드가 있다.
ex) 스프링 빈의 생명주기, 스코프 등..
본 포스팅은 기억 나는 것들을 의식의 흐름대로 적은 것이니 위 강좌가 비록 유료지만, 들어보는 것을 추천한다.
얕은 스프링 지식을 습득하였으니, 이에 애플리케이션 개발 포스팅을 주력으로 해보도록 해야겠다.

참고

https://www.nextree.co.kr/p6960/

profile
망한 개발자의 개발 기록입니다. 저를 타산지석으로 삼으시고 공부하세요.

0개의 댓글