- 1강 : 스프링 프레임워크
특징 : dependency Indection, tarnsaction managment을 지원
모듈 결합을 쉽고 깔끔하게 할 수 있는 매력
웹 개발의 형태가 Java (SE) + Java EE → Java (SE) + Spring 형태로 변화
웹 개발에 필요한 요소 : MVC, 트랜잭션, 인증과 권한
+ 추가로 필요한 요소 : DI, AOP, Servlet Filter // 느슨한 결합력과 인터페이스
DI : Dependency Injection
AOP : Aspect Oriented Programming
- 2강 : 느슨한 결합력과 인터페이스
UI - Service - DAO - DB
DAO파일 중 B1을 바꾸려할 때 : 1) B1을 직접 수정한다. 2) B2를 만들어서 덮어쓴다.
1) 기존 파일을 건들여야 하는 부담
2) 방법을 선택할 때 Service에서도 연결관계를 수정해야 하는 불편함이 발생(높은 결합력)
-> B1, B2를 사용하지 않고, B라는 클래스를 사용(인터페이스: 기능만을 담은 클래스)
B를 통해 B1, B2와 연결할 때, 기존 소스코드를 건들지 않고 전환하기 위해 생성과 조립을 위한 외부 설정을 사용 ← 스프링
(자바 객체지향 강의 33강 참고)
※ DAO : Data Access Object
- 3강 : DI(Dependency Injection) = 부품을 조립한다
의존성(종속성) 주입보단 '부품 조립'으로 해석하는게 더 직관적.
* 일체형: 클래스 A를 만들기 위해 클래스 B를 요소(부품)로 가지고 있는 것. b를 클래스 A 내부에서 생성
* 조립형: b를 클래스 A 외부에서 생성. set을 통해 클래스 A 조립에 사용
일체형보다 조립형으로 만들때 결합력을 낮출 수 있다
부품이라는 객체를 dependency라고 하고, 부품을 조립체에 꽂는 것을 Injection이라 한다.
setter를 통해 주입(조립) or 생성자를 통해 주입(조립) : 조립하는 과정(불필요함)이 발생 -> '스프링'을 통해 과정을 단축
- 4강 : IoC 컨테이너
조립을 위해 필요한 부품들이 담긴 컨테이너.
작은 부품들로부터 큰 부품을 만들어감(결합형).
큰 부품에서 작은 부품을 만들어가는 일체형과 다른 특징(조립의 순서)을 강조하기 위해 DI Container 대신 IoC Container라는 용어를 사용.
XML, Annotation를 통해 주문서를 작성할 수 있다
※ IoC : Inversion of control(제어의 역행)
- 5강 : dependency injection 실습 : 생성자를 통한 결합
Exam exam = new NewlecExam();
ExamConsole console = new InlineExamConsole(exam);
// DI1: InlineExamConsole이 exam을 조립하고 있기 때문
ExamConsole console = new GridExamConsole(exam);
// DI2: GridExamConsole이 exam을 조립하고 있기 때문
/*
그러나 우변의 매서드를 수정해야 하는 (inlineExamConsole ↔ GridExamconsole) 번거로움이 발생한다.
따라서 우변을 대신할 설정을 빼서 직접 변경하지 않도록 한다
스프링 같은 모듈의 도움을 받을 예정
*/
console.print();
- 6강 : Spring DI위한 이클립스 플러그인 설치
지시사항에 대한 안내를 스프링에게 해야 함 : XML or Annotation
- 7강 : 스프링 DI 지시서 작성
- from Program.java main()
Exam exam = new NewlecExam();
ExamConsole console = new GridExamConsole();
console.setExam(exam);
/*
NewlecExam(), GridExamConsole() 메서드가 바뀌는 상황을 가정했을 때,
직접 NewlecExam, GridExamConsole을 바꿔저야 할 뿐만 아니라, 결합관계: console.setExam(exam) 또한 바뀌어야 됨
ExamConsole console = ?; 를 어떻게 만들지에 대한 고민이 필요
→ 스프링에게 지시하는 방법으로 코드를 변경 할 것: xml 파일
Exam exam = new NewlecExam(); // 생성
ExamConsole console = new GridExamConsole(); // 연결
console.setExam(exam); // 결합
*/
ExamConsole console = ?;
console.print();
- from setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); <생성> 을 다음과 같이 만듬 -->
<bean id="exam" class="spring.di.entity.NewlecExam" />
<!-- 단, 클래스명은 패키지명을 함께 써서 중복을 방지한다 -->
<!-- 같은 형식의 클래스가 존재하지 않는 경우에는 id를 생략할 수 있다 -->
<!-- ExamConsole console = new GridExamConsole(); <연결> -->
<!-- <bean id="console" class="spring.di.ui.GridExamConsole" /> --> <!-- 아래에 설명을 위해 중복되어 있어서 주석처리 -->
<!-- console.setExam(exam); <결합> -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- <property name="exam" value="" 또는 ref="" /> -->
<property name="exam" ref="exam" />
<!-- property 태그의 name="setExam"을 → name="exam"으로 사용하는 묵시적인 규칙이 있다 -->
<!-- set 지우고, 맨 앞 글자를 소문자로 변경 -->
<!-- "console"이 setExam이라는 setter 함수를 가지고 있어야 가능하다 -->
<!-- <생성> 단계에서 만든 참조변수(exam)을 value="" 혹은 ref=""에 삽입 -->
<!-- 참조변수의 타입(spring.di.entity.NewlecExam의 객체)이 value일 때 value에, reference 타입일 때 ref에 넣는다 -->
<!-- exam은 reference 타입에 해당 --> <!-- Q. value타입과 reference 타입 구분 어떻게? -->
</bean>
</beans>
- 8강 : Spring IoC 컨테이너 이용(Application Context)
기본구문 : ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
지시서을 읽어서 생성, 조립해주는 스프링의 객체 : ApplicationContext
* ApplicationContext의 종류
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
- AnnotationConfigApplicaitonContext
(※ 메이븐 강의 꼭 듣는 것을 추천)
메이븐으로 변경, pom.xml - dependencies - add - springframework 검색 후 ok*
(* 인덱스가 조회되지 않는 경우: show view - other - maven repository - global repositories 아래에 인덱싱 되나 확인 - 오른쪽 버튼 눌러서 rebuild index 클릭, 한 시간 정도 소요될 수 있다)
설치 : maven repository - Spring Context 검색 - 클립보드 복사 - pom.xml 상단의 version, build 사이에 삽입
설치가 완료되면 ApplicationContext를 import 해서 사용 할 수 있게 된다
// 8강: 스프링 IoC 컨테이너 사용하기
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
/* ExamConsole console = ?;의 작업 <아래>, 자료형 명으로 꺼내는 방법 선호 : 형변환x, 클래스명 깔끔하게 설정 가능 */
// 이름으로 꺼내는 방법
ExamConsole console = (ExamConsole) context.getBean("console");
// setting.xml의 <bean id="console" class="spring.di.ui.GridExamConsole">을 가져오는 방법에 해당
// 'ApplicationContext context ='의 context, bean id="console"을 이용
// cf. 단점: bean의 이름(id)을 가지고 꺼낼 경우 형변환(cast)를 해야 함
// 자료형 명으로 꺼내는 방법
ExamConsole console = context.getBean(ExamConsole.class);
// 'ExamConsole의 클래스를 사용해서 찾겠다'
console.print();
- 15강 어노테이션을 사용한 객체 생성
bean 객체를 어노테이션으로 생성
1) 클래스 위에 @Component를 사용
2) 스프링에서 읽을 수 있도록 xml에 설정이 필요
<context:component-scan base-package="spring.di.ui" />
<context:component-scan ~>의 설정을 통해, <context:annotation-config />를 생략해도 해당 위치를 읽게 된다
→ @autowired의 탐색을 설정하지 않아도 됨
두 개의 패키지를 탐색하고 싶다면 base-package="경로1, 경로2"와 같이 설정이 가능
@Component("console") 처럼 이름을 부여할 수 있다.
- 16강 @Component의 종류와 시멘틱 @Component
@Value("설정 값") : 기본 값(초기 값) 설정에 사용
@Component 대신에 좀더 세부적인 의미가 담긴 @Controller, @Service, @Repository을 사용할 수 있다.
spring MVC : Controller // Service // Repository(DAO) 단계를 거친다. 이를 구분하기 위해 컴포넌트 어노테이션을 사용한다.
이후 강의에서는 모든 xml을 제외하고, 순수하게 어노테이션만으로도 사용하도록 config자체를 재설정 할 예정
- 17강 XML Configuration을 Java Configuration으로 변경하기
지금까지 : xml에서 설정한 내용을 어노테이션을 통해 대체하는 과정을 학습했다.
학습한 내용에 따라 xml에 남겨진 코드는 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?> // 인코딩
<beans xmlns="http://www.springframework.org/schema/beans" .. >
<context:component-scan base-package="spring.di.ui" /> // scan 탐색 경로
<bean id ="exam" class="spring.di.entity.NewlecExam" /> // bean 생성
</beans>
xml 파일을 대신할 java 파일(NewlecDIConfig.java) 생성
@ComponentScan("spring.di.ui") // scan 탐색 경로
@Configuration // Java Configuration 설정
public class NewlecAppconfig {
@Bean
public Exam exam() {
return new NewlecExam();
}
※
xml에서 base-package="spring.di.ui", "spring.di.entity" : 2개 이상의 경로를 탐색하고 있을 때 대체
→ @ComponentScan({"spring.di.ui", "spring.di.entity"})와 같이 사용할 나열
bean에서의 id는 @Bean에서의 매서드 명과 일치시켜야 한다.
일반적으로 매서드(함수) 이름은 동사 형태여야 한다. 그러나 @Bean 어노테이션을 달고 있는 경우 함수 명은 IoC 컨테이너에 담겼을 때 이름으로 부여되는 개념으로 생각할 것. 함수명을 가지고 있다고 해서 기능함수로 볼 것이 아니라, return 된 객체가 해당 함수명으로 컨테이너에서 가지고 있다는 것으로 생각하기
위와 같이 java 파일을 생성하면 program.java에서 어노테이션을 기준으로 ApplicationContext를 사용할 수 있다.
ApplicationContext context = new AnnotationConfigApplicationContext(NewlecAppConfig.class);
NewlecAppCongif 파일에서 class를 기준으로 탐색
register를 통해 여러 개의 java파일을 탐색하도록 설정할 수도 있다.
context.register(AppConfig.class, OtherConfig.class, ...)
※ 이전 내용 참고
Applicationcontext 종류
1) ClassPathXmlApplicationContext
2) FileSystemXmlApplicationContext
3) XmlWebApplicationContext
4) AnnotationConfigApplicationContext
'Spring' 카테고리의 다른 글
[Spring] 뉴렉처 AOP 강의 필기 (0) | 2022.06.21 |
---|---|
[Spring] 스프링 vs 스프링 부트 (0) | 2022.05.03 |