티스토리 뷰

Java, Spring

[스프링] IoC, DI

집사킴 2025. 4. 4. 12:35
728x90

객체지향 설계의 기본 원칙

  • 관심사의 분리하도록 리팩토링
    • DB 커넥션 생성 역할과 DB 조회 역할의 객체를 분리
    • 인터페이스를 두고 구현 방식에 따라 여러 구현체를 사용. 분기처리를 대신함. 전략패턴
  • 개방폐쇄원칙 OCP
    • 타 객체로부터의 의존도를 낮춰 타 객체 변경에도 영향을 받지 않고, 자신은 확장성을 열어둠

스프링이란 바로 지금까지 설명한 객체지향적 설계 원칙과 디자인 패턴에 나타난 장점을 자연스럽게 개발자들이 활용할 수 있게 해주는 프레임워크다.

 

제어의 역전 (IoC

  • 오브젝트 간의 관계를 맺는 작업의 제어권을 별도의 오브젝트 팩토리를 만들거나 이를 일반화한 IoC 컨테이너에게 위임함
  • 오브젝트가 자신이 사용할 대상의 생성이나 선택의 책임으로부터 자유로워짐
  • IoC는 기본적으로 프레임워크만의 기술도 아니고 프레임워크에게 꼭 필요한 개념도 아니다. 단순하게 생각하면 디자인 패턴에서도 발견할 수 있는 것 처럼 상당히 폭넓게 사용되는 프로그래밍 모델이다.

 

스프링의 IoC

  • 빈 (Bean): 스프링에서 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
  • 빈 팩토리(Bean Factory): 빈 생성과 관계 설정 등의 제어를 담당하는 IoC 오브젝트
  • 애플리케이션 컨텍스트 (Application Context)
    • 빈 팩토리의 확장 개념. 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진.
    • 별도의 정보를 참고하여 Bean 생성, 관계 설정 등의 제어 작업을 총괄
    • IoC 컨테이너라고도 함
    package com.example.fastcampusmysql.config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    
    @Configuration
    public class RedisConfig {
    
        @Value("${spring.redis.host}")
        private String host;
    
        @Value("${spring.redis.port}")
        private int port;
    
        @Bean
        public RedisConnectionFactory redisConnectionFactory() {
            return new LettuceConnectionFactory(host, port);
        }
    
        @Bean
        public RedisTemplate<?, ?> redisTemplate() {
            RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory());
            return redisTemplate;
        }
    }
  • 애플리케이션 컨텍스트의 동작 방식
    • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다
    • 애플리케이션 컨텍스트는 오브젝트 생성, 관계설정 뿐 아니라 생성 방식, 시점, 전략 관리, 후처리 등 종합 IoC 서비스를 제공해준다
    • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다

 

 

싱글톤 레지스트리 (Singleton Registry)

  • 엔터프라이즈 서비스에서 매 요청마다 객체를 생성하면 객체가 너무 많아짐. 아무리 GC 성능이 좋아져도 이 경우 부하 걸릴 수 있음.
  • 싱글톤 패턴: 애플리케이션 안에 제한된 수, 대개 한 개의 오브젝트만 만들어서 사용하는 것
  • 전통적인 싱글톤 패턴의 한계
    • private 생성자를 갖고있어 상속 불가
    • 만들어지는 방식이 제한적이어서 테스트가 어려움
    • 서버 환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못함
    • 전역 상태를 만들 수 있어 OOP에서는 권장하지 않는 모델임
  • 싱글톤 레지스트리
    • 스프링에서 직접 싱글톤 형태의 오브젝트를 만들고 관리해주는 기능
    • 스태틱 메소드와 private 생성자를 사용하지 않고도 싱글톤 활용 가능
  • 싱글톤을 멀티스레드 환경에서 사용할 때의 주의점
    • 무상태(stateless) 방식으로 만들어져야 함
    • 요청에 대한 정보, DB나 서버 리소스로부터 생성한 정보는 파라미터와 로컬 변수, 리턴 값 등을 이용해서 처리
    • 읽기전용 속성을 가진 정보라면 인스턴스 변수로 정의해도 괜찮음. static final 선언

 

의존관계 주입 (DI)

  • DI 컨테이너에 의해 런타임 시 의존 오브젝트를 사용할 수 있도록 그 레퍼런스를 전달받는 과정이 마치 DI 컨테이너가 대상 빈에게 주입해주는 것과 같다고 하여 이를 ‘의존관계 주입’이라고 부른다
  • DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념과 잘 들어맞는다

 

// 생성자 주입 방식
public class UserDao {
    private ConnectionMaker connectionMaker;

    public UserDao(ConnectionMaker connectonMaker) {
            this.connectionMaker = connectionMaker;
    }

}


// setter 주입 방식
public class UserDao {
    private ConnectionMaker connectionMaker;

    public void setConnectionMaker(ConnectionMaker connectionMaker) {
            this.connectionMaker = connectionMaker;
    }
}

 

<!-- XML 설정 방식 -->
<beans>
    <bean id="connectionMaker" class="springbook.user.dao.DConnectionMaker" />

    <bean id="userDao" class="springbook.dao.UserDao">
            <property name="connectionMaker" ref="connectionMaker" />
    </bean>
</beans>

 

 

XML에서 Property 주입하기

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="org.gjt.mm.mysql.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost/testdb" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="initialPoolSize" value="5" />
    <property name="maxPoolSize" value="30" />
    <property name="minPoolSize" value="5" />
    <property name="acquireIncrement" value="3" />
    <property name="acquireRetryAttempts" value="30" />
    <property name="acquireRetryDelay" value="1000" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="preferredTestQuery" value="SELECT 1" />
    <property name="testConnectionOnCheckin" value="true" />
    <property name="testConnectionOnCheckout" value="false" />
</bean>

 

 

 

참고: https://product.kyobobook.co.kr/detail/S000000935358

 

토비의 스프링 3.1 Vol 1: 스프링의 이해와 원리 | 이일민 - 교보문고

토비의 스프링 3.1 Vol 1: 스프링의 이해와 원리 | 대한민국 전자정부 표준 프레임워크 스프링을 설명하는 No. 1 베스트셀러! 단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나

product.kyobobook.co.kr

 

728x90
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함