▶ 오늘 계획
=> 공부 관련
1) 수업 내용 복습
2) 스프링 PSA 수강
3) 인텔리제이 개발 환경 세팅
4) 중급 강의 결제 및 1,2강? 수강
▶ 문제 정리
1. 빈 등록 문제
> 로그대로 에너테이션으로 빈 등록
2. 컴포넌트 스캔에서 다른 패키지의 클래스를 빈으로 등록 문제
@SpringBootApplication
public class Demospring51Application {
@Autowired
MyService myService;
public static void main(String[] args) {
var app = new SpringApplication(Demospring51Application.class);
app.addInitializers((ApplicationContextInitializer<GenericApplicationContext>) ctx -> ctx.registerBean(MyService.class));
app.run(args);
}
}
> 펑셔널 인터페이스를 구현한 람다로 빈 등록 가능.
3. 기본... 콘솔 출력 문제
> Component 에너테이션 추가로 해결..^^;;
▶ 개인 공부
IoC 컨테이너
스프링 IoC 컨테이너와 빈
Inversion of Control: 의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법을 말 함.
스프링 IoC 컨테이너
● BeanFactory
● 애플리케이션 컴포넌트의 중앙 저장소.
● 빈 설정 소스로 부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다.
빈
● 스프링 IoC 컨테이너가 관리 하는 객체.
● 장점
○ 의존성 관리
○ 스코프 ■ 싱글톤: 하나 ■ 프로포토타입: 매번 다른 객체
○ 라이프사이클 인터페이스
ApplicationContext
● BeanFactory
● 메시지 소스 처리 기능 (i18n)
● 이벤트 발행 기능
● 리소스 로딩 기능
ApplicationContext와 다양한 빈 설정 방법
스프링 IoC 컨테이너의 역할
● 빈 인스턴스 생성
● 의존 관계 설정
● 빈 제공
AppcliationContext
● ClassPathXmlApplicationContext (XML)
● AnnotationConfigApplicationContext (Java)
빈 설정
● 빈 명세서
● 빈에 대한 정의를 담고 있다.
○ 이름 ○ 클래스 ○ 스코프 ○ 생성자 아규먼트 (constructor) ○ 프로퍼트 (setter) ○ ..
컴포넌트 스캔
● 설정 방법
○ XML 설정에서는 context:component-scan ○ 자바 설정에서 @ComponentScan
● 특정 패키지 이하의 모든 클래스 중에 @Component 애노테이션을 사용한 클래스를 빈으로 자동으로 등록 해 줌.
@Autowire
필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.
@Autowired
● required: 기본값은 true (따라서 못 찾으면 애플리케이션 구동 실패)
사용할 수 있는 위치
● 생성자 (스프링 4.3 부터는 생략 가능) ● 세터 ● 필드
경우의 수
● 해당 타입의 빈이 없는 경우
● 해당 타입의 빈이 한 개인 경우
● 해당 타입의 빈이 여러 개인 경우
○ 빈 이름으로 시도,
■ 같은 이름의 빈 찾으면 해당 빈 사용 ■ 같은 이름 못 찾으면 실패
같은 타입의 빈이 여러개 일 때
● @Primary
● 해당 타입의 빈 모두 주입 받기
● @Qualifier (빈 이름으로 주입)
동작 원리
● 빈 라이프 사이클
● BeanPostProcessor
○ 새로 만든 빈 인스턴스를 수정할 수 있는 라이프 사이클 인터페이스
● AutowiredAnnotationBeanPostProcessor extends BeanPostProcessor
○ 스프링이 제공하는 @Autowired와 @Value 애노테이션 그리고 JSR-330의 @Inject 애노테이션을 지원하는 애노테이션 처리기.
@Component와 컴포넌트 스캔
컨포넌트 스캔 주요 기능
● 스캔 위치 설정
● 필터: 어떤 애노테이션을 스캔 할지 또는 하지 않을지
@Component ● @Repository ● @Service ● @Controller ● @Configuration
동작 원리
● @ComponentScan은 스캔할 패키지와 애노테이션에 대한 정보
● 실제 스캐닝은 ConfigurationClassPostProcessor라는 BeanFactoryPostProcessor에 의해 처리 됨.
펑션을 사용한 빈 등록
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(Demospring51Application.class)
.initializers((ApplicationContextInitializer<GenericApplicationContext>)
applicationContext -> {
applicationContext.registerBean(MyBean.class);
})
.run(args);
}
빈의 스코프
스코프
● 싱글톤
● 프로토타입
○ Request ○ Session ○ WebSocket ○ ...
프로토타입 빈이 싱글톤 빈을 참조하면?
● 아무 문제 없음.
싱글톤 빈이 프로토타입 빈을 참조하면?
● 프로토타입 빈이 업데이트가 안되네?
● 업데이트 하려면
○ scoped-proxy ○ Object-Provider ○ Provider (표준)
프록시 (https://en.wikipedia.org/wiki/Proxy_pattern)
⇒ 프록시를 통해 감싸준다. 변경사항이 생길 경우 수월해짐
⇒ 프록시도 기존 클래스를 상속받기 때문에 상위클래스타입과 같다. (주입 가능)
싱글톤 객체 사용시 주의할 점
● 프로퍼티가 공유.
● ApplicationContext 초기 구동시 인스턴스 생성
▶ 수업 내용
Spring MVC
Annotation
@ModelAttribute
- 뷰페이지(JSP)에서 사용하기 위한 속성값(객체)을 제공하는 어노테이션
- => @ModelAttribute 어노테이션은 메소드와 매개변수에 선언 가능
- @ModelAttribute 어노테이션을 매개변수에 선언하면 매개변수에 저장된 값을 요청 처리
- 메소드의 뷰페이지에게 속성값으로 제공 - 매개변수에 저장된 전달값을 뷰페이지에게 제공
- => 매개변수의 이름과 전달값의 이름이 같지 않아도 400 에러 미발생
- => 매개변수의 자료형이 기본형(Wrapper 클래스)이나 String 클래스인 경우 반드시 value 속성을 설정
- value 속성 : 뷰페이지에 제공하기 위한 속성명을 속성값으로 설정
- => 다른 속성이 없는 경우 속성값만 설정 가능
@SessionAttributes
- Model 객체를 이용하여 요청 처리 메서드의 뷰페이지에게만 제공하지 않고 속성값(객체)을 Controller 클래스의 모든 요청 처리 메서드와 뷰페이지에게 제공하는 어노테이션
- ⇒ Model 객체를 이용하여 저장된 속성값이 Request Scope가 아닌 제한적인 Session Scope 역할
- ⇒ 변경 처리 시 다른 요청 처리 메서드에서 필요한 정보를 전달하거나 검색하는 작업을 생략하기 위해 사용
- value 속성 : 제한적인 Session Scope로 처리되기 위한 속성명을 속성값으로 설정
- ⇒ 다른 속성이 없는 경우 속성값만 설정 가능
JavaBean 클래스
- 웹프로그램 요청 시 전달된 값을 저장하기 위한 클래스
- ⇒ DAO 클래스에서 사용할 경우 DTO 클래스의 기능 수행
- 전달값의 이름과 같은 이름의 필드를 선언하면 전달값이 필드에 자동으로 저장되도록 제공 (Front Controller 가 해줌)
Controller 클래스
요청 처리 메서드의 매개변수 자료형을 Javabean클래스(DTO 클래스)로 선언하면 FrontController가 JavaBean 객체 (Command 객체)를 생성하여 전달값을 필드에 저장하여 제공함
Command 객체
- 전달값이 필드에 저장된 객체로 요청처리 메서드의 뷰페이지에서 사용되어
- ⇒ 전달값은 같은 이름의 필드에 저장
- ⇒ 뷰페이지에서 사용되도록 @ModelAttribute 어노테이션을 사용하여 선언
- → 생략 가능함 자동 처리 됨
- value 속성으로 뷰페이지에 제공되는 속성명을 설정할 수 있지만 vaue 속성이 생략된 경우 클래스명을 속성명으로 자동 설정 - 첫문자는 소문자로 변환
요청 처리 메서드의 매개변수를 HttpSession 자료형으로 선언하면 Front Controller에 의해 바인딩된 세션을 매개변수에 전달하여 제공
Session Scope
- 동일한 세션을 사용하는 모든 요청 처리 메서드와 뷰페이지에서 속성값으로 사용
Model.addAttribute(Object attributeValue)
- 뷰페이지에게 속성값을 제공하는 메서드
- ⇒ 속성명이 생략된 경우 속성값(깩체)의 클래스명을 속성명으로 자동 설정 - 첫문자 소문자
- ⇒ 속성값의 자료형이 기본형(Wrapper)이거나 String 클래스인 경우 호출 불가
SessionStatus
- @SessionAttributes 어노테이션에 의해 제공된 속성값(객체)의 상태정보를 저장하는 객체
- SessionStatussetComplete() : @SessionAttributes 어노테이션에 의해 제한적인 Session Scope로 제공된 객체를 Request Scope로 제공된 객체로 처리되도록 변경하는 메서드
리소스 파일
- JSP 문서에서 사용하는 멀티미디어 파일, CSS, JS 등등
- 문제점 ) HTML 태그로 리소스 파일을 요청할 경우 리소스 파일도 Front Controller에게 요청되므로 매핑된 요청 처리 메서드가 없어 404 에러 코드 발생
- 해결법 ) HTML 태그로 리소스 파일을 요청할 경우 Front Controller를 이용하지 않고 직접 응답되도록 처리
- ⇒ Front Controller의 Bean Configuration File(Servlet - context.xml)에서 resources 엘리먼트를 사용하여 직접 응답되도록 설정
- 클라이언트 요청에 대해 Front Controller를 사용하지 않고 직접 응답되도록 설정하는 엘리먼트
- ⇒ 리소스 파일을 클라이언트에게 직접 제공하기 위해 사용
- mapping 속성 : 리소스 파일을 요청할 수 있는 URL 주소의 패턴을 속성값으로 설정
- ⇒ [**] 기호를 속성값으로 사용한 경우 하위 폴더를 포함한 모든 리소스 파일에 대한 URL 주소를 표현
- location 속성 : 리소스 파일이 저장된 폴더 경로를 속성값으로 설정
- SpringMVC에서는 클라이언트의 모든 요청을 Front Controller에 의해 처리
'레거시' 카테고리의 다른 글
2022.03.18~03.20의 기록 (2) | 2022.03.19 |
---|---|
2022.03.17의 기록 (2) | 2022.03.17 |
2022.03.15의 기록 (0) | 2022.03.15 |
2022.03.14의 기록 (0) | 2022.03.14 |
2022.03.11~03.13의 기록 (2) | 2022.03.12 |