스프링 IoC 컨테이너, record

고승원·2022년 11월 1일
0

TIL

목록 보기
4/24

의존성

  • 컴파일 타임 의존성 : 코드를 작성하는 시점에 발생하는 의존성 (클래스간 의존성)
  • 런타임 의존성 : 애플리케이션이 실행되는 시점의 의존성 (객체간 의존성)

IoC(제어의 역전)

  • 라이브러리는 애플리케이션이 흐름을 직접 제어하지만 프레임워크는 프레임워크(IoC 컨테이너)가 흐름을 주도하여 애플리케이션의 코드를 사용한다.
  • Service에서 직접 Repository, Service를 생성하지 않고 객체를 만드는 제어권을 IoC컨테이너(OrderContext)에 넘긴다.

스프링에서의 IoC 컨테이너

  • 스프링에서 IoC컨테이너는 ApplicationContext이다.
  • ApplicationContext는 BeanFactory를 상속하는데 BeanFactory는 빈을 관리하고 조회하는 역할이다.
  • ApplicationContext는 빈을 관리하고 조회하는 역할 외에도 애플리케이션 개발에 필요한 부가기능을 제공한다(환경변수, 국제화, 이벤트 등)
  • POJO(빈) 생성, 서비스, 소멸 권한

스프링 빈을 컨테이너에 등록하는 방법

  1. 컴포넌트 어노테이션

    @Component 어노테이션을 사용하면 스프링이 자체적으로 등록한다.

    @Controller @Service등 Component 어노테이션을 상속받고 있는 어노테이션도 동일하다.

    의존성을 주입하고 싶으면 @Autowired 어노테이션을 사용한다.

    @Controller
    @RequestMapping("/basic")
    public class BasicController {
    	
    	...
    }
  2. Bean Configuration에 직접 등록

    @Configuration과 @Bean 어노테이션을 이용해 등록한다.

    의존성 주입은 Setter로 한다.

    @Configuration
    public class ApplicationConfig {
        @Bean
        public BasicController sampleController() {
            return new SampleController;
        }
    }
  3. XML 파일로 설정

    claass = 자바 Class이름 (필수)

    id = bean 의 id

    scope = 객체의 범위 (singleton, prototype 등등)

    constructor-arg = 생성 시 생성자에 전달할 인수

    property = 생성 시 bean setter에 전달할 인수

    init-method, destroy-method

    <bean id="아이디" class="클래스이름" scope="스코프종류 ....>
    		<property name="이름" value="내용"/>
    </bean>

스프링에서의 빈 객체 관리하는 방법

스프링 컨테이너는 파라미터로 넘어온 Config 정보(메타데이터)를 사용해 빈을 등록한다.

[bean 메서드명 / bean 객체] 형식으로 저장한다. 이때 객체는 싱글톤으로 관리한다.

설정 정보를 참고해서 의존관계를 주입한다.


DDD(Domain Driven Design)

  • 어플리케이션의 비즈니스 Domain별로 나누어 설계 및 개발하는 방식
  • DDD의 핵심 목표는 결합도를 낮추고 응집도를 높이는 것.

플로우

  1. Domain Event 정의 : 도메인 내에 발생하는 모든 이벤트 과거형으로 기술
  2. Tell the Story : 1번에 대해 토론하여 보완
  3. Process Grouping : 2번에서 나온 이벤트들을 프로세스별로 그룹화한다. (주문, 취소, 조회 등등)
  4. Command 정의 : Event별로 발생시키는 명령형을 현재시제로 정의한다.
  5. Trigger 정의 : 4를 일으키는 Actor와 Event를 일으키는 External System/Rule을 정의
  6. Aggregate 정의 : Command 수행을 위해 CRUD 해야하는 데이터 객체 정의 /
    여기서 Aggregate 고유 비즈니스 목적 수행을 위한 데이터 객체들의 집합이다.
    유사한 목적의 데이터들을 하나로 묶는다. 이걸 Entity라고 한다.
  7. Bounded Context 정의 : 지금까지 만든 표를 보며 비즈니스 목적별로 그룹핑한다.
  8. Context Map : 7을 기준으로 그룹간 관계를 도식화 한다. (Upstream - Downstream)

Record

자바14부터 등장했다.

데이터 클래스로 순수하게 데이터를 보유하기 위한 특수한 클래스이다.

주로 Entity, DTO에 사용된다.

  • record 클래스는 final 클래스라 상속이 불가능하다.
  • 각 필드는 private final 필드로 정의된다.
  • 모든 필드를 초기화하는 생성자가 있다.
  • 각 필드명을 딴 getter() 가 있다. SampleHuman.name()
  • equals, hashCode, toString 메서드가 자동 생성된다.

변경 전

public class SampleHuman {
	private final String name;
	private final Integer age;
	private final Address adress;

	public SampleRecord(String name, Integer age, Address address) {
		this.name = name;
	  this.age = age;
	  this.address = address;
	}
	 
	public String getName() {
		return name;
	}
	 
	public Integer getAge() {
		return age;
	}
	 
	public Address getAddress() {
	   return address;
	}
}

필드와 필드를 초기화하는 생성자 그리고 게터가 있다. 위와 같은 클래스는 record타입 클래스로 변경이 가능하다.

변경 후

public record SampleHuman(
	String name,
	Integer age,
	Adress adress
) {}

정리

스프링은 IoC 컨테이너(스프링 컨텍스트)에서 컴포넌트 스캔을 이용하여 빈을 등록한다.

빈을 등록하는 방법은 크게 @Component, @ApplicationConfig, XML 세가지이다.

빈은 [bean 메서드 이름 / bean 객체] 형식으로 싱글톤 방식으로 생성된다.

메타데이터를 통해 빈 객체간 의존성을 부여한다.

DDD는 도메인 중심 설계 및 개발이다.

이벤트 정의 → 그룹화 → 이벤트 명령어 정의 → 명령어의 Actor/Rule 정의 → 명령어 수행을 위한 Agregate(데이터 객체)정의 → 비즈니스 목적별로 그룹핑 → 그룹핑 관계 도식화

Record

데이터를 보유하기 위한 클래스이다.

자동으로 생성자, 게터, toString, equals, hashCode 생성.

profile
봄은 영어로 스프링

0개의 댓글