티스토리 뷰
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
'Java, Spring' 카테고리의 다른 글
[스프링] 템플릿/콜백 패턴 (0) | 2025.04.09 |
---|---|
[토비의 스프링] 테스트 (0) | 2025.04.07 |
Map과 HashTable 알아보고 Java의 HashMap 코드 뜯어보기 (1) | 2023.08.30 |
PageRequest, Page, PageImpl (0) | 2023.02.03 |
스프링부트의 다중요청 처리 - Tomcat9 Thread Pool & JAVA NIO (0) | 2022.05.01 |
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Spring
- php
- NoSQL
- MySQL
- Container
- database
- 스프링
- mongoDB
- laravel
- springboot
- 쿠버네티스
- mockery
- kubernetes
- docker
- 카프카
- phpUnit
- devops
- Infra
- 분산처리
- 몽고디비
- kafka
- 대규모 데이터 처리
- JUnit
- java
- index
- k8s
- 샤딩
- AOP
- 라라벨
- laravel 테스트코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함