반응형
특징
- 경량 컨테이너로서 자바 객체를 직접 관리. 객체 생성, 소멸 같은 생명주기 관리. 스프링으로부터 필요한 객체 얻어옴.
- IOC(Inversion of Control)
제어권의 역전. 제어권이 스프링 프레임워크에 있음. 개발자가 제어권을 가지지 않음. - DI(Dependency Injection)
의존성 주입. 계층이나 서비스 간에 의존성이 존재할 경우 스프링 프레임워크가 서로 연결 - AOP(Aspect-Oriented Programming)
관점지향 프로그래밍. 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 사용. - POJO(Plain Old Java Object)
다른 클래스를 상속받아 만들 필요 없는 자바 클래스 - 영속성과 관련된 다양한 서비스 지원
iBatis, Hibernate등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스 제공 - 확장성이 높음
설정파일
- 부트가 아닌 일반spring 설정은 아래와 같다
- servlet-context.xml에서 viewresolver, resources경로, base-package설정 관리
- root-context.xml에서 component-scan, db설정과 같은 application.config설정을 관리
- web.xml에서 위 2가지 경로와, 필터들, servlet 패턴을 설정
IoC
- Spring IoC Contaner : IOC기능을 제공하는 컨테이너. Bean들을 담고있음 Bean 정의를 읽어들이고, Bean을 구성하고 제공.(Bean을 만들어주고, 엮어주고, 제공해줌)
- BeanFactory : Bean의 생성과 설정, 관리를 맡고있음
- Bean : 컨테이너 안에 들어있는 객체들. 컨테이너에 담겨있기 때문에, 사용하려면, 컨테이너에서 가져와야한다.(Bean끼리만 주입가능)
- Bean의 Scope : default로 싱글톤, 프로토타입으로 매번 다른객체 생성가능
- application.xml에서 빈 등록 -> ApplicationContext에서 설정파일 추가
-> @Configuration + @ComponentScan("basePackageClasses")+ @Bean으로 리턴객체 Bean으로 추가 - @Autowired 중복된 이름의 빈을 사용시 -> @Primary, @Qualifer, @Resource(리스트)로 처리
-> Field Injection 보다는 Constructor Injection을 권장하는데 그 이유- Field에 instance를 생성해야하기 때문에 final/immutable로 필드를 정의할 수가 없다
- DI Container와 강한 결합이 생긴다. 즉, 외부에서 사용하려면 DI Container를 이용해야 한다.
(단위 테스트에도 영향) - Interface(constructors or setter)에 의해 의존성을 명확하게 나타내지 않아 외부에서 의존성이 보이지 않는다
- 순환 의존성(두 클래스가 서로 참조)의 경우 Field Injection은 Compile time에 에러를 발견하지 못한다.Constructor Injection은 BeanCurrentlyCreationExeption 발생
Profile(EnvironmentCapable) & Property & Message
-> Boot에서 편하게 설정할 수 있다.
ApplicationEventPublisher
이벤트 기반의 프로그래밍을 할 때 유용한 인터페이스
이벤트 클래스가 있다면 아래와 같이 핸들러실행 (순서와 비동기에 주의하여 사용하자)
@Component
public class MyEventHandler {
@EventListener
public void print(MyEvent event){
event.getData();
}
}
ResourceLoader
ResourceLoader를 주입받아 프로젝트내(/resource 아래의) 리소스를 읽어올 수 있다. (이후에 validation 체크 필요)
Validation
Boot의 어노테이션으로 쉽게하자
@NotEmpty, @Email 등
데이터 바인딩(비추)
PropertyEditorSupport를 상속받은 클래스 + 컨트롤러에 아래와 같이 사용하면
request값을 dto로 바인딩하여 받을 수 있다.
@InitBiner
public void init(WebDataBinder webDataBinder) {
webDataBinder.registerCustomEditor(바인딩클래스, new PropertyEditorSupport);
}
Converter(추천)
String <-> object 이외에도 Thread safe하게 변환가능
- Converter<source, target> 을 구현
public static class StringToEventConverter implements Converter<String, Event> {
@Override
public Event convert(String s) {
return new Event(Integer.parseInt(s));
}
}
- 설정 추가
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry formatterRegistry) {
formatterRegistry.addConverter(new StringToEventConverter());
}
}
- 사용
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){ // @PathVariable로 Event를 도메인으로 받음
System.out.println(event);
return event.getId().toString();
}
Formatter(강추)
- Formatter 구현
public class EventFormatter implements Formatter<Event> {
@Override // 문자를 받아서 객체로(Locale 정보를 기반으로)
public Event parse(String s, Locale locale) throws ParseException {
return new Event(Integer.parseInt(s));
}
@Override // 객체를 받아서 문자로(Locale 정보를 기반으로)
public String print(Event event, Locale locale) {
return event.getId().toString();
}
}
- 설정추가
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry formatterRegistry) {
formatterRegistry.addFormatter(new EventFormatter());
}
}
- 적용 (위와 동일)
SpEL
- #{"표현식"}
- ${"properties"}
- #{${}} 가능
AOP
적용법 : 만약 Class A에 Perf라는 메서드가 있고, Hello라는 Aspect가 있고, Class A의 Perf메서드가 실행 되기 전에 항상 Hello를 출력해야한다고 가정한다.
- 컴파일 타임자바 파일을 클래스파일로 만들 때, 바이트 코드들을 조작하여, 조작된 바이트 코드들을 생성
- 즉, A.java 파일이 A.class로 변환될 때, A.class 파일에 Hello를 출력하는 메서드가 포함되어 있어야한다.
- AspectJ가 사용
- 로드 타임
AspectJ가 사용즉, A의 바이트코드는 변함이 없지만, 로딩하는 JVM 메모리 상에서는 Perf라는 메서드 전에 Hello를 출력하는 메서드가 같이 포함된 상태로 로딩 - A.java는 순수하게 A.class로 컴파일 되었지만, A.class를 로딩하는 시점에 Hello를 출력하는 메서드를 끼워넣는 방법
- 런타임
스프링 AOP가 사용하는 방법이다. - A라는 Bean(Class A를 뜻함)을 만들 때(spring 어플리케이션에서 Bean을 만드는 과정은 런타임이다.), A라는 타입의 프록시 Bean을 만든다.
이 프록시 Bean이 실제 A가 가지고 있는 Perf라는 메서드를 호출하기 직전에 Hello를 출력하는 일을 하고, 그 다음에 A를 호출한다.
Null-Safety
- @NonNull
- @Nullable
- Intellij로 전체 설정가능
컴파일(javac) -> .java를 .class로 컴파일
JVM - .class파일을 바이트코드로 변환(인터프리터, JIT 사용)
JRE - 자바를 실행할 수 있는 환경
JDK - JRE + 개발 툴
GC - 현재 클래스가 접근가능하다면 유지 아니면 버리기,new-gen / old-gen
728x90
반응형
'스프링' 카테고리의 다른 글
스프링 핵심 원리 - (3) (0) | 2022.08.03 |
---|---|
스프링 핵심 원리 - (2) (0) | 2021.09.10 |
스프링 핵심 원리 - (1) (0) | 2021.09.10 |
필터 / 인터셉터 / AOP (0) | 2021.06.28 |
Logback (0) | 2021.05.25 |
댓글