728x90
스프링 프레임 워크 특징
- 02 스프링 프레임 워크의 특징
- POJO
- Plain Old Java Object
- 다른 기술은 사용하지 않고 순수 Java만을 통해서 생성한 객체
- == Java및 Java 스펙에 정의된 기술만을 사용
- POJO의 반대되는 상황
- 외부 라이브러리를 import 하여 상속 받아 객체 생성
- 상속 받은 객체의 변경 발생
- 해당 기술을 사용하고 있는 모든 객체 코드 변경 필요
- 외부 모듈에 직접적으로 의존하기 때문에 발생하는 문제
- POJO의 장점
- 특정 규약의 변화에 얽매이지 않고 유연하게 변화와 확장에 대처가능
- 객체지향 설계를 제한 없이 적용 가능
- 코드가 단순해지고 테스트와 디버깅 용이
- 제어 역전(IoC, Inversion of Control)
- 객체의 생명주기 관리를 외부 (Spring 컨테이너 , Ioc 컨테이너)에 위임
- 제어역전을 통해 의존성 주입(DI) 와 관점지향 프로그래밍(AOP)이 가능
- 예시 1 ) 아래 두 코드는 동일한 코드지만 두번째 코드가 객체의 생명주기 관리를 외부에 위임해서 의존성을 주입한 것이다.
- A 가 B에대해서 의존하고 있는 코드 ,
- A는 B를 생성자에서 생성하여서 직접관리해줘야한다 (사용후 소멸까지도)
publicclassA{ publicB b; publicA() { b =newB(); } } |
- 제어역전을 통한 의존성 주입코드
- A는 B에 의존하지만 직접 관리하지 않고, @Atowired 어노테이션을 통해서 외부 IoC컨테이너에서 b에 객체를 넣어준다.
publicclassA{ @AutoWired publicB b; } |
- 예시 2 )
- 제어역전이 없는 코드
// 서비스 클래스 publicclassMyService{ privateMyRepository repository; publicMyService() { this.repository =newMyRepository();// 직접 객체 생성 } // 비즈니스 로직 메서드 publicvoiddoSomething() { // MyRepository의 메서드 호출 this.repository.doSomeDataManipulation(); } } // 리포지토리 클래스 publicclassMyRepository{ // 데이터 조작 메서드 publicvoiddoSomeDataManipulation() { // 데이터 조작 로직 } } // 메인 클래스 publicclassMain{ publicstaticvoidmain(String[] args) { MyService service =newMyService(); service.doSomething(); } } |
- 제어역전을 적용한 코드
// 서비스 클래스 - Spring의 @Autowired를 사용하여 의존성 주입 @Service publicclassMyService{ privateMyRepository repository; @Autowired publicMyService(MyRepository repository) { this.repository = repository;// Spring이 주입해줌 } // 비즈니스 로직 메서드 publicvoiddoSomething() { // MyRepository의 메서드 호출 this.repository.doSomeDataManipulation(); } } // 리포지토리 클래스 - Spring의 @Repository로 빈 등록 @Repository publicclassMyRepository{ // 데이터 조작 메서드 publicvoiddoSomeDataManipulation() { // 데이터 조작 로직 } } // 메인 클래스 - Spring IoC 컨테이너를 사용하여 객체 생성 및 의존성 주입 publicclassMain{ publicstaticvoidmain(String[] args) { ApplicationContext context =newAnnotationConfigApplicationContext(AppConfig.class); MyService service = context.getBean(MyService.class); service.doSomething(); } } |
- 위 코드에서, Spring의 @Service, @Repository 어노테이션을 사용하여 클래스를 서비스나 리포지토리로 등록하고, @Autowired 어노테이션을 통해 의존성 주입을 수행합니다. 또한 ApplicationContext를 생성하여 Spring IoC 컨테이너를 초기화하고, getBean() 메서드를 사용하여 필요한 빈(Bean)을 가져옵니다. 이를 통해 객체 생성과 의존성 관리를 Spring 프레임워크가 담당하게 됩니다.
- 의존성 주입(DI, Dependency Injection)
- 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
- Ioc 와 DI
- 스프링 프레임워크를 사용하여 IOC 컨테이너에서 생성한 B, D, C, E, F 객체를 이용하여 A 객체를 생성하고 A 객체에서 외부에서 생성된 객체를 주입받아 사용하는 방법을 보여줍니다.
- 아래 예시 코드에서는 스프링 프레임워크를 사용하여 IOC 컨테이너에서 생성한 B, D, C, E, F 객체를 이용하여 A 객체를 생성하고 A 객체에서 외부에서 생성된 객체를 주입받아 사용하는 방법을 보여줍니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
// 외부에서 직접 생성되는 객체 A
@Component
public class ObjectA {
private ObjectB objectB;
private ObjectC objectC;
@Autowired // IOC 컨테이너에서 주입될 의존성을 나타냄
public ObjectA(ObjectB objectB, ObjectC objectC) {
this.objectB = objectB; // IOC 컨테이너에서 생성된 B 객체 주입
this.objectC = objectC; // IOC 컨테이너에서 생성된 C 객체 주입
}
// A에 대한 동작 또는 속성
}
// 객체 B는 IOC 컨테이너에서 생성됨
@Component
public class ObjectB {
// B에 대한 동작 또는 속성
}
// 외부에서 생성된 객체 C
@Component
public class ObjectC {
// C에 대한 동작 또는 속성
}
// 객체 D는 IOC 컨테이너에서 생성됨
@Component
public class ObjectD {
private ObjectE objectE;
private ObjectF objectF;
@Autowired // IOC 컨테이너에서 주입될 의존성을 나타냄
public ObjectD(ObjectE objectE, ObjectF objectF) {
this.objectE = objectE; // IOC 컨테이너에서 생성된 E 객체 주입
this.objectF = objectF; // IOC 컨테이너에서 생성된 F 객체 주입
}
// D에 대한 동작 또는 속성
}
// 외부에서 생성된 객체 E
@Component
public class ObjectE {
// E에 대한 동작 또는 속성
}
// 외부에서 생성된 객체 F
@Component
public class ObjectF {
// F에 대한 동작 또는 속성
}
|
cs |
- 위의 코드에서 @Component는 Spring에서 해당 클래스를 Bean으로 등록하기 위한 어노테이션입니다. 그리고 @Autowired는 스프링이 해당 클래스의 인스턴스를 생성할 때, 해당 클래스의 생성자에 필요한 의존성을 주입할 때 사용됩니다.
- 여기서 ObjectA 클래스의 생성자에서 ObjectB와 ObjectC를 주입받고 있으며, 이는 IOC 컨테이너에서 생성된 객체들을 주입받고 있다는 것을 나타냅니다. 이렇게 하면 외부에서 생성된 객체들을 IOC 컨테이너가 주입하여 A 객체에서 사용할 수 있게 됩니다.
추천인 코드 : o6i4B3y95 : 앨리스트랙 참여 링크
#엘리스트랙 #엘리스트랙후기 #온라인코딩부트캠프 #온라인코딩학원 #백엔드학원 #개발자국비지원 #개발자부트캠프 #국비지원부트캠프 #DOCKER #백엔드 #자바스프링 #스프링강의 #백엔드인강 #RESTAPI #스프링개발자
728x90
'Elice --Cloud--Track > 4~7 주차' 카테고리의 다른 글
7주차 블로그 챌린지 - 1차 스터디 팀 발표 (1) | 2024.01.07 |
---|---|
5주차 블로그 챌린지 - Spring Framework (3) - JDBC (0) | 2023.12.24 |
5주차 블로그 챌린지 -Spring Framework (0) | 2023.12.24 |
5주차 블로그 챌린지 -js (0) | 2023.12.24 |
4주차 블로그챌린지- 리눅스 기초 (1) (1) | 2023.12.17 |