본문 바로가기
레거시

2022.03.16의 기록

by GroovyArea 2022. 3. 16.

 오늘 계획

=>  공부 관련

1) 수업 내용 복습

2) 스프링 PSA 수강

3) 인텔리제이 개발 환경 세팅

4) 중급 강의 결제 및 1,2강? 수강

이번주 안에 다 본다.


 문제 정리

1. 빈 등록 문제

service, repository 클래스를 만들어 메인 메서드 실행 시 에러 로그

> 로그대로 에너테이션으로 빈 등록

에너테이션으로 빈 등록

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 엘리먼트를 사용하여 직접 응답되도록 설정
    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