Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- lambda
- n8n
- coroutine
- Interface
- GEMINI
- Workflow
- Java
- functional interface
- Security
- 오픈소스
- http-only cookie
- optional
- class
- S3
- AWS
- FCM
- 무중단배포
- Kotlin
- firebase
- 오픈소스 기여
- gemini cli
- 자동화
- spring boot
- AI
- WebFlux
- 홈서버
- Claude
- Quarkus
- bluegreen
Archives
- Today
- Total
빠르게 학습하고 빠르게 적용하자
스프링 개념 정복하기 - DI/IoC 본문
목차
- 스프링/스프링부트
- IoC / DI
- 스프링 컨테이너
- AOP
- PSA
- 핵심 코드 예제
- 문제 풀이
- 예외 해결 및 배운 점
1️⃣ 스프링과 스프링부트
✔ 스프링(Spring)
자바 기반 엔터프라이즈 애플리케이션을 효율적으로 개발하기 위한 프레임워크
- 대규모 서비스 개발에 적합
- 서버 성능, 안정성, 보안 등을 높은 수준으로 제공
✔ 스프링부트(Spring Boot)
스프링을 더 쉽게 사용할 수 있도록 만들어진 도구
- 프로젝트 설정 자동화 & 의존성 관리 간소화 (starter 제공)
- 내장 WAS(Tomcat 등) → 별도 서버 설치 없이 실행 가능
- 비즈니스 로직에 집중할 수 있도록 반복 설정 최소화
2️⃣ IoC (Inversion of Control, 제어의 역전)
- 기존 자바: 개발자가 직접 객체 생성 (new 키워드)
- IoC: 객체의 생성과 생명주기를 스프링 컨테이너가 관리
// 기존 방식
public class A {
B b = new B(); // 직접 생성
}
// IoC 적용
public class A {
private B b; // 생성은 컨테이너가 담당
}
3️⃣ DI (Dependency Injection, 의존성 주입)
- IoC를 구현하는 방법
- 외부에서 객체(빈)를 주입받아 사용
의존성 주입 방법
1. 필드 주입
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
}
2. 생성자 주입 (권장)
@Service
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
3. 메서드(setter) 주입
@Service
public class MyService {
private MyRepository myRepository;
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
4️⃣ 스프링 컨테이너 & 빈
- 스프링 컨테이너: 빈을 생성하고 관리하는 주체
- 빈 등록 방법
- @Component (가장 간단, 클래스 직접 수정 가능할 때)
- @Configuration + @Bean (외부 라이브러리 객체 등록 시 사용)
5️⃣ AOP (Aspect Oriented Programming)
- 관점 지향 프로그래밍
- 핵심 로직과 부가 기능(로깅, 보안, 트랜잭션 등)을 분리 → 유지보수성 향상
6️⃣ PSA (Portable Service Abstraction)
- 이식 가능한 추상화
- 다양한 기술을 추상화하여 하나의 인터페이스로 사용 가능
- DB: JDBC, JPA, MyBatis
- 실행: WAS (Tomcat, Jetty 등)
7️⃣ 핵심 코드 예제
✔ 의존성 주입
@Component
public class Chef { }
@Component
public class Restaurant {
private final Chef chef;
public Restaurant(Chef chef) {
this.chef = chef;
}
}
✔ 편집 불가 클래스 빈 등록
public class Chef { } // 수정 불가
@Configuration
public class ChefConfig {
@Bean
public Chef chef() {
return new Chef();
}
}
✔ 테스트 코드
@SpringBootTest
class SampleTest {
@Autowired private Restaurant restaurant;
@Test void test() {
System.out.println(restaurant);
}
}