Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

빠르게 학습하고 빠르게 적용하자

스프링 개념 정복하기 - DI/IoC 본문

카테고리 없음

스프링 개념 정복하기 - DI/IoC

osoohynn 2025. 9. 7. 15:00

목차

  • 스프링/스프링부트
  • 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);
    }
}