Spring

[Spring] 뉴렉처 스프링 프레임워크 강의 필기

728x90
반응형

- 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